[SpringBoot] JPA 연관관계, 연관관계 걸때 주의 사항

나른한 개발자·2026년 1월 16일

f-lab

목록 보기
27/46

연관관계

참고문서

연관관계를 설정하는 방법은 단방향과 양방향으로 설정할 수 있다. 단방향은 한 쪽 엔티티에만 참조를 설정하고 양방향은 양쪽 엔티티가 서로를 참조한다. 양방향인 경우에는 연관관계의 주인을 정해야하는데, 테이블에 외래 키가 있는 곳으로 정해야한다. 그래야 주인으로 설정된 엔티티만이 데이터베이스 연관관계와 맵핑되고 외래키를 관리할 수 있다. 주인이 아닌 쪽은 읽기만 할 수 있다. 그런데 양방향으로 설정하면 양쪽에서 객체 그래프 탐색이 가능하다는 장점이 있지만 복잡도가 올라가기 때문에 단방향으로 기본적으로 설계를 하고 필요시에만 양방향을 설정하는 것이 좋다.


연관관계 설정할때는 n+1 문제 예방과 객체의 정합성이 깨지지 않도록 유의해야한다. 첫번째로 글로벌 페치 전략이다. 지연 로딩과 즉시 로딩이 있는데, 지연 로딩은 연관관계가 있는 엔티티를 프록시로 대체하고 실제 사용할 때 초기화하면서 데이터베이스를 조회하는 방법이다. 즉시 로딩은 연관된 엔티티를 즉시 조회한다. 즉시 로딩은 하이버네이트에서는 SQL 조인을 사용해서 한번에 조회하는데 당장 필요하지 않은 데이터까지 로드되어 될수 있다. 그래서 모든 연관관계에는 지연 로딩을 기본적으로 적용하고 항상 같이 조회되는 데이터라면 즉시로딩을 적용하는 것이 좋다. 두번째는 연관관계 편의 메서드를 작성하는 것이다. 양방향 관계에서 한쪽에만 값을 셋팅하면 객체의 정합이 깨질수 있다. 따라서 값을 셋팅할 때 반대편 엔티티에도 값을 셋팅하는 로직을 하나로 묶어서 정의해줘야한다. 마지막으로 무한 루프를 조심해야한다. 예를들어 toString을 호출을 할때 연관관계 반대편에서도 toString을 호출하게되면서 무한 루프에 빠질 수 있다. 롬복이라는 라이브러리에서 toString 제외 설정을 하거나 아니면 api 응답 시에 DTO를 반환하여서 JSON 직렬화 과정에서 발생할수있는 무한 루프를 예방할 수 있다.

profile
Start fast to fail fast

0개의 댓글