프레임워크(Framework)/JPA

[JPA] 연관관계 매핑이란? - 엔티티 매핑(Entity Mapping) - 4

잇트루 2022. 12. 2. 01:08
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

Intro

엔티티 매핑과 연관관계 매핑

JPA를 이용해 데이터베이스의 테이블과 상호 작용(데이터 저장, 수정, 조회, 삭제 등) 하기 위해 먼저 해야 하는 작업은 데이터베이스 테이블과 엔티티 클래스 간의 매핑 작업이다.

 

엔티티 매핑 작업은 객체와 테이블 간의 매핑, 기본키 매핑, 필드와 컬럼 간의 매핑, 엔티티 간의 연관 관계 매핑 등으로 나눌 수 있다.

 

특히 엔티티 간의 연관 관계 매핑은 JPA에서 가장 어려우면서도 중요하다.

 

엔티티 매핑

  • 객체와 테이블 간의 매핑 : @Entity, @Table
  • 필드와 컬럼 간의 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn, @OneToMany, @ManyToMany

 

연관관계 매핑

연관관계 매핑은 엔티티 클래스 간의 관계를 만들어 주는 것을 의미한다.

JPA의 연관관계 매핑은 참조하는 방향성을 기준으로 단방향 연관관계와 양방향 연관관계로 구분할 수 있다.

또한, 엔티티 간에 참조할 수 있는 객체에 따라서 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)의 연관관계로 나뉜다.

 

연관관계가 필요한 이유

연관관계가 필요한 이유를 이해하기 위해 다음과 같이 예상 시나리오를 구성한다.

  • 회원(Member)과 팀(Team)이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일(N:1) 관계이다.

 

연관관계가 없는 객체

연관관계가 없는 객체는 객체를 데이터베이스 테이블에 맞추어 모델링하는 경우를 의미한다.

이 경우 다음과 같은 형태로 나타낼 수 있다.

관계형 데이터베이스 테이블

  • 하나의 팀에는 여러 명의 멤버가 소속될 수 있다.
  • 따라서 Member와 Team은 다대일(N:1) 관계이기 때문에 MEMBER 테이블에는 외래 키로 TEAM_ID를 가진다.

 

객체를 테이블에 맞추어 모델링

  • 관계형 DB 테이블과 같이 객체를 모델링하면, Member 클래스에는 teamId를 가지게 된다.

 

 

연관관계가 없는 객체의 문제점

위 객체를 코드로 표현하면 다음과 같이 나타낼 수 있다.

Member

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;

    @Column(name = "TEAM_ID")
    private Long teamId;

    // Getter
    // ...
    // Setter
    // ...
}

 

Team

@Entity
public class Team {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;

    // Getter
    // ...
    // Setter
    // ...
}

 

실행 코드

// 팀 저장
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의 팀을 조회하고자 하는 경우
Member findMember = em.find(Member.class, member.getId());

// Member에서 찾은 findTeamId를 통해 Team 객체의 참조가 불가능
Long findTeamId = findMember.getTeamId();

// 연관관계가 없음
Team findTeam = em.find(Team.class, team.getId());

tx.commit();

문제점

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

  • 테이블은 외래 키로 조인을 사용하여 연관된 테이블을 찾는다.
  • 객체는 참조를 사용하여 연관된 객체를 찾는다.
  • 따라서 위 경우에는 Member에서 찾은 teamId를 통해 팀 객체를 조회하거나 사용할 수가 없다.

 

 

따라서 클래스 간에 관계를 만들어서 객체 참조를 할 수 있도록 해야 한다.

  • JPA의 연관관계 매핑은 단방향 연관관계와 양방향 연관관계로 구분
  • 엔티티 간에 참조할 수 있는 객체에 따라 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1) 매핑
반응형