String, StringBuilder, StringBuffer 성능 비교
·
책/자바 성능 튜닝이야기
JSCODE 자바스터디 2주차 공부 중 실습 String, StringBuilder, StringBuffer지난번정리https://bocho-developer.tistory.com/16  String은 불변클래스로 문자열 연산 시 기존 문자열을 수정하는 것이 아니라 새로운 인스턴스를 생성하여 힙 영역에 저장된다.이런 작업이 반복 수행되면서 메모리를 많이 사용하게 되고 응답 속도에도 많은 영향을 끼치게 된다. StringBuilder는 동기화 되어있지 않아 싱글스레드 환경에서 사용StringBuffer는 메소드 내부에 synchronized 키워드 설정이 되어있어 멀티스레드 환경에서 안전하다.  성능 테스트  private static void stringTest() { long startTi..
중고차를 알아보다 작성하는 조회 성능 개선기 (Redis 캐싱)
·
이슈
중고차의 늪최근 중고차에 관심이가 벤츠 인증 중고차 사이트를 자주 들락날락했다.문제는 사이트에서 차량 조회하면 약 2초 이상 소요되어 이쁜 자동차들을 빠르게 구경하지 못해 고통받았다.답답해서 사이트를 금방 탈주하게 되었고 개선이 필요해 보였다.  그에 비해 엔카는 86.55ms로 아주 훌륭한 조회 성능을 보여준다. 덕분에 엔카에 한번 접속하면 2시간은 순삭이다. 최적의 조회 성능으로 헤어나지 못하게 만든다.  이처럼 조회 성능은 매우중요하다. 2초 아니 1초만 소요되도 느리다고 생각해 사용자에게 좋지 않은 경험을 만들어준다.  조회 성능 개선 고민지난 프로젝트에서 100만건의 상품데이터를 관리하며 발생되는 문제 중 상품 검색 조회 같은 경우 Elasticsearch를 적용하여 성능 개선하였고 단건 조회에..
EXPLAIN 발표
·
DB
스파르타 단기심화반에서 전체 발표 할 수 있는 기회가 생겼다.인생은 도전이고 드디어 때가 왔다.. 기회 생기면 다 해보자라는 마음으로 사는중이라 내심 좋았다. 나는 EXPLAIN에 대해서 준비하며 전 회사에서 겪었던 성능 개선 과정에 대해 문제점들을 있다 생각했고 발표를 통해 공유하고 싶었다.EXPLAIN 키워드를 알고 있다면 문제해결 방법에서 느낌이 아닌 데이터로 판단하는 개발을 할 수 있을 거라 생각한다.그래서 많은 내용보다는 발표를 보는 사람들이 이 키워드에 대해서 인식할 수 있다면 반은 성공이다.. 라는 마음으로 발표 자료를 준비했다 발표 자료 및 영상발표자료는 노션으로 준비했다. 내용을 정리하며 편리했지만 이번에 발표해보니 PPT로 준비하는게 집중하기 더 좋을거 같다. https://dorian..
상품 재고 관리 - 비관적 락 vs 분산 락 적용 사례
·
이슈
재고 차감 동시성 문제 문제 상황🚨 주문-상품 서비스간 2PC 방식 구현 중 동일 상품에 대한 동시 주문 발생 시 재고 수량 데이터 불일치 문제 발견  JMeter 테스트 상품 재고 100개, 200번의 동시 요청테스트 요청 수 - 200건성공 응답 수 - 200건오류율 - 0%평균 처리 시간 - 167.8/sec  모든 요청을 성공으로 응답했으나 데이터베이스의 실제 데이터와 불일치가 발생재고 차감 이력 테이블 : 200건 기록실제 상품 재고: 79개 (21개 차감) 해결 방안 고민❓분산락 적용 안한 이유분산락은 전체 프로세스에 락을 걸어 동시성을 제어상품 재고 차감은 DB에 단일 리소스 업데이트 하는 과정으로 전체 프로세스에 락을 걸 필요X여러 DB서버가 존재하는게 아니고 현재 단일 DB서버 사용중지..
RDB vs Elasticsearch 검색 성능 비교
·
이슈
상품 조회 시 트래픽 증가로 성능 저하문제가 발생했다.상품데이터는 100만건, 상품 검색 조회 시 JPA QueryDsl을 사용하여 검색 조회를 하였고 소요시간은 꽤나 걸렸다. 1. RDB 상품 검색 목록 조회 평균 응답시간  RDB 정상 범위 데이터 4건의 평균 소요 시간2897 + 2639 + 2663 + 2624  = 10823평균 소요 시간10,823 ÷ 4건 약 2.7초 1.1 Full-Text Index 적용Full-Text Index를 적용하고 기존 Like 문을 변경했다.WHERE P.NAME LIKE '%니트%'WHERE MATCH(P.NAME) AGAINST ('니트'); EXPLAIN ANALYZE를 실행해보니 예상대로 Full-text index가 성공적으로 적용되어 소요시간..
24년 회고
·
카테고리 없음
취업 그리고 퇴사24년 1월부터 다니던 회사를 8월말에 퇴사하였다. 입사 후 얼마 지나지 않아 선임 개발자들의 퇴사로 인해 입사 동기와 둘이서 백엔드 업무를 진행하게 되는데 그때부터 뭔가 잘못돼감을 느꼈다. 그때 당시에는 '기회다 오히려 좋아. 이참에 나의 기술적 역량을 높이며 실무에 적용해 보자' 라는 부푼 마음을 가지고 임했다. 생각했던 것보다 작은 서비스라도 신입 둘이서 운영하기에 많은 어려움이 있었고 개인의 기술 역량, 문제 해결능력의 중요성을 느꼈다. 어느정도 시간이 지났고 회사에서 원하는 더 이상의 기능개발은 없었다.  그 후 월급이 들어오지 않았고 며칠 뒤 회사 경영난으로 인해 권고사직을 권유하는 메일을 받았다. 이때 당시에는 막막함도 있었지만 '드디어 각잡고 공부할 때가 왔다. 초심으로 돌..
try-with-resources
·
책/이펙티브 자바
try-finally 문제점package exam;public class TryFinally { public static void main(String[] args) throws Exception { TestResource testResource = new TestResource(); try { testResource.firstMethod(); } finally { testResource.close(); } } static class TestResource implements AutoCloseable { public void firstMethod() { System.o..
Kafka, Redis를 활용한 이벤트 중복 처리 방지
·
이슈
2차 팀프로젝트 회고주문 서비스와 배송 서비스 간 Kafka 사용네트워크 지연, 시스템 장애 등으로 인한 메시지 중복 전송이나 순서 보장 문제가 발생할 수 있는 문제에 대한 고민 구성- 메시지 큐: Kafka- 중복 처리 방지: Redis- 이벤트 타입: OrderCreateEvent (주문 생성 이벤트)1. 이벤트 중복 처리 방지@KafkaListener( topics = "${spring.kafka.consumer.topic.order.create}", // OrderCreateEvent groupId = "${spring.kafka.consumer.group-id}", // group-delivery containerFactory = "or..