자바

JPA 연관관계

mrban 2022. 2. 20. 00:00

1. 단방향, 양방향

단방향, 양방향은 객체에서만 의미있는 연관관계이다. 데이터베이스 테이블은 외래키로 양 쪽 테이블 조인이 가능합니다. 따라서 데이터베이스는 단방향이니 양방향이니 나눌 필요가 없습니다. 테이블끼리 연결된 순간 그냥 양방향이 되는 것이다.

 

그러나 객체는 참조용 필드(변수)가 있는 객체만 다른 객체를 참조하는 것이 가능합니다. 그렇기 때문에 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조하면 단방향 관계, 두 객체 모두가 각각 참조용 필드를 갖고 참조하면 양방향 관계라고 합니다.

엄밀하게는 양방향 관계는 없고 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용하고 말하는 것입니다. 

어떤 연관관계를 선택할지는 프로젝트에서 어떤 객체에서 참조가 필요한지를 고민해보면 됩니다.

 

2. 연관 관계의 주인

두 객체(A, B)가 양방향 관계를 맺을 때 연관 관계의 주인을 지정해야 합니다.

연관 관계의 주인을 지정 하는 것은 두 단방향 관계(A→B, B→A)중, 제어의 권한을 갖는 실질적인 객체가 어떤 것인지 JPA에게 알려준다고 생각하면 됩니다.

연관 관계의 주인은 연관 관계를 갖는 두 객체 사이에서 조회, 저장, 수정, 삭제를 할 수 있지만, 연관 관계의 주인이 아니면 조회만 가능합니다.

연관 관계의 주인이 아닌 객체에서 mappedBy 속성을 사용해서 주인을 지정해줘야합니다. 즉, mappedBy는 양방향 관계에서 쓰인다고 보면 됩니다.

보통 외래 키가 있는 곳을 연관 관계의 주인으로 정하면 됩니다.

 

3. 왜 연관 관계의 주인을 지정해야하는가?

두 객체가 있고 양방향 연관 관계를 갖는다고 생각해봅니다.

이렇게 객체에서 양방향 연관 관계 관리 포인트가 두 개일 때는 테이블과 매핑을 담당하는 JPA입장에서 혼란을 주게 됩니다. 어떤 객체에서 다른 객체를 수정할 때 FK를 수정해야할 지 결정하는 것이 어렵기 때문입니다.

그렇기 때문에 두 객체 사이의 연관 관계의 주인을 정해서 명확하게 Post에서 Board를 수정할 때만 FK를 수정하겠다! 라고 정하는 것입니다.


출처: https://jeong-pro.tistory.com/231 [기본기를 쌓는 정아마추어 코딩블로그]