[Spring JPA] 연관 관계 매핑

Eunho·2023년 5월 7일

spring

목록 보기
4/7

N:1

N:1 단방향 매핑

  • N 역할 클래스 : @ManyToOne, @JoinColumn(name="DB에서 외래키 열 이름")
// @ID가 붙은 identifier 필드는 @Entity가 붙은 클래스에 필수로 존재해야 하나, 
// 편의상 생략함
// ex1) Post : Board = N : 1
public class Post {
    @ManyToOne
    @JoinColumn(name = "BOARD_ID")
    private Board board;
}

public class Board {

}

// ex2) Order : Member = N : 1
public class Order {    
	@ManyToOne
    @JoinColumn(name="MEMBER_ID")
    private Member member;
}

public class Member {

}

DB에서 외래키는 N 테이블에 저장함
-> Post 테이블에 BOARD_ID 열을 외래 키로 가짐
-> @JoinColumn(name="BOARD_ID")

N:1 양방향 매핑

  • N 역할 클래스 : @ManyToOne, @JoinColumn(name="DB에서 외래키 열 이름")
  • 1 역할 클래스 : @OneToMany(mappedBy="연관 관계 주인 엔티티 명")

mappedBy

  • 연관 관계 주인
  • @OneToMany가 단방향이 아닐 때(양방향일 때)만 필요함

연관 관계 주인

  • 두 객체 중 외래 키 역할하는 필드명
  • N 클래스 필드 중 1 클래스 객체 필드명
  • ex) Post 테이블에서 BOARD_ID를 외래키로 가지는데,
    이 때 Post 클래스에서는 private Board board 필드를 가짐.
    -> 연관 관계 주인 = board
// ex1) Post : Board = N : 1
public class Post {
    @ManyToOne
    @JoinColumn(name = "BOARD_ID")
	private Board board;

}

public class Board {
	@OneToMany(mappedBy="board")
	private List<Post> posts = new ArrayList<>();

}

// ex2) Order : Member = N : 1
public class Order {
	@ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;
}

public class Member {
	@OneToMany(mappedBy="member")
    List<Order> orders = new ArrayList<>();

1:N

1:N 단방향 매핑

  • 1 역할 클래스 : @OneToMany, @JoinColumn(name = "DB에서 외래 키 이름")
// ex1) Board : Post = 1 : N
public class Board {
	@OneToMany
    @JoinColumn(name = "POST_ID")
	private List<Post> posts = new ArrayList<>();
}

public class Post {

}

// ex2) Member : Order = 1 : N

public class Member {
	@OneToMany
    @JoinColumn(name = "ORDER_ID")
    List<Order> orders = new ArrayList<>();
}
public class Order {

} 
  • 1:N 단방향 매핑은 실무에서 사용하지 않는다.
        Post post = new Post();
        entityManager.persist(post);

        Board board = new Board();
        board.getPosts().add(post);
        entityManager.persist(board);

-> 실행 결과실행 결과

  • board를 insert할 때 update 쿼리가 발생했다. DB에서는 원래 N 테이블에 외래키를 저장하는데, post 테이블(N)에서 board 테이블(1)을 참조할 수 없기 때문에 조인 후 업데이트 쿼리가 발생한 것이다.
  • 이렇게 되면 예상치 못한 추가 쿼리가 발생하게 되므로 좋지 않은 방법이다. 따라서 실무에 적합하지 않은 방법이다.
  • 그러나 N:1 연관 관계 매핑 후 1:N 연관 관계 매핑을 통해 양방향 매핑을 하는 경우가 있으므로 1:N 연관 관계 매핑 방법을 알고 있어야 한다.

1:1

  • 1:1 관계는 반대도 1:1이므로, 외래키를 가질 테이블을 선택할 수 있다.
  • ex1) 주 테이블 = 게시판, 대상 테이블 = 첨부 파일
  • ex2) 주 테이블 = 멤버, 대상 테이블 = 스탬프

1:1 주 테이블에 외래키, 단방향

// ex1)
public class Post {
	@OneToOne
    @JoinColumn("ATTACH_ID)
    private Attach attach;
}

public class Attach {

}

// ex2)
public class Member {
	@OneToOne
    @JoinColumn(name = "STAMP_ID")
    private Stamp stamp;
}

public class Stamp {

}

1:1 주 테이블에 외래 키, 양방향

// ex1)
public class Post {
	@OneToOne
    @JoinColumn("ATTACH_ID)
    private Attach attach;
}

public class Attach {
	@OneToOne(mappedBy = "attach")
    private Post post;
}

// ex2)
public class Member {
	@OneToOne
    @JoinColumn(name = "STAMP_ID")
    private Stamp stamp;
}

public class Stamp {
	@OneToOne(mappedBy = "stamp")
    private Member member;
}

1:1 대상 테이블에 외래키, 단방향

JPA에서 지원 X

1:1 대상 테이블에 외래키, 양방향

ex1)
public class Post {
	@OneToOne(mappedBy = "post")
    private Attach attach;
}

public class Attach {
	@OneToOne
    @JoinColumn("POST_ID")
    private Post post;
}

ex2)
public class Member {
	@OneToOne(mappedBy = "member")
    private Attach attach;
}

public class Attach {
	@OneToOne
    @JoinColumn("MEMBER_ID")
    private Member member;
}

1:1 주 테이블에 외래키, 양방향과 서로 바꿔주기만 하면 된다.

N:N

  • N:N 연관 관계 매핑은 N:1, 1:N 연관 관계로 풀어, 중간에 엔티티를 추가해서 매핑한다.

참고

profile
🌱우당탕탕 메모장 (●'◡'●)🌱

0개의 댓글