본문 바로가기
Back-End/자바 ORM 표준 JPA 프로그래밍

[JPA] 자바 ORM 표준 JPA 프로그래밍_5장

by SoyeonCha 2023. 6. 5.

5장 연관관계 매핑 기초

∘ 대부분의 엔티티는 다른 엔티티들과 연관관계를 가짐

∘ 객체 관계 매핑(ORM)

∘ 객체는 참조를 이용해서 관계를 맺음

∘ 테이블은 외래 키를 사용해서 관계를 맺음

 

∘ 연관관계 매핑

  - 방향 : 단방향, 양방향

  - 다중성 : 다대일, 일대다, 일대일, 다대다

  - 연관관계의 주인

 

 

5.1 단방향 연관관계

객체 테이블
참조로 연관관계를 맺음 외래 키로 연관관계를 맺음
참조를 사용하는 연관관계는 단방향 외래 키를 사용하는 연관관계는 양방향
양방향 연관관계를 만들려면 단뱡향 2개 필요  

 

5.1.1 순수한 객체 연관관계

∘ 객체 그래프 탐색 : 객체는 참조를 사용해서 연관관계 탐색 가능

 

5.1.2 테이블 연관관계

∘ 조인 : 데이터베이스는 외래 키를 사용해서 연관관계 탐색 가능

 

5.1.3 객체 관계 매핑

객체 연관관계 : 회원 객체의 Member.team 필드 사용

테이블 연관관계 : 회원 테이들의 MEMBER.TEAM_ID 외래 키 컬럼 사용

∘ @ManyToOne

∘ @JoinColumn

 

5.1.4 @JoinColumn

∘ 주요 속성 : name, referencedColumnName, foreignKey(DDL), unique, nullable, insertable, updatable, columnDefinition, table

 

5.1.5 @ManyToOne

∘ 주요 속성 : optional, fetch, cascade, targetEntity

 

 

5.2 연관관계 사용

5.2.1 저장

∘ JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 함

∘ 회원 엔티티는 앞서 저장했던 팀 엔티티를 참조하고 저장

 

5.2.2 조회

∘ 객체 그래프 탐색(객체 연관관계를 사용한 조회)

  - member.getTeam()

 

∘ 객체지향 쿼리 JPQL 사용

  - 회원이 팀과 관계를 가지고 있는 필드 m.team을 통해서 Member와 Team을 조인

 

5.2.3 수정

∘ update 메소드가 따로 없고 알아서 변경사항 감지해서 데이터베이스에 반영하니까 연관관계를 변경하면 JPA가 자동으로 처리함

 

5.2.4 연관관계 제거

∘ member.setTeam(null);

∘ null로 설정해서 연관관계 제거

 

5.2.5 연관된 엔티티 삭제

∘ 연관된 엔티티를 삭제하려면 기존에 있던 연관관계 먼저 제거 후 삭제해야 됨

 

 

5.3 양방향 연관관계

∘ 양방향 연관관계는 회원에서 팀으로의 접근뿐만 아니라 팀에서 회원으로 접근하는 것도 가능하게 함

∘ 테이블은 외래 키 하나로 양방향 조회 가능

 

5.3.1 양방향 연관관계 매핑

∘ 팀과 회원의 일대다 관계를 위해 팀 엔티티에 List<Member> members 추가, @OneToMany 추가

 

5.3.2 일대다 컬렉션 조회

∘ team.getMembers() : 팀에서 회원 컬렉션으로 객체 그래프 탐색을 이용해 회원 조회

 

 

5.4 연관관계의 주인

mappedBy는 연관관계의 주인을 지정하기 위해 필요

∘ 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나이므로 외래 키를 관리할 연관관계의 주인이 필요

 

5.4.1 양방향 매핑의 규칙: 연관관계의 주인

∘ 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있음

∘ 주인이 아닌 쪽은 읽기만 할 수 있음

 

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

∘ 연관관계의 주인은 테이블에 외래 키가 있는 곳으로 정해야 됨

 

 

5.5 양방향 연관관계 저장

∘ 주인이 아닌 방향 team1.getMember() 은 따로 값을 입력하지 않아도 외래 키 값이 정상 입력됨

∘ 엔티티 매니저는 연관관계의 주인 Member.team 에 입력된 값을 사용해서 외래 키 관리

 

 

5.6 양방향 연관관계의 주의점

∘ 양방향 연관관계를 설정한 후에 연관관계의 주인에는 값을 입력하지 않고 주인이 아닌 곳에만 값을 입력하는 실수가 흔함. 외래 키 값이 정상적으로 저장되지 않을 때 먼저 확인해봐야 할 점.

∘ 연관관계 주인에 값을 입력하지 않으면 외래 키 값이 null로 설정됨

 

5.6.1 순수한 객체까지 고려한 양방향 연관관계

∘ 연관관계의 주인뿐만 아니라 주인이 아닌 곳에도 값을 써주는 것이 좋음

∘ 객체 관점에서 양쪽 방향에 모두 값을 입력해주는 것이 안전

∘ 양쪽에 연관관계 설정

 

5.6.2 연관관계 편의 메소드

∘ member.setTeam(team)과 team.getMembers().add(member)을 각각 호출하면 실수 발생 가능성 높음

  ⇒ setTeam() 메소드 하나만으로 양방향 관계를 모두 설정하도록 변경

∘ 한 번에 양방향 관계를 설정하는 메소드 : 연관관계 편의 메소드

 

5.6.3 연관관계 편의 메소드 작성 시 주의사항

∘ 연관관계를 변경할 때는 기존의 연관관계를 삭제해야 됨

 

 

5.7 정리

∘ 양방향은 연관관계의 주인인 단방향 매핑에 주인이 아닌 연관관계를 하나 추가한 것

  ⇒ 양방향은 단방향 매핑에 반대방향으로 객체 그래프 탐색 기능을 추가한 것

∘ 단방향 매핑만으로 테이블과 객체의 연관관계 매핑은 완료됨

∘ 양방향 연관관계를 매핑하려면 객체에서 양쪽 방향을 모두 관리해야 함