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 정리
∘ 양방향은 연관관계의 주인인 단방향 매핑에 주인이 아닌 연관관계를 하나 추가한 것
⇒ 양방향은 단방향 매핑에 반대방향으로 객체 그래프 탐색 기능을 추가한 것
∘ 단방향 매핑만으로 테이블과 객체의 연관관계 매핑은 완료됨
∘ 양방향 연관관계를 매핑하려면 객체에서 양쪽 방향을 모두 관리해야 함
'Back-End > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[JPA] 자바 ORM 표준 JPA 프로그래밍_7장 (0) | 2023.06.24 |
---|---|
[JPA] 자바 ORM 표준 JPA 프로그래밍_6장 (0) | 2023.06.20 |
[JPA] 자바 ORM 표준 JPA 프로그래밍_4장 (0) | 2023.05.29 |
[JPA] 자바 ORM 표준 JPA 프로그래밍_3장 (0) | 2023.05.29 |
[JPA] 자바 ORM 표준 JPA 프로그래밍_1장 (0) | 2023.05.20 |