꿈꾸는 새벽하늘

05장. 연관관계 매핑 기초 본문

🌿 Spring & Spring Boot/📗 자바 ORM 표준 JPA 프로그래밍

05장. 연관관계 매핑 기초

rovemin 2023. 6. 26. 23:20
  • 방향(Direction): 방향은 객체관계에만 존재하고 테이블 관계는 항상 양방향이다.
    • 단방향: 둘 중 한 쪽만 참조하는 것
    • 양방향: 양쪽 모두 서로 참조하는 것
  • 다중성(Multiplicity)
    • 다대일(N:1)
    • 일대다(1:N)
    • 일대일(1:1)
    • 다대다(N:M)
  • 연관관계의 주인(Owner): 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다.

1. 단방향 연관관계

  • 객체 연관관계
    • 회원 객체와 팀 객체는 단방향 관계
    • 객체는 참조(주소)로 연관관계를 맺는다. => a.getB().getC() 사용
  • 테이블 연관관계
    • 회원 테이블과 팀 테이블은 양방향 관계
    • 테이블은 외래 키로 연관관계를 맺는다. => 조인(JOIN) 사용
    • A JOIN B 와 B JOIN A 모두 가능

객체 그래프 탐색: 참조를 사용해서 객체의 연관관계를 탐색하는 것

Team findTeam = member1.getTeam();

객체 관계 매핑

@Entity
public class Member {
    @Id
    @Column (name = "MEMBER_ID")
    private String id;
    
    // 연관관계 매핑
    @ManyToOne
    @JonColumn (name = "TEAM_ID")
    private Team team;
    
    // 연관관계 설정
    public void setTeam(Team team) {
    	this.team = team;
    }
    
    ...
}
@Entity
public class Team {
    @Id
    @Column (name = "TEAM_ID")
    private String id;
    
    ...
}

@ManyToOne: 다대일(N:1) 관계의 매핑 정보
@JonColumn(name = "TEAM_ID"): 외래 키 매핑 시 사용

2. 연관관계 사용

연관관계가 있는 엔티티 조회 방법

  • 객체 그래프 탐색 (객체 연관관계를 사용한 조회): member.getTeam() 사용
  • 객체지향 쿼리 사용 (JPQL)

연관관계 제거

private static void deleteRelation(EntityManager em) {
    Member member1 = em.find(Member.class, "member1");
    member1.setTeam(null);	// 연관관계 제거
}

연관된 엔티티 삭제

연관된 엔티티 삭제하려면 기존에 있던 연관관계를 먼저 제거해야 한다.

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

member1.setTeam(null);	// 회원1 연관관계 삭제
member2.setTeam(null);	// 회원2 연관관계 삭제
em.remove(team);	// 팀 삭제

3. 양방향 연관관계

@Entity
public class Team {
    @Id
    @Column (name = "TEAM_ID")
    private String id;
    
    // == 추가 == //
    @OneToMany (mappedBy = "team")
    private List<Member> members = new ArrayList<Member>();
    
    ...
}

회원과 팀은 다대일 관계, 팀에서 회원은 일대다 관계이다.

일대다 관계는 여러 건과 연관관계를 맺을 수 있으므로  컬렉션을 사용해야 한다.

4. 연관관계의 주인

연관관계의 주인(Owner): 테이블의 외래 키 관리를 위해 두 객체 연관관계 중 하나를 정하는 것

  • 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있다. (등록, 수정, 삭제)
  • 주인이 아닌 쪽은 읽기만 가능하다. (조회)
  • 주인은 mappedBy 속성을 사용하지 않고, 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정한다.

5. 양방향 연관관계 저장

양방향 연관관계는 연관관계의 주인이 외래 키를 관리한다.

따라서 주인이 아닌 방향은 값을 설정하지 않아도 데이터베이스에 외래 키 값이 정상 입력된다.

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

team1.getMembers().add(member1)	// 무시 (연관관계의 주인이 아님)
team1.getMembers().add(member2)	// 무시 (연관관계의 주인이 아님)

member1.setTeam(team1);	// 연관관계 설정 (연관관계의 주인)
member2.setTeam(team1);	// 연관관계 설정 (연관관계의 주인)

'🌿 Spring & Spring Boot > 📗 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

07장. 고급 매핑  (1) 2023.07.11
06장. 다양한 연관관계 매핑  (0) 2023.07.03
04장. 엔티티 매핑  (0) 2023.06.03
03장. 영속성 관리  (0) 2023.05.29
02장. JPA 시작  (0) 2023.05.22