본문 바로가기

Dev/JPA

RS) 연관관계 매핑시 주의할 점

다중성

매핑시 대칭성이 있다고 생각하자

다대다 관계는 실무에서는 사용하지 말아야 한다. (대체방법 필요)

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

단방향, 양방향

테이블

  • 외래 키 하나로 양쪽으로 조인 가능 → 방향 개념이 없음
  • 외래키 하나로 두 테이블이 연관관계를 맺음

객체

  • 참조용 필드가 있는 쪽으로만 참조 가능, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향
  • 객체 양방향 관계는 참조가 2군데있음
  • 둘중에 테이블의 외래 키를 관리하는 쪽을 지정하고 연관관계의 주인으로 설정하고 지정해야함
  • 주인의 반대쪽은 외래 키를 업데이트하는 데에 영향을 주지 않고, 조회만 가능하다.

다대일 단방향 관계

  • 가장 많이 사용하는 연관관계
  • 외래키가 있는 곳에 참조를 걸고 연관관계 매핑을 하면 된다.
        // Member Entity에만 아래와 같이 연관관계를 설정하는 경우
        // 다대일 단방향 관계
        
        @ManyToOne
        @JoinColumn(name = "TEAM_ID")
        private Team team;​
  • 양쪽을 서로 참조하게 될 경우 양방향으로 연관관계를 지어주는데 아래와같이 설정해주면 된다.
        // Team 엔티티에 설정
        // 여기서 team은 Member 엔티티에 있는 team이라는 변수를 가리
        @OneToMany(mappedBy = "team")
        private List<Member> members = new ArrayList<>();​

일대다 단방향

  • 실무에서는 별로 사용을 권장하지 않는 관계이다.
  • 테이블 관계에서 FK가 위치하는 쪽을 고려해서 매핑하는 것이 중요하다.
  • 일대다 단방향은 일대다에서 일(1)이 연관관계의 주인이 되버린다.
  • 다(N)쪽에 외래키가 존재하게 된다.
  • 객체와 테이블의 차이 떄문에 반대편 테이블이 외래 키를 관리하는 특이한 구조
  • @JoinColumn을 꼭 사용해야 한다. 그렇지 않으면 JPA가 실행될 때 중간에 중간 테이블을 추가하게 된다.
    • 테이블이 하나 더 들어감으로써 운영하기가 성능상으로 좋지 않다.

일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자!


일대일 관계

  • 일대일 관계는 반대도 일대일 관계이다.
  • 주 테이블이나 대상 테이블 중에서 선택해서 외래 키를 넣을 수 있다.
  • 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가
  • 다대일 양방향 매핑 처럼 외래키가 있는 곳이 연관관계의 주인
  • 명확하게 일대일 관계일 경우에는 DBA의 의견이나 테이블 관계를 고려하여 설계하는 것이 중요하다.
  • ex) 대체적으로 Member와 Locker의 관계로 봤을 경우 Member쪽에 Locker을 들고 있는 것이 바람직하다.
    • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
    • 단점 : 값이 없으면 외래 키에 null 허용

일대일 : 대상 테이블에 외래 키 단방향 정리

  • 단방향 관계는 JPA에서 지원하지 않는다.
  • 양방향 관계는 지원

정리하자면 일대일 연관관계에서는 내가 내것만 관리해야 한다!

즉, 외래키가 있는 쪽에 있는 엔티티가 그 외래키를 직접 관리한다고 생각하자!

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

RS) 상속관계 매핑  (0) 2022.02.22
RS) 다대다 관계  (0) 2022.02.17
RS) 양방향 연관관계와 연관관계의 주인  (0) 2022.02.06
RS) 연관관계 매핑 기초  (0) 2022.02.06
RS) 실전예제를 통한 문제점 분석  (0) 2022.02.06