티스토리 뷰

상황

19.12.10 우테코 레벨4 eat-together 프로젝트의 Article/Shop/Menu 관련 구현 중 발생한 이슈

Shop은 @OneToMany로 List를 갖고있다.
Menu도 양방향으로 @ManyToOne Shop을 갖고있다.

가게 조회 기능을 구현하는 과정에서, 테스트에서 Shop을 리턴하니 List때문에 터졌다.

발생한 LazyInitializationException 예외를 검색해보니 관련 논의가 많았다.

참고자료

문제 해결

  • application.properties#spring.jpa.open-in-view=false로 설정되있었다.
  • 해당 설정을 지우고 true로 켜니 해결. (fetchType은 Lazy인 상태)

+ Nick's Help

이 부분을 한창 고민하던 와중에, 지나가던 Nick선생님께서 첨언해주셨다.

  • OSIV는 스프링부트에서 기본적으로 true로 설정되어있음.
  • OSIV를 켜면, Lazy가 서비스에서 나갈때 Proxy로 나가는데 컨트롤러에서도 조회가능해진다(조회만). 값에 접근할때 select문 날려 db에서 데이터 가져오고.
  • 우리는 OSIV 설정이 꺼져있어 터졌던 것. 반대로 말하면 이제까지 우린 대부분 이 설정을 기본값으로 켜놔서, 이 예외를 만날기회가 적었던 것
  • 원래 트랜잭션과 세션의 주기가 함께 가야 좋은데, OSIV를 켜면 (서비스를 나가며 트랜잭션이 끝나도 컨트롤러에서 접근가능하게) 세션 주기를 늘리는 역할
  • 그래서 현업에선 OSIV를 끄고 개발시작하기도 한다고한다. 켜면 select문 나가며 예상치못한 성능저하 발생할 수 있으니. OSIV에 관해선 말이 많다고 함.

-> LazyInitializationException을 검색하니 관련한 이슈와 논의가 활발했다. 오늘은 이정도로 문제해결하고 나중에 제대로 이부분을 파보자.


12.12 추가

  • Controller와 Service 사이엔 Dto를 활용해서 주고받기로 팀내 컨벤션을 정했다. 이를 통해, 더이상 엔티티가 서비스밖으로 노출되지않아 OSIV 문제가 더이상 발생하지않았고 도메인 모델을 더욱 보호할수있을것으로 기대할수있었다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함