-
Spring에서 db connection 자원을 극도로 효율적으로 쓰기Stack/Jpa 2023. 1. 2. 04:43
개요
Spring 에서 db 커넥션풀을 어떻게 관리해야 하는가?
결론은 트랜잭션의 범위를 최소화 하는것이다.
그 이유는 db커넥션풀의 자원유한성 때문이다.
요약
그럼 도대체 어떤 디자인패턴을 써야 이 db 커넥션 풀을 아낄 수 있을까?
Spring 개발자라면, 절대로 도메인 모델 패턴을 써서는 안된다.
설계부터 Transaction-Script-pattern으로 설계 해야 한다.
그 이후에, Open-Session-In-View 옵션을 해제 해주면 db자원을 극도로 아끼는 설계가 가능하다.
Transaction-Script-pattern이란?
엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을 트랜잭션 스크립트 패턴이라 한다. 쉽게 말해 Domain부분이 아닌 Service 부분에서 비즈니스 로직을 이용해 개발을 진행하는 것을 얘기한다.

출처:https://martinfowler.com/eaaCatalog/transactionScript.html
OSIV(open-session-in-view)란?
Spring controller에서 db 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하기 위한 전략 패턴. 영속성 컨텍스트의 연장을 의미하기도 한다.

OSIV전략은 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있다. 이것은 결국 장애로 이어진다. 예를 들어서 컨트롤러에서 외부 API를 호출하면 외부 API 대기 시간 만큼 커넥션 리소스를 반환하지 못하고, 유지해야 한다
왜 Spring framework는 OSIV옵션이 자동으로 켜져있을까?
어플리케이션 개발의 확장과 유연성을 위해 default로 켜져있다.
그러나, 적확하게 개발한다면 OSIV는 확실히 끄는것이 압도적으로 성능면에서 앞선다.
여기서 말하는 적확하게 개발한다는 것은, transaction의 범위가 controller가 아닌 명확히 service단에서만 지속되도록 설계를 하는것이다. 이것이 바로 위에서 말한 Transaction-Script-pattern이 되는 것이다.
그렇기에 Command와 Query를 항상 명확히 구분하는 형태로 개발하는것이 중요하다
끄는방법
application.properties에
spring.jpa.open-in-view: false
추가
'Stack > Jpa' 카테고리의 다른 글
[JPA] 본인 ENTITY와 연관관계를 맺고 싶을때 (0) 2023.05.01 JPA의 대체제는 무엇이 있을까 (1) 2023.01.15 Querydsl like, contains 차이 (0) 2022.12.28 플러시 flush (0) 2022.11.22 entitiymaneger(영속성 컨텍스트) (0) 2022.11.22