[JPA] 04. 연관관계 매핑 기초

joheera·2023년 7월 15일
0

JPA

목록 보기
4/9

JPA에서는 객체의 참조와 테이블의 외래키를 매핑해야 한다.

객체를 테이블에 맞추어 데이터 중심을 모델링하면, 협력 관계를 만들 수 없다.
테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾지만, 객체는 참조를 사용해서 연관된 객체를 찾는다.

단방향 연관관계

관계 표현에 외래키가 아닌 객체 참조를 사용한다.

양방향 연관관계와 연관관계의 주인

양방향 연관관계

테이블에서는 외래키를 통해서 방향에 상관없이 연관관계를 찾을 수 있지만, 객체에서는 참조 관계를 통해서 관계를 표현하기 때문에 단방향 연관관계가 기본적이다. 반대 방향으로 객체 그래프 탐색하기 위해서는 객체에 속성을 지정해줘야 한다.

연관관계의 주인과 mappedBy

객체의 양방향 관계는 서로 다른 단방향 관계 2개이다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다. 테이블은 외래키 하나로 두 테이블의 연관관계를 관리한다. 즉, 외래키 하나로 양방향 연관관계를 가진다.

연관관계의 주인

양방향 매핑을 하기 위해서는 객체의 두 관계 중 하나를 연관관계의 주인으로 지정해야 한다. 양방향 관계에서는 연관관계의 주인만이 외래키를 관리(등록, 수정)할 수 있고, 주인이 아닌 쪽은 읽기만 가능하다. 주인이 아닌 쪽이 mappedBy 속성으로 주인을 지정한다. 연관관계의 주인은 두 테이블 중 외래키가 있는 곳으로 정한다. 즉, 1 대 N 관계에서 N인 쪽이 연관관계의 주인이다. 비즈니스 로직을 기준으로 연관관계의 주인을 선택하면 안된다.

양방향 매핑 시 주의할 점

1) 연관관계의 주인에 값을 입력해야 한다.
2) 순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 한다.
3) toString(), lombok, JSON 생성 라이브러리 등을 사용할 때 무한 루프를 조심해야 한다
-> Spring Controller에서 값을 반환할 때 entity 자체를 반환하는 것 대신, DTO 객체를 반환한다.

실수를 방지하기 위해서 연관관계 편의 메서드를 생성한다. set~()은 기본적인 setter method와 겹치기 때문에 연관관계 편의 메서드에서는 change~()를 사용한다. 연관관계 편의 메서드는 한쪽에서만 사용을 해야 한다. 비즈니스 로직 흐름 상 역방향으로 값을 할당하는 것처럼 하고 싶을 때도 연관관계 편의 메서드를 사용할 수 있다.

양방향 매핑 정리

양방향 매핑은 반대 방향으로 조회하는 기능이 추가된 것일 뿐이므로 단방향 매핑만으로도 연관관계 매핑을 할 수 있다. 그러나 개발하면서 JPQL에서 역방향으로 탐색할 일이 많기 때문에 양방향 매핑이 필요한 상황들이 있다. 양방향 매핑은 테이블에 영향을 주지 않으므로 초기에 단방향 매핑만 잘 해둔 다음 양방향 매핑은 필요한 상황에 추가하면 된다.

0개의 댓글