[JPA] 연관관계 매핑

1

JPA

목록 보기
6/16
post-thumbnail

객체는 참조를 사용해서 관계를 맺고 테이블은 포린 키를 사용해서 관계를 맺는다. 하지만 둘은 완전히 다른 특징을 가지기 때문에 객체 관계 매핑에서 가장 어려운 부분이 바로 객체 연관관계와 테이블의 연관관계를 매핑하는 일이다.
따라서 우리는 객체의 참조와 테이블의 포린 키를 매핑하는 것을 알아보자

  • 연관관계에서 나오는 키워드들은 내가 저번에 올린 연관관계 글에 자세히 다루었다.

단방향 연관관계

팀과 구성원으로 예들 들어 알아보자

  • 구성원과 팀이 있다.

  • 구성원은 하나의 팀에만 소속될 수 있다.

  • 구성원과 팀은 다대일 관계이다.


객체 연관관계

  • 구성원 객체는 팀 객체와 연관관계를 맺는다.

  • 구성원 객체와 팀 객체는 단방향 관계이다. 구성원은 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다.


테이블 연관관계

  • 구성원 테이블은 포린 키로 테이블과 연관관계를 맺는다.

  • 구성원 테이블과 팀 테이블은 양방향 연관관계이다.
    구성원과 팀은 서로 알 수 있다. -> 포린 키 하나로 양방향 조회


객체 연관관계 vs 테이블 연관관계

  • 객체는 참조로 연관관계를 맺는다.
  • 테이블은 포린 키로 연관관계를 맺는다.

이 둘은 비슷해 보이지만 매우 다른 특징을 가진다. 데이터를 조회할 때 객체는 참조를 사용하지만 테이블은 조인(JOIN)을 사용한다.

  • 참조를 사용하는 객체의 연관관계는 단방향이다.
    A -> B (a,b)
  • 포린 키를 사용하는 테이블의 연관관계는 양방향이다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
    A -> B (a,b)
    B -> A (b,a)

객체 관계 매핑

연관관계에는 순수한 객체를 사용하는 방법과 테이블만 사용하는 방법, JPA를 사용한 매핑 방법이 있다. 우리는 JPA를 사용한 매핑 방법을 알아보자


매핑한 구성원 엔티티

@Entity
@Getter
@Setter
public class Member{

	@Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    // 연관관계 매핑
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    // 연관관계 설정
    public void setTeam(Team team){
    	this.team = team;
    }
    

매핑한 팀 엔티티

@Getter
@Setter
@Entity
public class Team{
	
    @Id
    @Column(name = "TEAM_ID")
    private String id;
    
    private String name;
    }

  • ManyToOne - 다대일(N:1) 관계라는 매핑 정보다. 연관관계를 매핑할 때 다중성을 나타내는 어노테이션은 필수다.

  • @JoinColumn(name = "TEAM_ID") - 포린 키를 매핑할 때 사용한다. 생략할 수 있다.


양방향 연관관계 매핑

매핑한 구성원 엔티티

@Getter
@Setter
@Entity
public class Member{
	
    @Id
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    @ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Team team;
    
    public void setTeam(Team team){
    	this.team = team;
    }

매핑한 팀 엔티티

@Getter
@Setter
@Entity
public class Team{
	
    @Id
    @column(name = "TEAM_ID")
    private String id;
    
    private String name;
    
    @OnetoMany(mappedBy = "team")
    private List<Member> members = new ArrayList<Member>();

팀과 구성원은 일대다 관계이다. 따라서 팀 엔티티에 컬렉션인 List를 사용했다. 그리고 일대다 관계를 매핑하기 위해 @OneToMany 매핑 정보를 사용했다. mappedBy 속성은 양방향 매핑일 때 사용하는대 반대쪽 매핑의 필드의 이름을 값으로 주면 된다.


양방향 매핑 - 연관관계의 주인

양방향 연관관계에서는 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 포린 키를 관리할 수 있다. 어떤 연관관계를 저인으로 정할지는 mappedBy 속성을 사용하면 된다.

  • 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.

연관관계의 주인을 정한다는 것은 포린 키의 관리자를 선택하는 것이다.

0개의 댓글