JPA Batch Insert 복습 Batch Insert 지원하는 경우 @GeneratedValue(strategy = GenerationType.Sequence) @GeneratedValue(strategy = GenerationType.TABLE) @GeneratedValue 애노테이션을 설정하지 않고, 직접 ID 생성하는 경우 Batch Insert 지원하지 않는 경우 @GeneratedValue(strategy = GenerationType.IDENTITY) 테스트 환경 설정 spring.datasource.url 에 rewriteBatchedStatements=true 추가 spring.jpa.properties.jdbc.batch_size=50 설정 spring.jpa.properties.o..
개인 프로젝트로 SNS 피드 서비스를 개발하면서 팬아웃(포스팅 전송) 기능의 성능을 높이고자 Kotlin의 Coroutine 및 Dispatcher.IO 워커 스레드를 사용하다가 성능 테스트를 통해 OutOfMemoryException을 발견하게 되었고, 이를 해결하고 처리 성능을 높인 경험을 소개하려고 한다. 문제의 발단 일단 팬아웃(포스팅 전송) 기능은 내가 SNS 게시물을 올리면, 나를 팔로우하는 사람에게 피드를 전송하는 기능이다. 그래서 팔로워들은 자신의 피드에서 나의 게시물을 볼 수 있다. 그리고 아키텍처는 다음과 같이 설계했다. Server에서 Kafka로 Feed 이벤트를 발행할 때, 아래와 같은 로직으로 구현을 했다. 우선 execute 메서드 안에서는 CoroutineScope(Dispa..
예전에 Spring DispatcherServlet에서 시작해서 Controller까지 요청이 전달되는 글을 간단히 작성한 적이 있었고, 이를 통해서 Spring 서버에 요청이 들어오면 어떻게 처리되는지 이해할 수 있었다. (https://hyos-dev-log.tistory.com/21) 그러던 중 최근에 DispatcherServlet까지 요청이 어떻게 도달하는지에 대해 궁금증이 생겨 Socket부터 Spring DispatcherServlet까지의 요청 과정을 정리해봤다. 가장 먼저 Socket 통신 과정을 살펴보자 클라이언트 - 서버 프로그램이 실행되면, 커널 영역에서는 통신을 위한 Socket을 생성하는데, 아래와 같은 과정을 거치게 된다. 여기서 서버 프로그램의 과정을 확인해보면 Socket ..