인프라 감자 2022. 12. 23. 15:49

연관관계가 필요한 이유

‘객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다.' –조영호(객체지향의 사실과 오해)

대학교 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