연관관계 주인이 필요한 이유
객체 지향의 패러다임과 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 객체를 따로 만들어서 반환하도록 합니다.
'EngleBee 프로젝트' 카테고리의 다른 글
[study] spring과 웹소켓 (0) | 2024.08.24 |
---|---|
[study] CI/CD 파이프라인 구축 (0) | 2024.08.23 |
[study] github 프로젝트와 마일스톤 그리고 이슈 (0) | 2024.08.18 |
[트러블슈팅] 수업 생성 로그 테이블 생성 (0) | 2024.08.16 |
[Study] WebRTC : NAT, ICE, STUN, TURN에 대하여 (0) | 2024.08.15 |