JPA 강의 3 - 연관관계 매핑 기초

UmmChicken·2022년 11월 29일
0

JPA

목록 보기
3/10

출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편

섹션 5. 연관관계 매핑 기초

  • 만드는 순서 : 테이블 설계 -> Entity(domain) 설계와 매핑 -> ...
    • 회원 엔티티 코드 다시 보기
    • 회원 리포지토리 개발
    • 회원 서비스 개발
    • 회원 기능 테스트
  • 참고 : H2 Database 만들기
    🚨 h2 DB 연결 에러 시 : 참고
// 초기 실행
jdbc:h2:~/이름

// 초기 실행 후 다음부터 접속
jdbc:h2:tcp://localhost/~/이름

0. 목표

  • 객체와 테이블 연관관계의 차이를 이해
  • 객체의 참조와 테이블의 외래 키를 매핑
  • 용어 이해
  1. 방향(Direction): 단방향, 양방향
  2. 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해
  3. 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요

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

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

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

2. 단방향 연관관계

  • '일대다' 같은 관계에서 누가 '일'이고 누가 '다'인지는 DB 관점에서 중요

ex) Member - Team인 경우, Member가 N, Team이 1이다.
Member 입장

@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

3. 양방향 연관관계와 연관관계의 주인

ex) Member - Team인 경우,
Team의 입장에서 Member가 있는지 알고싶다면...

@OneToMany(mappedBy = "team") // Member 클래스의 private Team team;과 연결이 되어있다는 뜻
private List<Member> members = new ArrayList<>();

3 - 1. mappedBy의 정체

💡 Tip) 객체테이블간에 연관관계를 맺는 차이를 이해해야 함

3 - 2. 객체와 테이블이 관계를 맺는 차이

  • 객체 연관관계 = 2개
    • 회원 -> 팀 연관관계 1개(단방향)
    • 팀 -> 회원 연관관계 1개(단방향)
  • 테이블 연관관계 = 1개
    • 회원 <-> 팀의 연관관계 1개(양방향)
    (사실상 방향이 없음. 하나만 있으면 양쪽으로 왔다갔다 할 수 있음)

3 - 3. 객체의 양방향 관계

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단뱡향 관계 2개임
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 함

3 - 4. 테이블의 양방향 연관관계

  • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
  • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐
    (양쪽으로 조인할 수 있음)

3 - 5. 연관관계의 주인(Owner)

  • 양방향 매핑 규칙
    • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
    연관관계의 주인만이 외래 키를 관리(등록, 수정)
    주인이 아닌쪽은 읽기만 가능
    주인은 mappedBy 속성 사용 X
    • 주인이 아니면 mappedBy 속성으로 주인 지정 (값 넣어도 반영 안 됨)
    💡 Tip) 외래 키가 있는 있는 곳을 주인으로 정해라
    (@ManyToOne에는 mappedBy 속성이 없다.
    즉, @ManyToOne이 연관관계 주인)

4. 양방향 매핑 정리

  • 단방향 매핑만으로도 이미 연관관계 매핑은 완료
  • 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐
  • JPQL에서 역방향으로 탐색할 일이 많음
  • 단방향 매핑을 잘 하고 양방향은 필요할 때 추가해도 됨
    (테이블에 영향을 주지 않음)

⭐ ORM은 객체와 관계형 데이터베이스 둘 다 중요!

profile
Hello My World!

0개의 댓글