연관관계가 필요한 이유
‘객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.' –조영호(객체지향의 사실과 오해)
대학교 1학년 때 부터 공부했던 왜 객체지향 설계를 해야하는지에 대해 궁금하고 먼가 막혀있던 부분을 이 한줄이 해결해준 것 같다.
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다.
이 예제는 연관관계가 없는 객체이다.

@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;
…
}
//참조 대신에 왜리키를 그대로 사용하고있다.
//이렇게 팀을 저장하고 회원을 저장 할때
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); //외래키 식별자를 직접 다뤄 객체지향적이지 못한다.
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
Team findTeam = em.find(Team.class, team.getId()); //식별자로 다시 조회하고 있다
//두 요소다 객체지향적이지 못하다.
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 객체는 참조를 사용해서 연관된 객체를 찾는다. 테이블과 객체 사이에는 이런 큰 간격이 있다.
단반향 연관관계
객체 지향 모델링

@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
// @Column(name = "TEAM_ID")
// private Long teamId;
@ManyToOne//멤버 입장에서 n team 입장에서 하나 N : 1의 관계이다
@JoinColumn(name = "TEAM_ID")
private Team team;
…

//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
강의 출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'BackEnd > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
JPA 실전 예제2 - 연관관계 매핑 시작 (0) | 2022.12.23 |
---|---|
JPA 양방향 연관관계 (0) | 2022.12.23 |
JPA 실전 예제 1 - 요구사항 분석과 기본 매핑 (0) | 2022.12.23 |
JPA 엔티티 매핑(필드와 컬럼 매핑, 기본 키 매핑) (1) | 2022.12.22 |
JPA 엔티티 매핑(객체와 테이블 매핑) (0) | 2022.12.22 |