[영상후기]JPA 연관관계 - 김수빈 | 백엔드 데브코스 2기 | 백둥이Deview 220608

박철현·2023년 4월 11일
0

영상후기

목록 보기
87/160

movie

JPA(Java Persistence API)

  • JPA : ORM 표준 기술
    • 테이블 연관관계와 객체 연관관계 동일하지 않음을 이해하고 맵핑

객체 연관관계 vs 테이블 연관관계

  • 연관관계 매핑
    • 객체 : 참조를 통해 다른 객체와 연관관계
      • 참조 - 참조가 있는 쪽에서만 조회 가능
    • 테이블 : 외래키로 다른 테이블과 연관관계
      • Join - 외래키(FK) 하나로 양쪽에서 조회 가능
    • 외래키를 어떻게 참조로 표현하고 사용할지 결정 필요

단방향 vs 양방향

  • 단방향 매핑

    • 참조가 한쪽에만 존재
  • 양방향 매핑

    • 참조가 양쪽 모두 존재
    • 테이블 처럼 양방향 조회를 하기 위해 반대쪽에도 참조 추가
  • 단뱡항 연관관계만으로도 이미 연관관계는 맺어짐

    • 양방향 관계는 반대쪽 조회 기능을 추가로 얻기 위함(테이블 변화x)
  • 양방향 매핑 시 무한루프 조심

    • toString 제외 하고 필요 시 추가
  • 연관관계 편의 메소드

    • 한쪽 참조에 할당하면 상대방 참조도 같이 맺어주는 메서드
    • 양방향 연결이 형성될 때마다 애플리케이션 개발자는 양쪽이 항상 동기화 되어 있는지 확인해야 함
    • 주인이 아닌쪽에서 조회하기 위해서는 참조를 맺어줘야 함
      • 연관관계 편의 메소드 활용하면 편하게 가능

연관관계 종류

  • 1:1 - @OneToOne
  • 1:N - @OneToMany
  • N:1 - @ManyToOne
  • N:M - @ManyToMany

연관관계 주인

  • 연관관계 주인만이 DB 연관관계와 매핑되고 외래키를 관리할 수 있다(등록, 수정)
    • 연관관계 주인 : FK를 가진 테이블
    • JPA가 주인쪽을 보고 주인이 아닌쪽과의 관계를 insert 하거나 update 한다.
    • 주인쪽에 변화가 있어야 insert시에 데이터가 추가됨
    • 왜냐하면 실질적으로 DB 테이블에 외래키로 가지고 있는것이 주인쪽이니깐!!
    • 위 그림에서 A가 FK를 가지고 있기에 A가 주인
    • B쪽에서 mappedBy로 A의 "b" 속성이 자기 주인으로 연관관계 설정
  • 주인이 아닌쪽은 외래키를 읽기만 할 수 있다.

    • 가짜매핑(read only, mappedBy 설정 필수)
      • join으로 읽어올 수 있음
    • 외래키 수정권한이 없다.(없데이트용 아님)
      • 변경해도 JPA에서 해당 필드 변경을 신경안씀
  • 양방향 매핑시 두 관계중 하나를 연관관계의 주인으로 지정해야 한다.

    • 참조들이 어떻게 되든 DB는 외래키값만 업데이트 되면 된다.
    • mappedBy 속성으로 본인과 연관되어 있는 필드를 선택한다.(본인자체 읽기전용)

주테이블 vs 대상테이블

  • 주테이블
    • 본인이면 -> 주테이블
  • 대상테이블
    • 상대편이면 -> 대상테이블
  • 본인은 상황에 따라 상대적인 부분
    • 기준점이 어디에 있는지
      ex) Member - Locker = 1:1 관계
    • Member 기준으로 Locker는 대상 테이블
    • Locker 기준으로 Member는 대상테이블

FK vs 연관관계주인

  • 1:1 관계 : 외래키를 가지고 있는쪽과 관리하는쪽(주인)이 다르면 안된다.

    • Member - Locker = 1:1 관계
      • 외래키가 Locker에 있다면 Member에서 Locker를 단방향으로는 조회할 수 없음
        • JPA에서 상대방의 외래키를 관리할 수 없도록 만듦
      • Member에서 Locker를 조회하기 위해서는
        - 외래키를 Member에 주거나
        - 양방향으로 관계를 맺어 조회용 참조를 만드는 방법
  • N:1 관계

    외래키를 N쪽에둔다 -> N쪽이 연관관계 주인

    • A : B = N : 1 일때 -> A가 연관관계 주인
    • A class의 "b"의 필드가 주인이다 명시(mapped by)

왜 테이블은 항상 Many쪽에 FK를 두어야할까?

  • 1차 정규화 법칙을 따르면 이해할 수 있음

N:M 연관관계

  • OneToMany, ManyToOne으로 분리됨
    • 중간 테이블 자동으로 생성
  • 외래키 컨트롤 불가 및 매핑테이블에 추가 정보 생성 불가
    • 예상치 못한 쿼리 생성
  • 자동으로 생성되지만 컨트롤 할 수 있는 중간 테이블을 만들어서 직접 연결
    • 필요한 컬럼들을 추가로 만들어주거나
    • 예상 안에서 쿼리들을 분석할 수 있게 됨
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보