Lined Notebook

[Spring Data JPA] 13. JPA 다대일 연관관계

by ymkim

✔ 다양한 연관관계 매핑

이번시간에는 JPA에서 사용이 되는 다양한 연관관계 매핑에 대해서 알아본다.

✔ 목차

  • 연관관계 매핑시 고려사항 3가지
  • 다대일 [N:1] 🚀
  • 일대다 [1:N]
  • 일대일 [1:1]
  • 다대다 [N:M]
  • 실전 예제 - 3. 다양한 연관관계 매핑

✔ 연관관게 매핑시 고려사항 3가지

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

✅ 다중성

  • 다대일
    • @ManyToOne
  • 일대다
    • @OneToMany
  • 일대일
    • @OneToOne
  • 다대다
    • @ManyToMany

JPA에서 나온 해당 어노테이션은 DB와의 매핑을 위해 사용이 된다. 즉, DB 관점에서의 다중성을 기준으로 적용을 하면된다. 또한 연관관계 매핑은 대칭성이 존재하기 때문에 관계 설정이 어려운 경우에는 반대의 경우를 생각해보는 것도 하나의 방법이다.

EX) 회원과 팀이 존재하는 경우

다대일 --> 일대다
일대다 --> 다대일
일대일 --> 일대일
다대다 --> 다대다

💡 Tip: 다대다 연관관계 매핑 사용을 지양해라?

다대다 연관관계 매핑 실무에서 사용하면 안된다. 사용하면 안되는 이유는 다음 챕터(Chapter)에서 다룰 예정이다.

✅ 단방향, 양방향

  • 테이블(Table)
    • 외래 키 하나로 양쪽 조인 가능
    • 테이블은 방향이라는 개념이 없음
  • 객체(Object)
    • 참조용 필드가 있는 쪽으로만 참조 가능
    • 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향

위에서 말했다시피 테이블은 외래키 하나로 양쪽 테이블간의 조인이 가능하기 때문에, 방향이라는 개념이 존재하지 않는다. 이에 반해 객체의 경우는 참조용 필드가 있는 쪽으로만 참조가 가능하다.

💡 Tip: SQL, 연관관게 매핑 예시

SELECT
  A.member_no,
  B.member_name,
  B.member_address
FROM
  TEAM A
    JOIN
  MEMBER B
    ON
  A.member_no = B.member_no
@Entity
@Table(name = "MEMBER")
public class Member {
    //..중략

    @ManyToOne
    @JoinColumn(name = "TEAM_ID") // pk
    private Team team

    //..중략
}
@Entity
@Table(name = "TEAM")
public class Team {
    //..중략

    @OneToMany(mappedBy = "team")
    private List<MemberTest> members = new ArrayList<MemberTest>();

    //..중략
}

✅ 연관관계의 주인

  • 테이블은 를 맺음
  • 외래키 하나로 두 테이블이 연관관계
  • 객체 양방향 관계는 A -> B, B -> A 처럼
  • 참조가 2군데
  • 객체 양방향 관계는 참조가 2군데 있기에 둘 중 테이블의 외래키를 관리할곳을 지정해야한다
  • 연관관계의 주인: 외래키를 관리하는 참조
  • 주인의 반대편: 외래키에 영향을 주지 않음, 단순 조회만 가능

📌 다대일 [N:1]

다대일 연관관계 매핑

연관관계 매핑에서 가장 많이 사용이 되고 중요한 다대일[N:1] 관계에 대해 알아보자. 위 사진에서 주목해야 하는 부분은 Member 객체(Object)의 Team 객체다. 즉, 해당 team 참조 변수를 통해 Team 객체의 id 필드와 단방향 연관관계 매핑을 수행한다.

참고 자료

블로그의 정보

기록하고, 복기하고

ymkim

활동하기