빙응의 공부 블로그
[Spring]자바 ORM 표준 JPA 프로그래밍 - 연관 관계 매핑 본문
📝연관 관계 매핑
객체와 테이블의 연관관계는 차이점이 있다.
객체의 참조와 테이블의 외래 키 같은 것 말이다.
이 포스팅에서는 서로 다른점과 방법을 알아볼 것이다.
객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.
객체를 테이블에 맞추어 모델링 해보자(연관 관계가 없는 객체)
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
위처럼 할 수 있지만 위 코드에는 큰 문제가 있다.
분명 바로 전 포스팅에서는 JPA가 테이블을 객체처럼 사용할 수 있게 해준다 하였다.
테이블은 외래 키로 조인을 사용해 연관 테이블을 찾지만, 객체는 참조를 사용하여 연관된 객체를 찾는다.
우리가 JPA를 사용하는 핵심 이유를 기억하자!
테이블 매핑도 객체의 참조처럼 사용할 수 있게 하는 것이다.
해당 개념을 기준으로 코드를 작성해보자!
이번에는 테이블의 다양한 연관관계를 사용하여 알아보자
🚩단방향 연관관계
단방향 연관관계란 한쪽만 정보를 가지고 참조하는 것을 말한다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
이렇게 하면 연관관계를 참조로 조회할 수 있게 된다. 즉 객체지향적으로 테이블을 사용할 수 있다.
그 이유는 JPA가 연관관계도 매핑해주기 때문이다.
Team findTeam = em.find(Member.class, member.getId()).getTean().getId();
🚩양방향 연관관계
양방향 연관관계는 둘다 관계를 맺는 대상을 가지고 있는 것이다.
객체의 양방향 관계
객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개이다.
객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
테이블의 양방향 연관관계
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
외래키 하나로 양방향으로 조인 참조가 가능하다.
연관관계의 주인
위 그림을 보자 양방향 연관관계를 매핑 시에 2개 모두 외래 키로 들어온다. 이렇게 되면 외래키 업데이트에 대한 책임이
2명이 생기므로 둘 중 하나로 외래키를 관리해줘야 한다.
규칙은 다음과 같다.
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래 키를 관리(등록,수정)
- 주인이 아닌쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용 X
- 주인이 아니면 mappedBy 속성으로 주인 지정
팁! 주인을 결정하는 것은 테이블 설계 시 외래 키가 있는 곳을 하면 된다.
위 표 기준으로 보면 Member.team이 연관관계의 주인이다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
✔정리
단방향 매핑만으로도 이미 연관관계 매핑은 완료
양방향 매핑은 반대 반향으로 조회 기능이 추가된 것 뿐이다.
단방향 매핑으로 설계하고 양방향은 필요할 때만 추가해도도 된다. 테이블에 영향을 주지 않기 때문
외래 키가 있는 쪽을 주인으로 정하자!
'Spring > 인프런_JPA' 카테고리의 다른 글
[Spring] 자바 ORM 표준 JPA 프로그래밍 - 고급 매핑 (0) | 2024.02.18 |
---|---|
[Spring]자바 ORM 표준 JPA 프로그래밍 - 다양한 연관관계 (1) | 2024.02.18 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - 엔티티 매핑 (1) | 2024.02.15 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - 영속성 컨텍스트 (0) | 2024.02.14 |
[Spring]자바 ORM 표준 JPA 프로그래밍 - JPA 시작하기 (0) | 2024.02.13 |