자바 ORM 표준 JPA 프로그래밍(인프런)

Ch06. 다양한 연관관계 매핑 - 다대일 [N:1]

webmaster 2021. 12. 13. 09:33
728x90

객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 
  • 객체는 참조를 사용해서 연관된 객체를 찾는다. 
  • 테이블과 객체 사이에는 이런 큰 간격이 있다.

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

  • 다중성 (잘 모를 경우 반대편을 생각하면 된다, 대칭성이 있기 때문에)
    • 다대일: @ManyToOne
    • 일대다: @OneToMany
    • 일대일: @OneToOne 
    • 다대다: @ManyToMany (실무에서는 사용하지 못한다)
  • 방향 (단방향, 양방향)
    • 참조용 필드가 있는 쪽으로만 참조 가능 
    • 한쪽만 참조하면 단방향
    • 양쪽이 서로 참조하면 양방향
  • 연관관계의 주인
    • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음
    • 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데
    • 객체 양방향 관계는 참조가 2군데 있음. 둘 중 테이블의 외래 키 를 관리할 곳을 지정해야 함
    • 연관관계의 주인: 외래 키를 관리하는 참조
    • 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능

다대일 단방향 [N : 1]

다대일 단방향 연관관계

  • DB에는 항상 사 쪽에 외래키가 존재해야 설계가 맞는 것이다.
  • 가장 많이 사용하는 연관관계
  • 다대일의 반대는 일대다

Member Entity의 Team 속성(테이블의 외래키, JPA의 연관관계)

  • 반대 Team에는 Member를 참조하는 부분이 존재하지 않는다(단방향이라서)

다대일 양방향 [N : 1]

다대일 양방향 연관관계

  • 외래 키가 있는 쪽이 연관관계의 주인
  • 양쪽을 서로 참조하도록 개발

Team.Entity의 members 속성(실제 테이블에는 들어갈 필요가 없는 속성, 객체는 양방향 으로 접근하기 위해서는 참조값이 필요하기 때문에 연관관계를 설정한 뒤 , mappedby 속성을 통해 연관관계의 주인을 설정한다)

  • 양방향이기 때문에 Team에서도 참조하는 부분이 생기게 되었고, 연관관계의 주인을 외래키가 존재하는 Member로 설정하면서 team의 members는 읽기 전용만 가능하도록 mappedBy를 설정해둔다 

다대일 양방향 정리

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 방향 관계 2개다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
  • 외래 키가 있는 쪽이 연관관계의 주인 
  • 양쪽을 서로 참조하도록 개발
728x90