Spring Data

@OneToOne, @ManyToMany

rohyun 2021. 11. 3. 23:32

@OneToOne 과 @ManyToMany


@OneToOne ( 1 : 1 관계 )

  • 일대일 관계는 그 반대도 일대일이다.
  • 주 테이블이나 대상 테이블 중 외래 키를 어디에 둘 것인지 선택이 가능하다.
  • 외래 키에 DB 유니크( UNI ) 제약조건이 추가되어야 1:1 매핑이 가능하다.

일대일 : 주 테이블에 외래 키 단방향

onetoonemain

  • 다대일( @ManyToOne ) 단방향 매핑과 유사하다.
  • 양방향의 경우도 다대일( @ManyToOne ) 과 유사한 로직으로 구현한다.

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

onetoonesub

  • 허용되지 않는다. 지원도 되지않고 방법도 없다.
  • 양방향 관계는 지원된다.

일대일 : 대상 테이블에 외래 키 양방향

onetoonesubboth

  • 사실 매핑되는 과정은 일대일 주 테이블에 외래 키 양방향과 같다.

그렇다면 일대일 관계에서 주 테이블에 외래키 양방향 vs 대상 테이블에 외래키 양방향 무엇이 더 좋을까?

  • 둘 중 어떤 방법을 써도 일대일 관계가 유효하게 성립이 된다.
  • 테이블이 한 번 생성되면 구조를 변경하기 어렵다는 관점에서 보자. 예를 들어, 시간이 흘러 하나의 회원이 여러 개의 락커를 가질 수 있다고 비지니스 룰이 바뀌게 된다면, 대상 테이블에 외래키 양방향인 경우 alter 명령어를 이용하여 Unique 제약조건만 삭제해주면 된다.
  • 하지만 반대로, 하나의 락커가 여러 명의 회원을 가질 수 있다고 비지니스 룰이 바뀌게 된다면, 주 테이블에 외래키 양방향인 경우가 @ManyToOne 관계로 변환하기가 로직 면에서 수월하다.
  • 하지만 위의 케이스는 오로지 DB 관점에서만 본 것이고, 서버 개발자의 입장에서는 주 테이블에 외래키 양방향인 경우가 유리하다. 대부분의 비지니스에서 멤버 테이블을 주로 많이 조회하여 값을 받아오게 되는데 멤버 테이블을 조회할 때에 멤버의 락커도 함께 가져오기 때문이다.
  • 나는 주 테이블에 외래 키를 두는 방식으로 픽스해야겠다 ^^!

@OneToOne 정리

  • 주 테이블에 외래키

    • 주 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾는다.
    • 객체지향 개발자가 선호하는 방법이다.
    • JPA 매핑하는데에 편리하다.
    • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
    • 단점 : 값이 없으면 외래 키에 null 을 허용해야한다.
  • 대상 테이블에 외래키

    • 전통적인 데이터베이스 개발자가 선호하는 방법이다.
    • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 관계를 유지할 수 있다.
    • 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩된다.

@ManyToMany( N : M 관계 ) - 실무에서 사용하면 안되고, 사용하지 않는다.

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

REFERENCES

김영한님 자바 ORM 표준 JPA 프로그래밍 - 기본편

'Spring Data' 카테고리의 다른 글

JPA Open Session In View  (0) 2021.11.03
JPA 변경감지와 병합  (0) 2021.11.03
JPA Proxy  (0) 2021.11.03
연관관계 주인과 mappedBy  (0) 2021.11.03
JPA 영속성 컨텍스트  (0) 2021.11.03