Spring

N+1 문제

JJJAEOoni 2022. 5. 30. 11:09
반응형

save한 데이터를 그대로 리턴해주면 컨트롤러도 엔티티를 그대로 리턴할 것이기 때문에

메세지 컨버터가 json으로 변환하기 위해 getter를 계속 때리며

혹시 연관관계가 있다면 N+1 문제(순환참조문제)가 발생할 수 있다.

 

엔티티는 DB랑만 통신해야 한다.

 

이는 @JsonIgnoreProperties 어노테이션을 붙여줘도 되지만,

dto로 변환시켜 응답해주는게 좋다.

 

dto를 서비스에서 변환하는 순간 단점이 하나 생긴다.

OSIVfalse인것과 동일해진다.

 

OSIV(Open Session In View)

여기서 세션은 데이터베이스 세션(DB Connection)

 

뷰까지 세션이 오픈되는게 OSIV이다.

여기서 뷰는 컨트롤러를 말한다.

 

컨트롤러의 책임은 파싱하고, 뷰 찾아주고 이런걸 해야하는데 

 

스프링 트랜잭션은 서비스에서 열리고 닫힌다.

 

OSIV가 true이면 세션이 컨트롤러까지 열려있어서

컨트롤러에서 DB에 접근이 가능하기 때문에

지연로딩이 가능해진다. 

 

dto로 변환해서 영속화를 끊어버린다면 컨트롤러에서 메세지컨버터가 getter를 때려도 지연로딩이 안된다.

 

OSIV = true인게 의미가 없어지는 것이다.

 


 

@Transactional(readOnly = true)

 

영속성 컨텍스트에서 변경 감지를 하지 않는다.

안걸어줘도 상관없다. 쪼오끔 느려질뿐.

 

사실 transactional을 거는 이유는 생각보다 다양하다.

 

일단 insert, delete, update를 할때만 Transactional을 붙인다고 생각하고

고립성 공부가 끝나면 select일때 readonly를 걸어주자.

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형