연관관계-문제

XingXi·2023년 12월 29일
0

JPA

목록 보기
9/23
post-thumbnail

🍕 Reference

자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런
블로그 참조!

Table

b5df2249af0c/image.png)다음과 같은 Table이 존재하고 Application 에서 관리하려고 한다.
이를 위한 클래스 다이어 그램은 다음과 같은 것이다.

Object

그리고 이를 위한 class 구성은 다음과 같을 것이다.

Member.java

@Entity
public class Member
{
    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "USER_NAME")
    private String userName;

    private Long teamId;
}

Team.java

@Entity
public class Team
{
    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;

    private String teamName;
}

이제 두 객체를 연관지어 DB 에 저장해 보자

"memeber1"이라는 member entity 는
"A Team" 이라는 Team Entity 와 연관

main

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 조회 결과

DB 에서 DML 을 작성하면 값이 잘들어간 것을 확인할 수 있고
JOIN도 정상적으로 작동하는 것을 볼 수 있다.

문제점

객체처럼 사용하기엔 어렵다.

Member member = new Member();
member.getTeam();

이 처럼 그래프탐색이 불가능하다.
DB 테이블은 연관관계를 외래키를 사용하여 다른 테이블과 연결 할 수 있지만
객체는 다른 객체와의 연관관계를 참조를 사용하여 정의한다.
객체 참조의 장점을 살리지 못한다.

위의 조건에서 해당 member 의 Team 이름을 알고싶다

member 에서 Team 을 조회

main

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 를 사용하여 연관관계를 정의하기 하더라도
결국 데이터베이스에 의존적으로 정의할 수 밖에 없다.
그로 인한 불필요한 조회 발생이나 객체 참조를 활용한 그래프탐색은 불가능해 보인다.

이 문제를 해결하기 위해 JPA 연관관계에 대한 기능을 제공한다.

0개의 댓글