본문 바로가기
Back-end

연관관계 매핑 기초

by 신재권 2022. 9. 14.

단방향 연관관계

  • 객체 연관관계와 테이블 연관관계의 차이

객체의 연관관계는 서로 다른 단방향 관계가 2개 있는 것이고, 테이블의 연관관계는 양방향이다.

객체 그래프 탐색

객체가 참조를 사용해서 연관관계 탐색

@JoinColumn

외래키를 매핑할 때 사용

  • name : 매래핑 할 외래 키 이름
  • referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명
  • foreignKey : 외래 키 제약 조건을 직접 지정할 수 있다.
  • unique, nullable, insertable, updatable, columnDefinition, table

@ManyToOne

다대일 관계에서 사용한다.

  • optional : false로 설정하면 연관된 엔티티가 항상 있어야 한다.
  • fetch : 글로벌 페치 전략을 설정한다.
    • ManyToOne = EAGER
    • OneToMany = LAZY
  • cascade : 영속성 전이 기능을 사용한다.
  • targetEntity : 연관된 엔티티 타입 정보를 설정한다.

연관관계 사용

  • JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.

저장

각 객체가 영속 상태인 상태에서 객체 간의 관계를 설정하고 persist하면 저장된다.

조회

  • 객체 그래프 탐색
    • get을 사용해 연관관계 엔티티 조회 가능
  • 객체지향 쿼리 사용 JPQL
    • createQuery(jpql, class)를 통해 파라미터 바인딩을 하면 조회가 가능하다.
    • JPQL은 객체를 대상으로 한다.

수정

영속성이 있다면 변경사항을 자동 저장한다.

연관관계 제거

객체를 null로 설정한다.

연관된 엔티티 삭제

연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다. 그렇지 않으면 외래키 제약조건으로 인해 데이터베이스에서 오류가 발생한다.

양방향 연관관계

객체를 양방향 연관관계로 매핑해도 데이터베이스는 외래키 하나로 양방향 조회가 가능하다.

연관관계의 주인

연관관계의 주인만이 데이터베이스 연관관계와 매핑되고, 외래 키를 관리할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.

엔티티를 단방향으로 매핑하면 참조를 하나만 사용하므로, 이 참조로 외래키를 관리한다.

엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나라서 둘 사이에 차이가 발생한다.

이 문제를 해결하기위해 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야 하는 데 이것을 연관관계의 주인이라고 한다.

연관관계의 주인을 정한다는 것은 외래 키의 관리자를 선택하는 것이다.

  • 연관관계의 주인은 외래키가 있는 곳

mappedBy 속성을 사용해 주인이 아님을 설정한다.

데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래키를 가진다. 다 쪽은 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다.

주인이 아닌 곳에서 입력된 값은 외래키에 영향을 주지 않으므로 데이터베이스에 저장될 때 무시된다.

객체 관점에서는 양쪽 방향에 모두 값을 입력해주는 것이 가장 안전하다.

연관관계 편의 메서드

메서드 하나로 객체의 양방향 관계를 모두 설정하도록 하는 것

연관관계를 변경할 때는 기존 연관관계를 삭제하는 코드를 추가해야 한다.

양방향의 장점은 반대방향으로 객체 그래프 탐색 기능이 추가된 것 뿐이다.

  • 단방향 매핑만으로 테이블과 객체의 연관관계 매핑은 이미 완료
  • 단방향을 양방향으로 만들면 반대방햐응로 객체 그래프 탐색 기능이 추가
  • 양방향 연관관계를 매핑하려면 객체에서 양쪽 방향을 모두 관리해야 한다.
  • 양방향 매핑시에는 무한 루프에 빠지지 않도록 조심해야 한다.

 

출 처 : 자바 ORM 표준 JPA 프로그래밍 - 김 영 한 

 

'Back-end' 카테고리의 다른 글

[Spring Security] 스프링 시큐리티  (0) 2022.10.17
다양한 연관관계 매핑  (0) 2022.09.15
엔티티 매핑  (0) 2022.09.07
JWT 토큰  (0) 2022.09.05
영속성 관리  (0) 2022.09.02