[JPA] 다양한 연관관계 매핑

gyeol·2024년 7월 9일

JPA

목록 보기
5/13
post-thumbnail

김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'를 듣고 적은 글 입니다.

테이블

  • 외래키 하나로 양쪽 조인 가능

객체

  • 참조용 필드가 있는 쪽으로만 참조 가능
  • 항쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향

연관관계의 주인

  • 테이블은 외래키 하나로 두 테이블이 연관관계를 맺음
  • 객체 양방향 관계는 A->B, B->A 처럼 참조 2군데. 테이블의 외래키를 관리할 곳을 지정해야 함

다대일

단방향

양방향

외래키를 가지는 곳이 주인이고 주인이 아닌 곳에 mappedby를 사용한다.
양쪽을 서로 참조하도록 개발하여야 한다.

ex code

//Member class
@ManyToONE
private Team team;

//Team class
@OneToMany(mappedby = "team")
private List<Member> members = new ArrayList<>();

일대다

실무에서 많이 사용하지 않는 방식이다.
테이블의 일대다 관계는 항상 다쪽에 외래키가 존재한다. 하지만 연관관계의 주인은 일이 맡기때문에 뭔가 꼬여 관리가 어렵다.
객체와 테이블의 차이로 인해 반대편 테이블의 외래키를 관리하는 특이한 구조이기 때문에 @JoinColumn 을 꼭 사용해야 한다. (사용하지 않으면 중간 테이블이 하나 더 만들어짐)

일대일

주 테이블이나 대상 테이블 중 외래키를 선택할 수 있다. 이때 외래키에 데이터베이스 유니크(UNI) 제약조건을 추가해야 한다.

이때 MEMBER 테이블이 아닌 LOCKER테이블에서 MEMBER_ID(FK, UNI)를 가져도 상관없다.

주 테이블에 외래키

주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래키를 두고 대상 테이블을 찾는다.
다대일 양방향 매핑처럼 외래키가 있는 곳이 연관관계의 주인이 되며, 반대편은 mappedby를 적용한다.

  • 장점 : 주테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
  • 단점 : 값이 없으면 외래키에 null 허용

대상 테이블에 외래키

대상 테이블에 외래키가 존재한다. 이때 단방향 관계는 JPA에서 지원하지 않고, 양방향 관계만 지원한다.

  • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
  • 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨

다대다

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 연결 테이블을 추가해 일대다, 다대일 관계로 풀어내야 한다.

객체의 경우 컬렉션을 사용해 객체 2개로 다대다 관계를 표현할 수 있다.
@ManyToMany를 사용하지만 실제 실무에선 사용하지 않는다.
우리는 @ManyToOne, @OneToMany를 사용해 다대다 관계를 표현한다.

profile
공부 기록 공간 '◡'

0개의 댓글