본문 바로가기

EngleBee 프로젝트

[study] JPA 연관관계 맵핑 주인

728x90

연관관계 주인이 필요한 이유

객체 지향의 패러다임과 DB의 페러다임의 차이가 있습니다.

 

DB의 양방향과 단방향

DB에는 양반향, 단방향 개념이 없습니다.

외래키(FK) 하나면 양쪽의 관계를 알 수 있습니다.

 

객체의 단방향

Member 엔티티는 Team 엔티티 클래스를 필드로 갖고 있습니다.

Member 엔티티는 Team 엔티티의 모든 필드를 조회할 수 있습니다.

Team 엔티티는 Member 엔티티의 필드를 조회할 수 없습니다.

 

객체의 양방향

Member 엔티티는 Team 엔티티의 클래스를 필드로 갖고 있습니다.

Team 엔티티는 여러 Member를 하나의 팀으로 속할 수 있습니다. 그래서 Member 타입을 갖는  List를 필드로 갖고 있습니다

두 엔티티가 서로 참조용 필드를 갖고 있기 때문에 양쪽에서 필요한 모든 필드를 조회할 수 있습니다.

 

패러다임 차이 발생

양방향에서 객체와 DB간의 문제가 생깁니다.

Member가 새로운 Team에 들어가도록 변경한다고 가정합니다.

Member 엔티티에서 Team을 수정할지, Team 엔티티에서 List<member>를 수정할지 혼란이 옵니다.

DB에서는 외래키 값인 TEAM_ID를 사용하면 됩니다.

이러한 패러다임의 차이를 해결하기 위해 두 관계 중 하나를 연관관계의 주인으로 지정해야 합니다.

연관관계 주인으로 객체 패러다임의 양방향 관계가 DB 패러다임에서 연관관계가 하나임을 보장할 수 있습니다.

 

양방향은 나중에 역방향으로 객체 탐색이 필요하다고 느낄 때 추가하면 좋습니다.

 

 

연관관계의 주인(mapped by)

연관관계 주인을 지정한다는 것은 객체의 두 관계 중 제어의 권한을 갖는 실질적인 관계가 무엇인지 JPA에게 알리는 것입니다.

따라서 연관관계의 주인은 두 객체 사이에서 CRUD가 가능하지만 주인이 아니라면 조회만 가능합니다.

연관관계의 주인이 아닌 객체는 mapped by 속성을 사용해 주인 필드의 변수명을 지정해주면 됩니다.

 

 

양뱡향 매핑시 주의사항

1. 두 관계 양쪽에 값을 넣어줘야 합니다.

만약 역방향만 연관관계 설정하면 Member 테이블의 Team_ID는 NULL이 들어가게 됩니다.

 

2. 양쪽 다 값을 세팅하기 위해 연관관계 편의 메서드 생성을 권장합니다.

 

3. 양방향 매핑시 무한 루프 주의

to String 메서드나 Lombok을 한 쪽에서 사용하면 문제가 되지 않지만, 양 쪽에서 사용하게 된다면 무한 루프가 발생하게 됩니다. 

JSON은 컨트롤러에서 엔티티를 반환하지 않고, DTO 객체를 따로 만들어서 반환하도록 합니다.