JPA - 연관관계 매핑 1

Sungjin·2021년 7월 9일
0

JPA

목록 보기
5/10
post-thumbnail

시나리오 가정

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

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

Member Entity

@Entity
 public class Member { 
 
 @Id @GeneratedValue
 @Column(name="member_id")
 private Long id;
 
 private String name;
 
 @Column(name = "team_id")
 private Long teamId; 
 } 

Team Entity

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

 }

각자의 table에 맞게만 객체가 생성된 상태이지 별다른 연관관계는 보이지 않습니다!

이렇게 별도의 연관관계 매핑 없이 만들어진 Entity는 외래키를 가지고 있는 쪽에서 외래키를 직접 다뤄줘야 합니다.

ex)

// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);

//회원 저장
Member member-new Member();
...
member.setTeamId(team.getId());  //외래 키를 직접 다룸
em.persist(member);

외래키를 가지고 있는 쪽 Member객체에서 Team의 객체를 참조하는 것이 아닌 team_id만을 갖고 있기 때문에 엔티티 매니저로 따로 따로 조회를 할 수 밖에 없습니다.
즉, 객체를 DB 테이블에만 맞추어 모델링하면 협력 관계를 만들 수 없다는 뜻이 됩니다.

단방향 연관관계

위 처럼 외래 키를 가지고 있는 객체에서 키를 아닌 객체를 직접 참조하게 만들어 봅시다!

Member Entity

@Entity
 public class Member { 
 
 @Id @GeneratedValue
 @Column(name="member_id")
 private Long id;
 
 private String name;
 
/* @Column(name = "team_id")
 private Long teamId; */
 
 @ManyToOne
 @JoinColumn(name="team_id")
 private Team team; //객체를 직접 참조
 } 

Meber Entity의 코드만 이런 식으로 수정하게 되면 단방향 연관관계가 성립되게 됩니다!

ex) 저장

// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);

//회원 저장
Member member-new Member();
...
member.setTeam(team);  //객체를 저장
em.persist(member);

외래 키를 가지고 있는 쪽에서 객체를 직접 참조하고 있기 때문에 엔티티 매니저로 Member만 조회하게 되면 member.getTeam()과 같은 코드로 따로 조회할 필요 없이 참조를 사용해서 조회를 할 수 있게 됩니다.

양방향 연관관계와 연관관계의 주인

단방향 연관관계에서는 Member Entity에서만 Team Entity를 참조하였습니다.
양방향 연관관계에서는 Member와 Team이 N:1관계 이므로 Member Entity에서는 Team객체 하나만 참조하면 됐지만, Team 객체에서는 연관된 Member들을 모두 참조하고 있어야 합니다. 즉, Member객체를 List형태로 여러개 참조합니다.

Team Entity

@Entity
 public class Team {
 
 @Id @GeneratedValue
 @Column(name="team_id")
 private Long id;
 
 private String name; 
 
 @OneToMany(mappedBy="team")
 private List<Member> members- new ArrayList<Member>()

 }

Team Entity의 코드만 이런 식으로 수정하면 됩니다.

  • 객체의 양방향 관계
    객체의 양방향 관계는 완전한 양방향 관계가 아닌 객체끼리의 단 방향 관계가 2개 매핑 된 것입니다. 위의 코드에서도 확인하실 수 있습니다.
  • 테이블의 양방향 관계
    테이블은 외래 키 하나로 두 테이블의 연관관계를 관리하죠. 즉, 외래 키 하나로 서로 Join이 가능하다는 말 입니다.
  • 그럼 연관관계에서 외래키의 주인으로는 누구를 설정해야 할까요?!?!?!
    • 양방향 매핑 규칙
      1. 객체의 두 관계중 하나를 연관관계의 주인으로 지정
      2. 연관관계의 주인이 외래 키를 관리
    • 외래 키가 있는 곳을 연관관계의 주인 입니다.
    • 외래키의 주인은 보통 연관관계 1:N에서 N쪽에 있는 객체를 주인으로 설정하거나 1:1상태라면 비즈니스 로직을 더 많이 활용하는 쪽을 주인으로 설정 해야 합니다.

      외래키의 주인을 N쪽에 넣는 이유는 생각해보면 간단합니다. 위 처럼 Member와 Team의 관계에서 만약 1쪽인 Team에 외래 키가 있다고 생각하여 봅시다. 그럼 DB 테이블에 저장될 때 Team 테이블에서 외래 키인 Member_id만 다른 중복된 인스턴스들이 생기게 될 것입니다..
      그리하여 외래 키의 주인은 N쪽 객체로 설정하여야 합니다!!

이상으로 포스팅을 마치겠습니다. 감사합니다:)

이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic

profile
WEB STUDY & etc.. HELLO!

0개의 댓글