LAZY 옵션 문법을 아는지가 아니라, OneToOne의 소유권 구조가 실제 SQL 실행에 어떻게 묻어 나오는지 같이 보는지 가르려는 질문이다.
양방향 OneToOne에서 비주인(mappedBy) 측은 외래키를 자기 테이블에 들고 있지 않기 때문에, 연관 엔티티가 존재하는지·null인지를 자기 행만 보고는 알 수 없다. JPA는 프록시를 만들지 null을 넣을지 결정해야 하니, LAZY를 걸어도 해당 필드에 접근하기 전에 존재 확인용 select를 미리 한 번 날린다. 그 결과 LAZY를 켰는데도 매 조회마다 추가 쿼리가 붙어 N+1처럼 보이는 현상이 생긴다. 해결은 단방향 OneToOne으로 모델링하거나, 주인 측에서 조회를 시작하거나, 정말 필요하면 byte-code enhancement 같은 보조 수단을 쓰는 쪽으로 잡는다.
쿼리 로그에서 의도치 않은 추가 select를 발견해 OneToOne 모델링을 손본 경험이 있다면 이 질문과 연결할 수 있다
양방향을 단방향으로 바꾸거나 조회 방향을 뒤집어 성능을 개선한 적이 있다면 대안 비교로 엮을 수 있다
연관관계 설계 가이드를 팀 표준으로 정리해 본 경험이 있다면 같은 함정을 반복하지 않게 만든 사례로 말할 수 있다
아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.