자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런
블로그 참조!
b5df2249af0c/image.png)다음과 같은 Table이 존재하고 Application 에서 관리하려고 한다.
이를 위한 클래스 다이어 그램은 다음과 같은 것이다.
그리고 이를 위한 class 구성은 다음과 같을 것이다.
@Entity
public class Member
{
@Id
@GeneratedValue
private Long id;
@Column(name = "USER_NAME")
private String userName;
private Long teamId;
}
@Entity
public class Team
{
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String teamName;
}
이제 두 객체를 연관지어 DB 에 저장해 보자
"memeber1"이라는 member entity 는
"A Team" 이라는 Team Entity 와 연관
public static void main(String[] args)
{
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try
{
Team team = new Team();
team.setTeamName("A TEAM");
em.persist(team);
Member member = new Member();
member.setUserName("member1");
member.setTeamId(team.getId());
em.persist(member);
et.commit();
}
catch (Exception e)
{ et.rollback(); }
finally
{ em.close(); }
emf.close();
}
DB 에서 DML 을 작성하면 값이 잘들어간 것을 확인할 수 있고
JOIN
도 정상적으로 작동하는 것을 볼 수 있다.
객체처럼 사용하기엔 어렵다.
Member member = new Member();
member.getTeam();
이 처럼 그래프탐색이 불가능하다.
DB 테이블은 연관관계를 외래키를 사용하여 다른 테이블과 연결 할 수 있지만
객체는 다른 객체와의 연관관계를 참조를 사용하여 정의한다.
객체 참조의 장점을 살리지 못한다.
위의 조건에서 해당 member 의 Team 이름을 알고싶다
member 에서 Team 을 조회
try
{
Team team = new Team();
team.setTeamName("A TEAM");
em.persist(team);
Member member = new Member();
member.setUserName("member1");
member.setTeamId(team.getId());
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
et.commit();
지금 처럼 Member 를 조회한 뒤
member 의 TeamId 를 사용하여 다시 Team 을 조회한다.
2번의 조회가 발생한다.
SUMMARY
Application 에서 JPA 를 사용하여 연관관계를 정의하기 하더라도
결국 데이터베이스에 의존적으로 정의할 수 밖에 없다.
그로 인한 불필요한 조회 발생이나 객체 참조를 활용한 그래프탐색은 불가능해 보인다.