ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA - 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)
    Spring/JPA 2022. 3. 9. 15:43
    반응형

     

     

     


     

     

    다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)

     

     테이블은 외래 키 하나로 서로 양쪽 조인이 가능하지만 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 즉, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이 된다. 

     

     객체 양방향 관계는 A->B, B->A 처럼 참조를 양쪽에서 해줘야 한다. 여기서 중요한 것은 외래 키를 관리할 연관관계 주인을 지정해줘야 한다. 연관관계의 주인은 외래 키를 관리하는 참조이며 연관관계의 주인이 아닌 객체들을 외래 키에 영향을 주지 않는다. 즉, 읽기만 가능하고 쓰기, 업데이트, 삭제가 안된다는 뜻이다.

     


     

    다대일 [ N : 1 ]

     

    단방향과 양방향

     

    • [N : 1] 에서 "N"이 연관관계의 주인
    • 양방향 연관관계는 역참조가 일어날 경우 사용된다.
    • 아래 예시로 Team 객체를 통해 Member 참조가 필요할 경우 양방향 연관관계를 설정해줘야 한다.
    • 연관관계 주인이 아닌 객체는 읽기만 가능하다

     

     

    @Entity
    @Getter @Setter
    public class Member {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        // 연관관계 주인
        @ManyToOne
        @JoinColumn(name = "TEAM_ID")
        private Team team;
    
        ...
    }
    
    @Entity
    @Getter @Setter
    public class Team {
    
        @Id @GeneratedValue
        @Column(name = "TEAM_ID")
        private Long id;
    
        // 양방향 연관관계 설정
        @OneToMany(mappedBy = "team")
        private List<Member> members = new ArrayList<>();
    
        private String name;
    }

     


     

     

    일대다 [ 1 : N ]

     

    • 권장하지 않는 방법, 일대다 단방향보다는 다대일 양방향 매핑을 사용하는 것을 권장
    • [1 : N] 에서 "1"이 연관관계의 주인
    • 테이블 일대다 관계는 항상 "N" 쪽에 외래 키가 있다.
    • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조
    • @JoinColumn을 꼭 사용해야 한다.(사용하지 않으면 조인 테이블 방식으로 중간에 테이블이 추가됨)
    • 단점 : 엔티티가 관리하는 외래 키가 다른 테이블에 있음
              연관관계 관리를 위해 추가로 UPDATE SQL 실행(MEMBER 테이블의 외래 키)

     

    @Entity
    @Getter @Setter
    public class Team {
    
        @Id @GeneratedValue
        @Column(name = "TEAM_ID")
        private Long id;
    
        // 일대다 연관관계
        @OneToMany
        @JoinColumn(name = "TEAM_ID")
        private List<Member> members = new ArrayList<>();
    
        private String name;
    }

     

    일대일 [ 1 : 1 ]

     

    • 주 테이블이나 대상 테이블 중에 외래 키 선택 가능
    • 일대일 관계는 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가
    • 양방향 매핑은 외래 키가 있는 곳을 연관관계의 주인으로 설정
    • 반대편은 mapedBy 적용해준다.

     

     

    @Entity
    @Getter @Setter
    public class Member {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        // 일대일 연관관계
        @OneToOne
        @JoinColumn(name = "LOCKER_ID")
        private Locker locker;
        ...
    }
    
    @Entity
    @Getter @Setter
    public class Locker {
    
        @Id @GeneratedValue
        @Column(name = "LOCKER_ID")
        private Long id;
        private String name;
        
        // 양방향 연관관계 매핑 시
        @OneToOne(mappedBy = "locker")
        private Member member;
    }

     

     대상 테이블에 외래 키가 있는 경우는 단방향은 지원하지 않고 양방향만 지원된다.

     

     


     

    다대다 [ N : M ]

     

    • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
    • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 한다.
    • 연결 테이블이 단순히 연결만 하는 것이 아닌 추가 데이터가 들어올 수 있으므로 
      @JoinTable은 사용하지 않고 엔티티를 추가하는 것이 좋다.

     

     

    반응형

    'Spring > JPA' 카테고리의 다른 글

    JPA - 프록시와 연관관계(즉시 로딩, 지연 로딩, CASCADE)  (0) 2022.03.10
    JPA - 상속관계 매핑  (0) 2022.03.09
    JPA - 연관관계 매핑  (0) 2022.03.08
    JPA - 엔티티 매핑  (0) 2022.03.08
    JPA - 영속성 컨텍스트  (0) 2022.03.07

    댓글

Designed by Tistory.