[Spring/JPA] 연관관계 매핑 기초

rhkswls98·2023년 1월 4일
0

JPA 기본편

목록 보기
3/7
post-thumbnail

🌍 연관관계가 필요한 이유

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

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

1. 단방향 연관관계

1) 객체 지향 모델링

  • 객체 연관관계 사용

@Entity
public class Member {
	@Id @GeneratedValue
    private Long id;
    
    @Column(name = "USERNAME")
    private String name;
    private int age;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    ---
}
@Entity
public class Team{
	@Id @GeneratedValue
    private Long id;
    
    private  String name;
    
    ---
}
  • 객체의 참조와 테이블의 외래 키를 매핑

  • ORM 매핑

//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);

//회원 저장
Member member = new Member();
member.setName("member1");

//단방향 연관관계 설정, 참조 저장
member.setTeam(team);

em.persist(member);
  • 연관관계 저장

//조회
Member findMember = em.find(Member.class, member.getId());

//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
  • 참조로 연관관계 조회 - 객체 그래프 탐색

//새로운 팀B
Team teamB = new Team();
teamB.setName("TeamB");
em.persist(teamB);

//회원1에 새로운 팀B 설정
member.setTeam(teamB);
  • 연관관계 수정

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

1) 양방향 매핑

@Entity
public class Member {
	@Id @GeneratedValue
    private Long id;
    
    @Column(name = "USERNAME")
    private String name;
    private int age;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    ---
}
  • Member 엔티티는 단방향과 동일합니다.
@Entity
public class Team{
	@Id @GeneratedValue
    private Long id;
    
    private  String name;
    
    //양방향에서 추가된 부분
    @OneToMany(mappedBy = "team")
    List<Member> members = new ArrayList<Member>();
    ---
}
  • 양방향 매핑에서는 Team 엔티티에 컬렉션이 추가되었습니다.
//조회
Team findTeam = em.find(Team.class, team.getId());

//역방향 조회가 가능합니다.
int memberSize = findTeam.getMembers().size();
  • 반대 방향으로 객체 그래프 탐색이 가능합니다.

2) 객체와 테이블이 관계를 맺는 차이

  • 객체 연관관계 = 2개
    • 회원 -> 팀 연관관계 1개 (단방향)
    • 팀 -> 회원 연관관계 1개 (단방향)
  • 테이블 연관관계 = 1개
    • 회원 <-> 팀 연관관계 1개 (양방향)

3) 객체의 양방향 관계

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개로 이루어져있습니다.

  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 합니다.

4) 테이블의 양방향 연관관계

  • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리합니다.

  • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계를 가집니다. (양쪽으로 조인 가능)

select *
from MEMBER M
join TEAM T on M.TEAM_ID = T.TEAM_ID

select *
from TEAM T
join MEMBER M on T.TEAM_ID = M.TEAM_ID

3. 양방향 매핑 규칙

1) 둘 중 하나로 외래 키를 관리해야 합니다.

2) 연관관계의 주인

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정합니다.

  • 연관관계의 주인만이 외래 키를 관리합니다.(등록, 수정)

  • 주인이 아닌쪽은 읽기만 가능합니다.

  • 주인은 mappedBy 속성 사용 X

  • 주인이 아니면 mappedBy 속성으로 주인을 지정합니다.

🔧 누구를 주인으로 정해야하는가 ?

  • 외래 키가 있는 곳을 주인으로 정합니다.

  • 이 예제에서는 Member.team 이 연관관계의 주인이 될 수 있습니다.

[Reference]

자바 ORM 표준 JPA 프로그래밍 - 기본편 링크

profile
꺾이지 말자 :)

0개의 댓글