N:1
), 일대다(1:N
), 일대일(1:1
), 다대다(N:M
) 이해: 객체지향 설계의 목표는 자율적인 객체들의 협력 공통체를 만드는 것이다.
2-1. 객체를 테이블에 맞추어 모델링( 연관관계가 없는 객체)
객체를 테이블에 맞추어 모델링 코드
package study.datajpa.dto;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/* 회원(Member) 엔티티*/
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}
/* 팀(Team) 엔티티 */
@Entity
public class Team{
@Id @GeneratedValue
private Long id;
private String name;
}
객체를 테이블에 맞춰 모델링 했을 경우 DB에 저장&조회하는 로직
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
/* 팀과 멤버를 저장하는 로직 */
Team team = new Team();
team.setName("teamA");
em.persist(team);
Member member = new Member();
member.setName("mamber1");
member.setTeamId(team.getId());
em.persist(member);
tx.commit();
}catch(Exception e ){
tx.rollback();
}finally {
em.close();
}
}
}
외래키 식별자를 직접다루고 있는데, 이럴 경우 문제는? → 조회할 때 역시 해당 외래키를 가지고 조인 쿼리를 직접짜야한다.
Q. member1
이 소속된 팀 정보를 조회하려면 어떻게 해야하는가?
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
매번 member를 우선 조회한 뒤 외래키를 뽑아 그것으로 팀의 정보를 조회해야한다.
→ 협력관계를 만들 수 없다.
결론: 외래키를 직접 관리하는 테이블에 맞춘 객체 모델링은 객체간의 협력관계를 만들 수 없고, 객체가 참조를 통해 연관객체를 찾는 다는 사상을 적용할 수 없다. 이 말은 객체지향 프로그래밍의 패러다임을 정면으로 반박하는 것.