티스토리 뷰
상황
19.12.10 우테코 레벨4 eat-together 프로젝트의 Article/Shop/Menu 관련 구현 중 발생한 이슈
Shop은 @OneToMany로 List를 갖고있다.
Menu도 양방향으로 @ManyToOne Shop을 갖고있다.
가게 조회 기능을 구현하는 과정에서, 테스트에서 Shop을 리턴하니 List때문에 터졌다.
발생한 LazyInitializationException
예외를 검색해보니 관련 논의가 많았다.
참고자료
- 킹뽀대님 글 , 나중에 정독해보고 OSIV에 대해 고민해보자
- feco.tistory.com - 3가지 해결방안 제시
- bebong.tistory.com
문제 해결
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 문제가 더이상 발생하지않았고 도메인 모델을 더욱 보호할수있을것으로 기대할수있었다.
'DB, JPA, SQL' 카테고리의 다른 글
JPA의 사실과 오해 (사실은 JPQL과 Fetch Join의 오해) (0) | 2020.05.25 |
---|---|
JPA 양방향 연관관계 Entity 값 저장 (0) | 2019.12.19 |
프로그래머스) SQL 고득점 Kit 문제 풀이 (0) | 2019.09.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Stack
- brute-force
- reversing
- graph
- FRAGMENT
- 회고
- queue
- 해외여행
- Android Studio
- sort
- C
- bfs
- 웹해킹
- socket
- webhacking.kr
- Java
- 우아한 테크코스
- OneToMany
- javascript
- 프로그래머스
- git
- dfs
- Vo
- 개발자
- Algorithm
- mysql
- Android
- Data Structure
- JPA
- 리버싱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함