Lined Notebook

[Spring Data JPA] 09. JPA 단방향 연관관계

by ymkim

✔ 연관관계 매핑 기초

객체가 지향하는 패러다임과 RDB가 지향하는 패러다임의 차이를 이해한다.

  • 객체와 테이블 연관관계의 차이를 이해한다.
  • 객체의 참조와 테이블의 외래 키를 어떻게 매핑하는가?
  • 방향(Direction)
    • 단방향, 양방향
    • 다중성(Multiplicity)
      • 일대다(1:N), 다대일(N:1), 일대일(1:1), 다대다(N:M)
    • 연관관계의 주인
      • 객체 양방향 연관관계는 관리가 필요

✔ 연관관계가 필요한 이유

  • 객체지향 설계의 목표는 자율적인 객체들의 를 만드는 것이다
  • 협력 공동체

✔ 예제 시나리오

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

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

✅ 연관관계가 없는 객체 (RDBMS 관점)

✅ 객체를 테이블에 맞추어 모델링 하는 경우의 문제점

  • 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
  • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용하여 연관된 객체를 찾는다.
  • 테이블과 객체 사이에는 이러한 큰 간격 존재한다.
    • 테이블 == 외래키 조인
    • 객체 == 참조

✅ 단방향 연관관계

  • Member 테이블을 기준으로 Team은 1:N 인 상황
  • 회원은 여러명 = 팀은 한개
  • @ManyToOne
    • FK를 지정해주면 된다

JPA Main

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

	MemberTest member = new MemberTest();
	member.setUsername("member1");
	member.setTeam(team);
	em.persist(member);

	//조회
	MemberTest member1 = em.find(MemberTest.class, member.getId());
	Team findTeam = member1.getTeam();
	System.out.println("findTeam : " + findTeam.getName());

} catch (Exception e) {

} finally {
    em.close();
}

연관 관계 매핑 전

Team team = new Team();
team.setName("TeamA") //팀명 셋팅
em.persist(team);

MemberTest member = new MemberTest();
member.setUsername("member1");
member.setTeam(team.getTeamId()); //변경 전

연관 관계 매핑 후

Team team = new Team();
team.setName("TeamA") //팀명 셋팅
em.persist(team);

MemberTest member = new MemberTest();
member.setUsername("member1");
member.setTeam(team); //변경 후
  • JPA는 기본적으로 영속성 컨텍스트의 특성을 가짐
  • 외래키(FK)를 넣어주는 것이 아닌 참조 변수(team)를 넣어준다
  • @ManyToOne, @JoinColumn(name = “TEAM_ID”)로 매핑을 해둔 상황
  • Member, Team 테이블에 자동으로 PK(기본키 값), FK(외래키 값)가 셋팅 된다

참고 자료

블로그의 정보

기록하고, 복기하고

ymkim

활동하기