-
JPA 주의점 (1) - OSIV false 설정 (open-in-view)Spring Boot/JPA 2024. 4. 19. 23:25
웹 서비스 성능에 중요한 지표로 "처리량"과 "응답시간"이 있다.
처리량 (throughput) - https://www.youtube.com/watch?v=JJJ4LReZ5q4
- 서버에서 들어온 요청이 처리되는시간을 말한다.
- db connection 획득 시간
- db statement 전송 및 쓰기 시간
- 요청 받은 statement 처리 시간
- db clent에게 result set 반환하는데 걸리는 시간
- db connection을 반환하고 Transaction이 idle되는 시간
- 처리량을 숫자로 표현할때 TPS (Transaction Per Second)를 사용한다.
- TPS = transaction count / time
- 초당 몇개의 클라이언트 요청 처리할 수 있는지 지표
응답 시간 (response time)
- 아래의 총합 시간이다.
- 서버에서 요청을 처리하는 시간: 처리시간(processing time)
- 클라-서버 교환 시간 : 대기시간(Latency Time)
응답시간이 높아야 웹 서비스 성능이 좋고,
응답시간이 높으려면 TPS가 높아야한다.TPS를 높이려면 초당 처리할 수 있어야하는 트랙잭션이 많아야한다.
짧은 Transaction이 관건이다. (TPS를 늘리는 방법으로 서버 수를 늘리거나, Connection pool, Thread pool을 높이는 방법도 있으나 가장 기본은 짧은 Transaction이다. )
이 짧은 Transcation과 관련된 JPA에 중요 설정으로 OSIV 설정이 있다.
OSIV (Open Session in View)
초반 JPA 설정중 설정해야할 것
- JPA 사용시 OSIV(Open Session In View) 설정 정보를 false로 사용하는 것이 좋다.
- 설정하지 않으면 default true로 동작한다.
spring.jpa.open-in-view: false
- 이 값이 true라면 트랜젝션 범위 밖의 view에서도 EntityManager가 요청 프로세스 내내 open 되어 있다.
- 예를 들어 3초 이상 걸리는 API를 사용하면 3초 동안 DB 커넥션 반납 안함
- 유저 API Response를 보낼때 Transaction 반환
- DB 커넥션을 Transaction 시작 시점에 획득 (@Transactional)
- 즉, DB 커넥션을 @Transactional이 아니라 API 요청 ~ 응답까지 가지고 있겠다는 설정 - api 속도 만큼 커넥션 획득 후 반납.
- false로 사용하게 되면 DB 커넥션을 트랜잭션 끝나면 바로 반환.
- 커넥션 리소스 낭비하지 않음. 따라서 성능상 잠재 문제가 없음.
- 지연로딩을 Service 트랜젝션 안에서 끝내야함, 불편함 발생
- Service단에서 fetch join 같은 기술로 지연로딩 강제 호출해야함
- 즉 OSIV 설정을 true로 쓰면 Lazy Loading 객체를 어디에서든 사용할 수 있는 편의도 있다.
- 어드민을 Template 같은걸 사용해 개발했다면 true로 해서 개발하는 경우도 많다.
https://github.com/spring-projects/spring-boot/issues/7107
반응형'Spring Boot > JPA' 카테고리의 다른 글
2024 - QueryDSL 근황 (0) 2024.08.22 QueryDsl projections 자바 Record에 적용하기 (1) 2024.04.23 [JPA] 간단하게 OneToMany 데이터 API 구현하기 - @Embeddable, @Embedded, @ElementCollection 활용하기 (1) 2023.10.15 [JPA] Repository단에 Transactional을 선언하는 이유 (0) 2023.10.05 JPA 애플리케이션 데이터베이스 초기화 (0) 2023.09.17 - 서버에서 들어온 요청이 처리되는시간을 말한다.