[JPA-Basic][5] 연관관계 매핑 기초

kiteB·2021년 10월 13일
0

JPA

목록 보기
5/28
post-thumbnail

[ 소개 ]

1. 용어 이해

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

2. 연관관계가 필요한 이유

"객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다."
- 조영호 (객체지향의 사실과 오해)


3. 예제 시나리오

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계이다.

4. 객체를 테이블에 맞추어 모델링


객체를 테이블에 맞추어 모델링하면 연관관계가 없는 객체가 된다.
→ 참조 대신, MEMBER 테이블의 외래 키, TEAM_ID를 그대로 사용!

Member.java, Team.java

  • TEAM 객체를 참조하지 않고, 외래 키 값 TEAM_ID를 그대로 사용한다.

  • Member, Team 테이블 생성 완료!

JpaMain.java

  • member.setTeamId(team.getId());: 외래 키 식별자를 직접 다룬다.

  • member를 조회해왔음에도 불구하고 member가 속한 팀을 알기 위해서
    member가 가진 team.id, 즉 식별자로 테이블을 검색해서 가져와야 한다.
  • 이는 연관관계가 없기 때문이며, 객체지향적인 방법이 아니다!

📌 문제점

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

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.

[ 단방향 연관관계 ]

객체 지향 모델링

객체 연관관계 사용

  • TEAMid가 아닌 TEAM의 참조값을 그대로 가져온다.
  • MEMBER 객체의 TEAM 레퍼런스와 MEMBER 테이블의 TEAM_ID(FK)를 매핑해야 한다.

객체의 참조와 테이블의 외래키를 매핑

  • @ManyToOne: MEMBER:TEAM = N:1 (다대일 관계)
  • @JoinColumn(name = "TEAM_ID"): 객체 연관관계 TEAM 참조와 테이블 연관관계 TEAM_ID 외래 키와 매핑→ ORM 매핑이 완성됨!

ORM 매핑

연관관계 저장

  • memberteam 참조를 저장한다.
  • 그러면 JPA가 알아서 team 엔티티에서 pk 값을 추출해서 memberfk로 설정한다.

참조로 연관관계 조회 - 객체 그래프 탐색

연관관계 수정

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글