본문 바로가기
Book

자바 ORM 표준 JPA 프로그래밍 - JPA 정리하기 (5-1) 연관관계 매핑 기초

by devLog by Ronnie's 2022. 8. 1.

들어가며


5강은 1편과 2편으로 나눠 진행하였다. 5강에서는 연관관계 매핑에 대한 단방향과 양방향 매핑법과 연관관계의 주인에 대한 내용이었다.

 

  • 핵심 키워드 3가지 
    • 방향 : 단방향과 양방향이 있음. 한쪽만 참조하는 것을 단방향, 양쪽 모두 참조하는 것을 양방향 관계라 한다.
    • 다중성 : 다대일, 일대다, 일대일, 다대다 다중성이 있다.
    • 연관관계 주인 : 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야한다.
  • 5.1 단방향 연관관계
    • 객체 연관관계
      • 회원 객체는 Member.team 필드로 팀 객체와 연관관계를 맺으면 회원 객체와 팀 객체는 단뱡향 관계다.
      • 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 팀은 회원을 알 수 없다.
    • 테이블 연관관계
      • 회원 테이블은 TEAM_ID 외래 키로 팀 테이블과 연관관계를 맺는다.
      • 회원 테이블과 팀 테이블은 양방향 관계다.
      • 회원 테이블의 TEAM_ID 외래 키 하나로 MEMBER JOIN TEAM과 TEAM JOIN MEMBER 둘 다 가능하다
    • 객체 연관관계와 테이블 연관관계의 가장 큰 차이
      • 참조를 통한 연관관계는 언제나 단방향
      • 객체간에 연관관계를 양방향으로 만들기 위해선 반대쪽에도 필드를 추가해서 참조를 보관해야함
      • 이렇게 양쪽에서 참조하는 것을 양방향 연관관계라 하지만 정확히 얘기하면 이것은 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다.
      • 반면에 테이블은 외래 키 하나로 양방향으로 조인 가능
  • 5.1.1 순수한 객체 연관관계
    • 객체는 참조를 사용해서 연관관계를 탐색할 수 있는데 이것을 객체 그래프 탐색이라고 한다.
  • 5.1.2 테이블 연관관계
    • 디비는 외래 키를 사용해서 연관관계를 탐색할 수 있는데 이것을 조인이라고 한다.
  • 5.1.3 객체 관계 매핑
    • @ManyToOne : 이름 그대로 다대일 관계라는 매핑 정보
    • @JoinColumn(name=“TEAM_ID”) : 조인 컬럼은 외래 키를 매핑할 때 사용한다.
  • 5.1.4 @JoinColumn
    • 외래 키를 매핑할 때 사용
    • name : 매핑할 외래 키 이름, 기본 값은 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명
    • referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명, 기본 값은 참조하는 테이블의 기본 키 컬럼명
    • foreignKey : 외래 키 제약 조건을 직접 지정 가능, 이 속성은 테이블을 생성할 때만 사용
    • unique / nullable / insertable / updatable / columnDefinition / table 은 @Column의 속성과 동일
  • 5.1.5 @ManyToOne
    • 다대일 관계에서 사용
    • optional : false로 설정하면 연관된 엔티티가 항상 있어야 한다. 기본 값은 true
    • fetch : 글로벌 패치 전략을 설정한다. ManyToOne은 기본값 FetchType.EAGER 이다
    • cascade : 영속성 전이 기능을 사용
    • targerEntity : 연관된 엔티티의 타입 정보를 설정, 거의 사용하지 않음.
    • 다대일과 비슷한 일대일 관계도 있는데 단방향 관계를 매핑할 때 둘 중 어떤 것을 사용해야 할지는 반대편 관계에 달려 있다. 반대편이 일대다 관계면 다대일을 사용하고 일대일이라면 일대일을 사용하면 된다.
  • 5.2 연관관계 사용
    • 연관관계 등록, 수정, 삭제, 조회
  • 5.2.1 저장
    • JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
  • 5.2.2 조회
    • 연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지
      • 객체 그래프 탐색 (객체 연관관계를 사용한 조회)
      • 객체지향 쿼리 사용 JPQL
    • 객체 그래프 탐색
      • 객체를 통해 연관된 엔티티를 조회하는 것
    • 객체지향 쿼리 사용
      • JPQL 조인 지원한다 (문법은 약간 다름)
      • : 로 시작하는 것은 파라미터를 바인딩 받는 문법
      • select m from Member m join m.team t where t.name=:teamName
  • 5.2.3 수정
    • 수정은 update() 같은 메서드가 없음
    • 단순히 불러온 엔티티의 값만 변경해두면 트랜잭션을 커밋할 때 플러시가 일어나면서 변경 감지 기능이 작동 하는것
    • 그리고 변경사항을 디비에 자동으로 반영
    • 참조하는 대상만 변경하면 나머지는 JPA가 자동으로 처리
  • 5.2.4 연관관계 제거
    • null 로 set
  • 5.2.5 연관된 엔티티 삭제
    • 연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다.
    • 그렇지않으면 외래 키 제약조건으로 디비 오류 발생하기 때문
    • remove()

댓글