- 본 포스팅은 인프런 김영한 강사님 [자바 ORM 표준 JPA 프로그래밍 - 기본편]강의를 바탕으로 작성되었습니다.(섹션6)

출처: https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

1.  연관관계 매핑시 고려사항 3가지

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

1) 다중성

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

2) 단방향, 양방향

사실 방향이라는 개념이 없고 한쪽이 참조하느냐, 양쪽 다 참조하느냐에 따라 단방향, 양방향 결정

 

3) 연관관계의 주인

  • 연관관계의 주인 : 외래 키를 관리하는 참조
  • 주인의 반대편 : 외래 키에 영향을 주지 않음, 단순 조회만 가능

2. 다대일 [N:1]

가장 많이 사용하는 연관관계이다.

단방향, 양방향 모두 존재하며, 외래 키가 있는 '다'쪽이 연관관계의 주인이다.

 

3. 일대다 [1:N]

일대다 단방향은 '일(1)'이 연관관계의 주인이다.

일대다 단방향 매핑의 단점은 엔티티가 관리하는 외래키가 다른 테이블에 있다는 점이다.

=> 따라서 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자

 

일대다 양방향은 공식적으로 존재하지는 않는다.

그러나 읽기 전용 필드를 사용해서 양방향처럼 사용은 가능하다

ex) @JoinColumn(insertable=false, updatable=false)

=> JPA에서 이런 구조를 지원은 해주고 있으나 다대일 양방향을 사용하는 것이 더 바람직하다.

 

4. 일대일 [1:1]

주 테이블이나 대상 테이블 중에 외래키 선택 가능

  • 주 테이블에 외래 키
    • 객체지향 개발자 선호
    • JPA 매핑 편리
    • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
    • 단점 : 값이 없으면 외래 키에 null 허용
  • 대상 테이블에 외래 키
    • 전통적인 데이터베이스 개발자 선호
    • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
    • 단점 : 지연로딩으로 설정해도 항상 즉시 로딩됨

5. 다대다 [N:M]

@ManyToMany를 사용하고 @JoinTable로 연결 테이블을 지정한다.

실무에서 사용권장하지 않으며 N:M의 관계를 갖는 엔티티끼리는 중간에 연결 테이블용 엔티티를

추가하는 방법을 권장한다.

 

'JPA' 카테고리의 다른 글

[JPA] 연관관계 매핑 기초  (0) 2022.07.11

- 본 포스팅은 인프런 김영한 강사님 [자바 ORM 표준 JPA 프로그래밍 - 기본편]강의를 바탕으로 작성되었습니다.(섹션5)

출처: https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

1. 용어 이해

  • 방향(Direction) : 단방향, 양방향
  • 다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
  • 연관관계의 주인 : 객체 양방향 연관관계는 관리 주인이 필요

2. 연관관계 매핑을 사용하는 이유

연관관계 매핑을 사용하지 않고, 외래키로 다른 객체를 조회해올 때, FK값으로 조회해와야 한다.

이 경우, 가져온 FK값으로 한번 더 DB에 접근하여 find해와야 하는 불편함이 존재한다.

또한, FK ID값으로 찾아와서 객체를 한번 더 조회하는 것은 객체지향스럽지 못하다.

따라서, 엔티티 안에 객체를 선언하여 연관관계 매핑을 사용하여 코드를 객체지향스럽고 간결하게 표현한다.

 

 3. 단방향 연관관계

예시로 Memeber(회원) 객체와 Team(팀) 객체가 있다고 해보자.

회원과 팀 객체는 N:1관계이다.

이 경우 FK는 회원 테이블에 존재한다.( 1:N관계일 경우 N의 관계를 가지고 있는 객체에 FK를 세팅해줘야 관리가 용이하다)

 

단방향 연관관계의 경우, FK를 가지고 있는 객체에 연관있는 객체를 선언해준다.

예시로 코드를 나타내면 아래와 같다.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    @Column(name = "USERNAME")
    private String name;
    private int age;
    // @Column(name = "TEAM_ID")
    // private Long teamId;
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
 }

Member 객체에 Team 객체를 선언해준 후, 연관관계를 작성해준다.

Member기준 Team과 N:1관계이기 때문에 ManyToOne 어노테이션을 작성해준다.

또한 관계에서 주인인 경우 @JoinColumn 어노테이션으로 어떤 컬럼 기준으로 join을 할 것인지 명시해준다.

 

4. 양방향 연관관계

양방향 연관관계는 연관관계를 가지고 있는 두 객체에 서로의 객체를 모두 선언해주는 것이다.

양방향 연관관계가 필요한 경우는 역방향 조회가 필요한 경우이며,

이 경우가 아닌이상 단방향 연관관계로 설정해주는 것이 최적의 방법이다.

 

양방향 연관관계를 세팅하는 코드는 아래와 같다.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    @Column(name = "USERNAME")
    private String name;
    private int age;
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    …
}
@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;
    @OneToMany(mappedBy = "team")
    List<Member> members = new ArrayList<Member>();
    …
}

Member객체는 단방향일 경우와 같이 작성해주고, Team객체에 반대 연관관계인 OneToMany 어노테이션을 작성해주고,

mappedBy 속성을 통해 주인이 아닌 부가적인 객체임을 표시해준다.

 

5. 연관관계의 주인

단방향 매핑일 경우 주인을 정해줄 필요가 없지만, 양방향 매핑일 경우 주인을 누구로 할지 정해주어야 한다.

 

- 양방향 매핑 규칙

  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용X
  • 주인이 아니면 mappedBy 속성으로 주인 지정

- 그렇다면 누구를 주인으로?

  • 외래 키가 있는 곳을 주인으로 정해라
  • 위의 예시에서는 Member.team이 연관관계의 주인

- 양방향 연관관계 주의할 점

  • 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자
  • 연관관계 편의메소드를 생성하자
  • 양방향 매핑시에 무한루프를 조심하자

6. 연관관계 최종요약 정리

  1. 단방향 매핑만으로도 이미 연관관계 매핑은 완료
  2. 양방향 매핑은 반대 방향으로 조회기능이 추가된 것 뿐
  3. 단방향 매핑을 잘 하고 양방향은 필요할 때 추가해도 됨
  4. 연관관계의 주인은 외래 키의 위치를 기준으로 정해야 함

'JPA' 카테고리의 다른 글

[JPA] 다양한 연관관계 매핑  (0) 2022.07.13

+ Recent posts