DBCP 를 사용할 때 다양한 설정 값들이 있다.설정 값을 어떻게 정하는지에 대한 간단한 가이드를 포스팅 해보겠다.설명은 HikariCP 옵션으로 진행하겠다. maximumPoolSizePool 이 제공할 수 있는 최대 커넥션 갯수이다. (idle + in-use) maximumPoolSize 설정 값을 정하기 위해서는..한 커넥션당 쿼리 실행 시간, 목표로하는 TPS 가 필요하다. 최대 TPS = 1 커넥션 당 초당 요청 처리 개수 * 동시 커넥션 개수위는 TPS 의 계산식이다.여기서 우리는 동시 커넥션 개수 (maximumPoolSize) 를 구할 것이다. 최대 TPS 는 목표로하는 TPS 이므로 알고 있는 값이다.1 커넥션 당 초당 요청 처리 개수는 1초를 1 커넥션당 쿼리 실행 시간으로 나눈 값이..
@Transactional 을 Test code 에서 사용할 때, 개발자 간에 논란이 좀 있다.. 개발자들의 생각을 알아보자.. 향로님 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 https://jojoldu.tistory.com/761 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 얼마 전에 2개의 핫한 컨텐츠가 공유되었다. 존경하는 재민님의 유튜브 - 테스트에서 @Transactional 을 사용해야 할까? 존경하는 토비님의 페이스북 2개의 컨텐츠에서 테스트 데이터 초기화에 @Transa jojoldu.tistory.com 토비님 테스트가 관리하는 트랜잭션 - 향로 님의 @Transactional 글을 읽고 https://toby.epril...
오늘 포스팅으로는Database Connection Pool (DBCP) 에 대해 정리해보겠다. 배경Application 과 Database 간의 통신은 TCP 기반으로 통신한다.따라서, 본격적으로 데이터를 주고 받기 이전에 연결을 하는 과정을 거친다. (TCP 연결 지향 특성)-> 3 way-handshaking또한, 데이터를 주고 받은 다음 연결을 끊어주는 과정도 거친다. (TCP 연결 지향 특성)-> 4 way-handshaking 실제 데이터를 주고 받기 전 후로 연결을 맺고 끊는 과정이 시간이 오래 걸리므로Backend API 응답 시간에 영향을 주게 되며이는 처리량에 영향을 주게된다 또한, Database Connection 개수의 제한을 두지 않으면 DB 과부하 상태가 될 수 있다. DBCP..
이전 포스팅에서 Netty 서버를 구동하기 위해 .. Spring 은 project reactor 의 Netty, Reactor Netty 를 의존하고 Reactor Netty 의 HttpServer 를 생성하기 위해 HttpServer 에는 HttpServer::handler 메서드가 있는데 Spring 에서는 HttpServer::handler 의 파라미터(함수형 인터페이스)에 사용할 구현체를 ReactorHttpHandlerAdapter 로 만들어 놨다. 그리고.. Spring 의 ReactorHttpHandlerAdapter 를 생성하기 위해서는 HttpHandler 를 주입받아야 하는 것을 확인했다. 이번 포스팅에서는 HttpHandler 의 생성과 동작에 대해 다뤄보겠다. HttpHandler..
Spring 이 WebHandler 의 구현체인 DispatcherHandler(front handler) 를 등록하는 과정을 알아보자. spring boot autoconfigure 에서 자동 구성(Auto Configuration) 기능에 의해 동작하는 HttpHandlerAutoConfiguration 이다. 자동 구성 조건에 따라 HttpHandler 를 빈으로 등록하고 있는 것을 알 수 있다. HttpHandlerAutoConfiguration 에서 HttpHandler 를 생성할 때 호출하는 WebHttpHandlerBuilder::applicationContext 메서드 코드의 일부이다. Spring container 에서 WEB_HANDLER_BEAN_NAME("webHandler") 의 ..
WebHandler 에 대해 알아보겠다. WebHandler 는 .. Spring 5 부터 제공하는 web request 를 처리하는데 사용할 수 있는 인터페이스이다. 보통 Spring Reactive stack 에서 사용된다. Project Reactor 의 Reactor 에 의존한다. (Mono) 파라미터로 ServerWebExchange 는.. ServerHttpRequest, ServerHttpResponse 등을 얻을 수 있는 메서드를 제공하는 인터페이스이다. 즉, Servlet stack 의 Servlet, HttpServletRequest, HttpServletResponse 등의 역할과 유사하다고 볼 수 있다.. Spring Webflux 에서는 front handler 로.. WebHan..
N + 1 문제가 일어나는 모든 경우의 수에 대해 알아보고.. 한번 정리를 해보겠다. N + 1 Query problem ? 어떤 엔티티를 조회하기 위해 쿼리(1)를 수행했는데 예상치 못한 쿼리들(N)이 추가로 수행되는 상황을 말한다. 주로 일대다, 다대일 관계에서 발생한다. 이번 포스팅에서 사용할 DB 다이어그램이다. Team 이 여러 Member 를 가지는 관계이다. N + 1 조회 문제가 일어나는 케이스를 살펴보겠다. 글로벌 페치 전략이 즉시 로딩(Eager loading) 인 경우 JPQL 을 이용하여 어떤 엔티티를 조회 할 경우 발생한다. -> 글로벌 페치 전략이 즉시 로딩이지만, 사용자의 쿼리(JPQL) 가 우선이기 때문에 JPQL 을 충실히 수행후, 글로벌 페치 전략에 의해 연관관계에 있는 ..
J2EE 컨테이너 환경의 대표격인 Spring 에서 JPA 를 사용할 경우 알아야할 중요한 개념을 나열해보겠다. 순수하게 J2SE 환경에서 JPA 를 사용하면 개발자가 직접 EntityManager 를 생성해야하며, Transaction 도 관리해야한다. J2EE 환경에서 JPA 를 사용하면 트랜잭션 범위의 영속성 컨텍스트 전략이 기본으로 채택된다. Spring 에서 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략을 따르면, 트랜잭션 AOP 를 활용한다. 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략 해당 전략에서는 트랜잭션을 시작할 때, entityManager 를 생성하고 트랜잭션이 종료 될 때, entityManager 도 닫힌다. 트랜잭션이 같으면 동일한 EntityMana..
Spring/DB, Cache 연동 2024. 5. 1. 18:34
DBCP 를 사용할 때 다양한 설정 값들이 있다.설정 값을 어떻게 정하는지에 대한 간단한 가이드를 포스팅 해보겠다.설명은 HikariCP 옵션으로 진행하겠다. maximumPoolSizePool 이 제공할 수 있는 최대 커넥션 갯수이다. (idle + in-use) maximumPoolSize 설정 값을 정하기 위해서는..한 커넥션당 쿼리 실행 시간, 목표로하는 TPS 가 필요하다. 최대 TPS = 1 커넥션 당 초당 요청 처리 개수 * 동시 커넥션 개수위는 TPS 의 계산식이다.여기서 우리는 동시 커넥션 개수 (maximumPoolSize) 를 구할 것이다. 최대 TPS 는 목표로하는 TPS 이므로 알고 있는 값이다.1 커넥션 당 초당 요청 처리 개수는 1초를 1 커넥션당 쿼리 실행 시간으로 나눈 값이..
Spring/DB, Cache 연동 2024. 4. 22. 22:01
@Transactional 을 Test code 에서 사용할 때, 개발자 간에 논란이 좀 있다.. 개발자들의 생각을 알아보자.. 향로님 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 https://jojoldu.tistory.com/761 테스트 데이터 초기화에 @Transactional 사용하는 것에 대한 생각 얼마 전에 2개의 핫한 컨텐츠가 공유되었다. 존경하는 재민님의 유튜브 - 테스트에서 @Transactional 을 사용해야 할까? 존경하는 토비님의 페이스북 2개의 컨텐츠에서 테스트 데이터 초기화에 @Transa jojoldu.tistory.com 토비님 테스트가 관리하는 트랜잭션 - 향로 님의 @Transactional 글을 읽고 https://toby.epril...
Spring/DB, Cache 연동 2024. 4. 22. 21:21
오늘 포스팅으로는Database Connection Pool (DBCP) 에 대해 정리해보겠다. 배경Application 과 Database 간의 통신은 TCP 기반으로 통신한다.따라서, 본격적으로 데이터를 주고 받기 이전에 연결을 하는 과정을 거친다. (TCP 연결 지향 특성)-> 3 way-handshaking또한, 데이터를 주고 받은 다음 연결을 끊어주는 과정도 거친다. (TCP 연결 지향 특성)-> 4 way-handshaking 실제 데이터를 주고 받기 전 후로 연결을 맺고 끊는 과정이 시간이 오래 걸리므로Backend API 응답 시간에 영향을 주게 되며이는 처리량에 영향을 주게된다 또한, Database Connection 개수의 제한을 두지 않으면 DB 과부하 상태가 될 수 있다. DBCP..
Spring Reactive Stack/Webflux 2024. 3. 15. 00:16
이전 포스팅에서 Netty 서버를 구동하기 위해 .. Spring 은 project reactor 의 Netty, Reactor Netty 를 의존하고 Reactor Netty 의 HttpServer 를 생성하기 위해 HttpServer 에는 HttpServer::handler 메서드가 있는데 Spring 에서는 HttpServer::handler 의 파라미터(함수형 인터페이스)에 사용할 구현체를 ReactorHttpHandlerAdapter 로 만들어 놨다. 그리고.. Spring 의 ReactorHttpHandlerAdapter 를 생성하기 위해서는 HttpHandler 를 주입받아야 하는 것을 확인했다. 이번 포스팅에서는 HttpHandler 의 생성과 동작에 대해 다뤄보겠다. HttpHandler..
Spring Reactive Stack/Webflux 2024. 3. 10. 16:59
Spring 이 WebHandler 의 구현체인 DispatcherHandler(front handler) 를 등록하는 과정을 알아보자. spring boot autoconfigure 에서 자동 구성(Auto Configuration) 기능에 의해 동작하는 HttpHandlerAutoConfiguration 이다. 자동 구성 조건에 따라 HttpHandler 를 빈으로 등록하고 있는 것을 알 수 있다. HttpHandlerAutoConfiguration 에서 HttpHandler 를 생성할 때 호출하는 WebHttpHandlerBuilder::applicationContext 메서드 코드의 일부이다. Spring container 에서 WEB_HANDLER_BEAN_NAME("webHandler") 의 ..
Spring Reactive Stack/Webflux 2024. 3. 9. 00:21
WebHandler 에 대해 알아보겠다. WebHandler 는 .. Spring 5 부터 제공하는 web request 를 처리하는데 사용할 수 있는 인터페이스이다. 보통 Spring Reactive stack 에서 사용된다. Project Reactor 의 Reactor 에 의존한다. (Mono) 파라미터로 ServerWebExchange 는.. ServerHttpRequest, ServerHttpResponse 등을 얻을 수 있는 메서드를 제공하는 인터페이스이다. 즉, Servlet stack 의 Servlet, HttpServletRequest, HttpServletResponse 등의 역할과 유사하다고 볼 수 있다.. Spring Webflux 에서는 front handler 로.. WebHan..
Spring/DB, Cache 연동 2024. 2. 20. 22:18
N + 1 문제가 일어나는 모든 경우의 수에 대해 알아보고.. 한번 정리를 해보겠다. N + 1 Query problem ? 어떤 엔티티를 조회하기 위해 쿼리(1)를 수행했는데 예상치 못한 쿼리들(N)이 추가로 수행되는 상황을 말한다. 주로 일대다, 다대일 관계에서 발생한다. 이번 포스팅에서 사용할 DB 다이어그램이다. Team 이 여러 Member 를 가지는 관계이다. N + 1 조회 문제가 일어나는 케이스를 살펴보겠다. 글로벌 페치 전략이 즉시 로딩(Eager loading) 인 경우 JPQL 을 이용하여 어떤 엔티티를 조회 할 경우 발생한다. -> 글로벌 페치 전략이 즉시 로딩이지만, 사용자의 쿼리(JPQL) 가 우선이기 때문에 JPQL 을 충실히 수행후, 글로벌 페치 전략에 의해 연관관계에 있는 ..
Spring/DB, Cache 연동 2024. 2. 14. 22:24
J2EE 컨테이너 환경의 대표격인 Spring 에서 JPA 를 사용할 경우 알아야할 중요한 개념을 나열해보겠다. 순수하게 J2SE 환경에서 JPA 를 사용하면 개발자가 직접 EntityManager 를 생성해야하며, Transaction 도 관리해야한다. J2EE 환경에서 JPA 를 사용하면 트랜잭션 범위의 영속성 컨텍스트 전략이 기본으로 채택된다. Spring 에서 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략을 따르면, 트랜잭션 AOP 를 활용한다. 트랜잭션 범위와 영속성 컨텍스트 생존 범위가 동일한 전략 해당 전략에서는 트랜잭션을 시작할 때, entityManager 를 생성하고 트랜잭션이 종료 될 때, entityManager 도 닫힌다. 트랜잭션이 같으면 동일한 EntityMana..