연관 관계 매핑을 안했을 경우 문제점

현시기얌·2021년 11월 28일
0

JPA

목록 보기
7/14

예제 요구사항

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계다.

객체를 테이블에 맞추어 모델링 (연관 관계가 없는 객체)

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;

    private Long teamId;
}

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

실행 결과

    create table Member (
            id bigint generated by default as identity,
            teamId bigint,
            username varchar(255),
            primary key (id)
        )

    
    create table Team (
        id bigint generated by default as identity,
        name varchar(255),
        primary key (id)
    )

참조가 아닌 외래키 값을 그대로 가지고 있다.

객체를 테이블에 맞추어 모델링 (외래키 식별자를 직접 다룸)

  final Team team = Team.of("TeamA");
  em.persist(team);

  final Member member = Member.of("member1", team.getId());
  em.persist(member);
  
  //조회
  final Member findMember = em.find(Member.class, member.getId());

  // 연관 관계가 없음
  final Team findTeam = em.find(Team.class, findMember.getTeamId());

실행 결과

Hibernate: 
    /* insert hellojpa.domain.team.Team
        */ insert 
        into
            Team
            (id, name) 
        values
            (null, ?)
Hibernate: 
    /* insert hellojpa.domain.member.Member
        */ insert 
        into
            Member
            (id, teamId, username) 
        values
            (null, ?, ?)

Member와 Team이 연관관계가 맺어져 있지 않기 때문에 Member에서 해당하는 Team을 찾을 때 참조를 할 수 없어 Member.getTeamId()를 이용해 DB에 조회해야 한다는 번거로움이 있다.

정리

객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.
  • 테이블과 객체 사이에는 이러한 큰 간격이 있다.
profile
현시깁니다

0개의 댓글