My Blog

JPA에서 양방향 매핑의 규칙 본문

CS

JPA에서 양방향 매핑의 규칙

JAESG 2023. 5. 17. 14:40

객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것 처럼 보이게 할 뿐이다.

반면에 데이터베이스 테이블은 외래 키 하나로 양쪽이 서로 조인이 가능하다.

따라서 테이블은 외래 키 하나만으로 양방향 연관관계를 맺는다.

 

객체 연관관계의 예시는 다음과 같다

회원 -> 팀 연관관계 1개(단방향)

팀 -> 회원 연관관계 1개(단반향)

 

테이블 연관관계는 다음과 같다

회원 <-> 팀의 연관관계 1개(양방향)

 

JPA에서 이걸 사용하려면
회원과 팀을 예시로 들어보자. 

회원 - 팀 이 있다면

OneToMany(일대다) = 한 회원은 여러 팀에 속할 수 있다.
ManyToMany(다대다) = 여러 회원은 여러 팀에 속할 수 있다.
ManyToOne(다대일) = 여러 회원은 한 팀에만 속할 수 있다.

OneToOne(일대일) = 한 회원은 한 팀에만 속할 수 있다.

예시가 부적절하긴한데 느낌만 익히면 될것같다.

 

아무튼 JPA에서 회원 클래스와 팀 클래스(둘다 Entity)라고 가정한다면

 

양방향 연관관계 매핑을 해줘야한다.

회원에서 ManyToOne을 해줬다면
팀 에서는 OneToMany를 해주면 된다.

 

그리고 여기서 중요한 게 연관관계에 주인을 정해야한다.

이걸 정해야 하는 이유는 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나다.

따라서 둘 사이에 차이가 발생한다. 이런 차이로 인해 JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인 이라 한다.

 

연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수있다.

 

mappedBy속성을 사용하는 쪽이 주인이아니다.

연관관계의 주인은 외래 키가 있는 곳.

 

참고

데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래 키를 가진다. 다 쪽인 ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다. 따라서 @ManyToOne에는 mappedBy 속성이 없다.

728x90

'CS' 카테고리의 다른 글

운영체제의 종류  (0) 2023.05.08
CPU 스케줄링, 디스크 스케줄링  (0) 2023.05.08
Comments