연관관계 매핑

그저늅늅·2021년 11월 30일
0

JPA

목록 보기
4/6

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

Inflearn의 김영한 강사님 강의 [자바 ORM 표준 JPA 프로그래밍 - 기본편] 을 보고 정리했습니다.


연관관계 매핑

테이블에 맞춰 외래키를 그대로 가져오며 설계하는 방식이 아니라 좀 더 객체지향 스럽게 개발하는 방법

객체가 지향하는 패러다임과 관계형DB가 지향하는 패러다임이 다르기 때문에 그 차이를 이해해야 한다.

연관관계가 필요한 이유

  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.

시나리오

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

ex ) 연관관계가 없는 객체의 경우 - 협력 관계를 만들 수 없다.

  • 참조 대신 외래키를 그대로 사용한다.
  • @Entity public class Member { ... private Long TeamId; // 외래키 }
  • 외래 키 식별자를 직접 다룬다.
    • 회원이 팀에 소속될 때
    • member.setTeamId(team.getId()); // 객체지향스럽지 못하다. // member.setTeam(...) 이 되는게 더 좋을것 같은데
    • 회원을 조회하고, 회원이 어떤 팀에 소속되었는지 알고 싶을 때.
    • findMember = em.find(Member.class, member.getId); findTeamId = findMember.getTeamId(); findTeam = em.find(Team.class, findTeamId); // 필요할때마다 계속 JPA로 요청해야한다.
    • memberteam 간의 협력 관계가 만들어지지 않는다. member를 찾았지만, member가 속한 team을 찾기 위해 한번 더 요청해야 한다.

단방향 연관관계

ex) 객체 연관관계를 사용할 경우.

public class Team {
    ...
}
@Entity
public class Member {
    ...
    @ManyToOne // 다대일 관계에서 멤버가 '다' 팀이 '일'
    @JoinColumn(name = "TEAM_ID") // Team 객체와 TEAM_ID 외래키와 연관관계 매핑.
    private Team team;
}
  • 회원이 팀에 소속될 때
  • member.setTeam(team);
  • 회원을 조회하고, 회원이 어떤 팀에 소속되어있는지 알고 싶을 때
  • findMember = em.find(Member.class, member.getId) Team findTeam = findMember.getTeam(); // 멤버를 통해 바로 팀을 찾을 수 있다.
  • 연관관계 수정
  • Team newTeam = em.find(Team.class, someTeam.getId) findMember.setTeam(newTeam)
profile
양현석

0개의 댓글