연관관계 매핑 기초

Sangkyeong Lee·2021년 5월 19일

[인프런]JPA

목록 보기
4/8

인프런 강의 < 자바 ORM 표준 JPA 프로그래밍 - 기본편 > 정리


  • 객체와 테이블 연관관계의 차이 이해하기
  • 객체의 참조와 테이블의 외래 키를 매핑

연관관계가 필요한 이유

예제

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

이 예제에서 하나의 팀(1)에 여러 명의 회원(N)이 속하므로 1:N관계이고, 회원은 팀 id를 외래키로 가진다.

객체를 테이블에 맞추어 모델링 하는 경우

객체지향적이지 않다.

참조 대신 외래 키 사용

@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;

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

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

@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;
}

외래 키 식별자를 직접 다룸

// 팀 저장
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 findMember = em.find(Member.class, member.getId());

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

결론

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


그 이유는 다음과 같다.

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

단방향 연관관계

객체 연관관계 사용

  • 다음 그림과 같이 Member에서 Team객체를 생성한다.
@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;

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

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

    @ManyToOne // 멤버가 N TEAM이 1이기 때문에
    @JoinColumn(name = "TEAM_ID")// 테이블에서의 외래 키를 매핑한다.
    private Team team; 

}

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

위의 예제에서 Member에서는 Team을 자유자재로 참조할 수 있지만 Team에서는 Member참조가 불가능 하다.

@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team") // 팀이 1 회원이 N 이고 Member 객체의 team 이라는 변수에 의해 매핑되어 있다는 뜻
    List<Member> members = new ArrayList<Member>(); // add 할때 null 포인트 에러를 피하기 위해 ArrayList로 초기화
}

연관관계의 주인과 mappedBy

테이블의 연관관계는 1개!!

  • 왜래 키 하나로 두 테이블의 연관관계를 관리할 수 있다.
  • 회원과 팀의 연관관계가 양방향으로 되어있음

객체 연관관계는 양방향 관계지만 서로 다른 단방향 관계 2개라고 봐야 된다.

  • 회원 -> 팀
    class Member{
        Team team;
    }
  • 팀 -> 회원
    class Team{
        Member member;
    }

연관관계의 주인


위의 그림처럼 Member테이블로 외래키를 관리할것인지 MEMBER테이블로 관리할것인지 정해야됨

양방향 매핑 규칙

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용X
  • 주인이 아니면 mappedBy 속성으로 주인 지정
  • 주인은 외래 키가 있는 곳으로 정한다.


< 자료 출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >

profile
💻Backend Developer

0개의 댓글