목표
- 객체와 테이블 연관관계의 차이 이해하기
- 객체의 참조와 테이블의 외래 키 매핑하기
- 용어 이해 (방향 - 단방향, 양방향) (다중성- 다대일, 일대다, 일대일, 다대다) (연관관계의 주인 - 객체 양방향 연관관계는 관리 필요)
연관관계가 필요한 이유
→ 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원(N)과 팀(1)은 다대일 관계다.
객체를 테이블에 맞추어 모델링
객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력관계를 만들 수 없다.
- 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다.
- 객체는 참조를 사용해서 연관된 객체를 찾는다 → 테이블과 객체 사이에 간격 존재
객체지향 모델링
- 단방향 매핑
Member.class
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
//연관관계 매핑
@ManyToOne //멤버 입장에서는 N 팀 입장에서는 1
@JoinColumn(name = "TEAM_ID") // 관계를 할 때 join하는 컬럼
private Team team;
}
Team.class
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
JpaMain.class
//저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam(); // 참조를 사용해 연관관계 조회
System.out.println("findTeam = " + findTeam.getName());
//찾은 팀에서 내 팀으로 바꾸고 싶을 때
//Team newTeam = em.find(Team.class, 100L);
//findMember.setTeam(newTeam); ->DB의 외래키 값 업데이트
tx.commit();
- 양방향 매핑
테이블 연관관계는 변화 없다.
→ 테이블은 MEMBER와 TEAM 테이블의 TEAM_ID를 join하면 된다.
객체는 Member가 Team을 가져 Team에서 Member로 갈 수 있는 방법 없었지만,
→ Team에 List members 추가해 양쪽으로 갈 수 있게 함
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
연관관계의 주인과 mappedBy
mappedBy → 객체와 테이블 간에 연관관계를 맺는 차이를 이해해야 함!
- 객체
- 객체 연관관계 = 2개
- 참조가 두개 있어야 함
- Member → Team 연관관계 1개 (단방향), Team → Member 연관관계 1개 (단방향)
- 객체를 양방향으로 참조하려면 단방향 연관관계 2개!
- 테이블
- 테이블 연관관계 = 1개
- 회원 ↔ 팀의 연관관계 1개 (양방향 → 방향 없는 것)
- 외래 키 하나로 두 테이블의 연관관계를 관리
- MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐 → 양쪽으로 조인 가능
연관관계의 주인
- 양방향 매핑 규칙
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인만이 외래 키를 관리(등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능
- 주인은 mappedBy 속성 사용 x
- 주인이 아니면 mappedBy 속성으로 주인 지정
- 누구를 주인으로? → 외래 키가 있는 곳을 주인으로 정해라 (1:N에서 N쪽이 주인)
- 외래 키가 있는 곳이 다, 없는 곳이 1
- 1대다 매핑
- 1인 쪽에 mappedBy 걸기(Team.members) 가짜 매핑
- Member.team이 진짜 매핑
- 1대다 매핑
Member.class
@ManyToOne //멤버 입장에서는 N 팀 입장에서는 1
@JoinColumn(name = "TEAM_ID") // 관계를 할 때 join하는 컬럼
//값을 변경할 때 이것을 사용
private Team team;
Team.class
// 1대다 매핑에서 어떤 것과 연결되어 있는지(Member에서 team과 연결)
@OneToMany(mappedBy = "team")
// 조회만 가능, 여기에 값을 넣어도 아무 일도 X
private List<Member> members = new ArrayList<>();
참고 강의 :
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'JPA > 자바 ORM 표준 JPA 프로그래밍 - 기본편' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 6. 다양한 연관관계 매핑 (1) | 2022.12.29 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 5. 연관관계 매핑 기초(2) (0) | 2022.12.29 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 4. 엔티티 매핑 (0) | 2022.12.01 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 3. 영속성 관리 (0) | 2022.11.29 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 2. JPA 시작 (0) | 2022.11.28 |