오봉이와 함께하는 개발 블로그

JPA - 단방향 연관관계 본문

BE/JPA

JPA - 단방향 연관관계

오봉봉이 2022. 6. 24. 21:27
728x90

단방향 연관관계

  • 예제 시나리오
    • 회원과 팀이 있다.
    • 회원은 하나의 팀에만 소속될 수 있다.
    • 회원과 팀은 다대일 관계다.(회원 = N, 팀 = 1)

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

위 사진을 코드로 구현한 엔티티는 아래와 같다.

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    private Long id;
    @Column(name = "USERNAME")
    private String name;
    @Column(name = "TEAM_ID")
    private Long teamId;
}
//...............................
@Entity
public class Team {
    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;
}

아래 코드를 통해 값을 넣어준다.

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("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);

JPA를 통해 DB에서 계속 값을 꺼내야 하는 문제가 발생한다.
이는 연관관계가 없기 때문.

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

테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는데, 객체는 참조를 사용해서 연관된 객체를 찾는다.
이렇게 테이블과 객체 사이에는 큰 간격이 있다.

객체 지향 모델링(객체 연관관계 사용)

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    private Long id;
    @Column(name = "USERNAME")
    private String name;
//    @Column(name = "TEAM_ID")
//    private Long teamId;
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}
  • private Team team; 만 작성하게 되면 오류 발생

    • JPA에게 어떤 연관관계가 매핑되어 있는지 언급하지 않기 때문
  • @ManyToOne

    • DB 입장에서 작성해야 한다.
    • Member = N, Team = 1 관계
      • Member가 N이기 때문에 Member의 입장에서 Team은 ManyToOne관계
  • @JoinColumn(name = "TEAM_ID")

    • 매핑 관계는 테이블과 연관되어 있다.
    • Member 테이블에서 TEAM_ID가 외래키기 때문에 TEAM_ID와 JoinColumn 한다.

객체 지향 모델링(ORM 매핑)

위 코드를 통해 다음과 같은 연관관계가 매핑 됐다.

연관관계 저장

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("Member1");
member.setTeam(team); // 단방향 연관관계 설정, 참조 저장
em.persist(member);

위와 같이 하면 JPA가 알아서 Team에서 PK값을 꺼내 Member에 FK로 사용한다.

참조를 통한 연관관계 조회 - 객체 그래프 탐색

Member findMember = em.find(Member.class, member);
Team findTeam = findMember.getTeam();

여러 과정을 거치지 않고 바로 바로 꺼내서 사용할 수 있다.

출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90
Comments