JPA

[JPA 10] 연관관계 - 연관관계 매핑 편의성

snowkit 2022. 3. 10. 21:08

JPA 연관관계 매핑의 편의성

  • DB에 실제로 저장되는 값은 외래 키밖에 없다
  • 연관관계 매핑을 사용하여 Entity를 컴포지션하는 경우와, 연관관계 매핑을 사용하지 않고 외래 키를 선언하는 경우의 차이점에 대해 알아본다

JPA 연관관계 매핑을 사용하는 경우

Entity

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;
}
@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members;
}

조회

Member member = entityManager.find(Member.class, 1L);
Team team = member.getTeam();
List<Member> members = team.getMembers();
  • @ManyToOne, @OneToMany등의 연관관계 매핑을 사용하는 경우
    • Member에서 Team을, Team에서 Member 리스트를 바로 가져올 수 있다

JPA 연관관계 매핑을 사용하지 않고 외래 키를 선언하는 경우

Entity

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @Column(name = "team_id")
    private Long teamId;
}
@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

조회

Member member = entityManager.find(Member.class, 1L);
Team team = entityManager.find(Team.class, member.getTeamId());
List<Member> members = entityManager.createQuery("SELECT m FROM Member m WHERE m.teamId = :teamId, Member.class)
    .setParameter("teamId", team.getId())
    .getResultList();
  • member.getTeam() 대신 entityManager.find() 같은 메소드로 연관된 Entity를 일일히 가져와야 한다
    • 쿼리할 때마다 일일히 JPQL로 JOIN 쿼리 작성 필요 → 생산성 저하
  • 이 외에도 entityManager.persist() 순서처럼 신경써야 할 것들이 있다

'JPA' 카테고리의 다른 글

[JPA 12] 연관관계 - @ManyToMany  (0) 2022.03.10
[JPA 11] 연관관계 - @OneToOne  (0) 2022.03.10
[JPA 9] 연관관계 - 저장, 변경  (0) 2022.03.10
[JPA 8] 연관관계 - 방향성  (0) 2022.03.10
[JPA 7] 연관관계 - @OneToMany  (0) 2022.03.10