ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA]연관관계 매핑 기초
    Backend/JPA 2021. 12. 6. 15:11

    연관관계 매핑 기초

    어떻게 객체 지향적으로 설계하는지 에 대한 수업.

     

    주된 목표는 

    객체와 테이블 연관관계의 차이를 이해

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

     

     

    객체를 테이블에 맞추어 모델링(연관관계가 없는 객체)

    하나의 팀에 여러 회원이 소속 될 수 있다.

     

    객체를 테이블에 맞추어 모델링 (참조 대신에 외래 키를 그대로 사용)

    객체를 테이블에 맞추어 모델링(외래 키 식별자를 직접 다룸)

    여기서 불편한것이 SetTeamID이가 그냥 객체를 넣으면 될 것 같은데 Teamid로 넣는 부분..

    연관관계가 없어 이렇게 계속 검색하는 모습.(팀을 찾을때)

     

     

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

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

     

    가장 기본의 연관관계 단방향을 알아보겠습니다.

     

    객체지향 모델링 (객체 연관관계 사용)

    이제는 Team_ID로 하지 않고 Team객체 그대로 넣어버리겠다.라는 개념

    여기서 멤버가 N이고 Team이 1 인 N대 1 관계이다.

    멤버 입장에서는 N이고 Team입장에선 One이기 때문에 @ManyToOne어노테이션을 사용합니다.

    Member객체의 Team 레퍼런스랑 멤버 테이블의 Team_id(FK)랑 매핑해야 하므로 @JoinColumn을 사용합니다.!

    이렇게 한다면 객체지향 모델링이 됩니다.

    이제 한번 사용해 보겠습니다.

    이제는 멤버 Team_ID를 넣는 것이 아니라 Team 객체를 넣게 되는 모습을 볼 수 있습니다.

    그리고 Team을 찾을 때에도 바로 찾는 모습을 볼 수 있습니다.

     

     

    양방향 연관관계의 연관관계의 주인

    어렵고 중요한 사항..

     

    양방향 매핑!

    단방향에선 멤버에서 팀을 갈 수는 있지만 팀에서 멤버로는 못 간다.. 

    양방향에선 테이블 연관관계는 변한 것은 없다. 왜냐 테이블 입장에선 Join을 통해 알 수 있다.!

    테이블은 외래 키 하나로 양방향이 다 있는 것이다. 하지만 문제는 객체입니다.

    그래서 Team에서 List members를 넣어줘야 양방향이 가능하다.

     

    코드 구현.

    팀에서 멤버는 일대다 이므로 @oneToMany로 작성한다. 그리고 mappedBY를 작성해줘야 한다.

    나는 뭐랑 연결되어있지?를 확인하는 것. 나의 반대편 사이트에 이런 것이 걸려있다는 걸 확인하는 개념입니다.

    이렇게 팀에서 멤버들을 구할 수 있습니다.

     

    다음은 중요한 mappedBy입니다. 

    객체와 테이블이 관계를 맺는 차이!

    • 객체 연관관계 = 2개(단 방향이 두개가 있는것.. )
      • 회원 -> 팀 연관관계 1개(단방향)
      • 팀 -> 회원 연관관계 1개(단방향)
    • 테이블 연관관계 = 1개
      • 회원 <-> 팀의 연관관계 1개(양방향)
      • FK하나로 양쪽 다 아는 것이 가능합니다.

     

     

    객체의 양방향 관계

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

    A -> B (a.getB())
    B -> A (b.getA())

    테이블의 양방향 연관관계

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

    SELECT *
    FROM MEMBER M
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
    SELECT *
    FROM TEAM T
    JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

     

    딜레마가 발생!!

    멤버의 Team값을 토대로 업데이트할지 Team에서의 members를 토대로 업데이트할지 딜레마가 발생합니다.

    둘 중 하나로 외래 키를 관리해야 하는 것.!

    이 것에 대한 룰이 연관관계의 주인입니다.

    양방향 매핑 규칙

    • 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
    • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
    • 주인이 아닌 쪽은 읽기만 가능
    • 주인은 mappedBy 속성 사용 X
    • 주인이 아니면 mappedBy 속성으로 주인 지정

     

    누구를 주인으로?!

    • 외래 키가 있는 곳을 주인으로 정해라!
    • 여기서는 Member.team이 연관관계의 주인

    List members는 읽기만 가능 member.team을 통해 값 변경

    위 사진을 보면 Member 테이블에 FK가 있으니 그곳을 주인으로 설정해야 헷갈리지 않습니다.

     

     

    양방향 매핑 시 가장 많이 하는 실수.(연관관계의 주인에 값을 입력하지 않음)

    연관관계의 주인은 Member에서 team이 주인입니다.

    읽기 전용인 getMembers에 add해도 아무런 영향을 주지 않습니다.!

     

    해결책!!

    양방향 매핑 시 연관관계의 주인에 값을 입력해야 한다.

    (순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 한다.)

     

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

    [JPA]고급 매핑  (0) 2021.12.13
    [JPA]다양한 연관관계 매핑  (0) 2021.12.10
    [JPA]엔티티 매핑  (0) 2021.12.02
    [JPA]JPA 소개_사용 이유  (0) 2021.12.01
    [JPA]섹션3_영속성관리_내부동장방식  (0) 2021.11.29
Designed by Tistory.