[JPA] 연관관계 매핑

hjin·2023년 7월 24일
0
  • 방향 : 단방향, 양방향
  • 연관관계의 주인 : 양방향일때 관리 주체
  • 다중성 : 다대일(N:1), 일대다(1:N), 일대일, 다대다



방향

데이터베이스는 외래키 하나로 양 쪽 테이블 조인이 가능함. 그러나 객체는 참조용 필드가 있는 객체만 다른 객체를 참조함.

두 객체 사이에 하나의 객체만 참조용 필드를 가지면 단방향 관계,

두 객체가 모두 각각 참조용 필드를 가지면 양방향 관계.

객체 입장에서 양방향 관계를 하면 오히려 복잡해질 수 있음.

예를들어, User 엔티티는 많은 엔티티와 연관관계를 맺는데, 전부 불필요하게 양방향으로 매핑하면 복잡성이 증가한다.

그래서 기본적으로 단방향으로 매핑하고 나중에 객체탐색이 꼭 필요하다할때 역방향으로 매핑해주는게 좋음.


연관관계의 주인

양방향일때 연관관계의 주인이 아니면 조회만 가능하게끔 실질적인 관계를 JPA에게 알려줘야 함.

연관관계의 주인을 정한다 = 외래키 관리자를 선택하는 것.

연관관계의 주인 = 외래키가 있는 곳.

자신이 연관관계의 주인이 아닌것을 표시하는것이 mappedBy.

주인이 아닌쪽은 읽기만 할 수 있다.


N:1 관계

가장 많이 사용되는 연관관계.

  • @ManyToOne : 말 그대로 N:1을 나타내는 어노테이션
  • @JoinColumn : Team을 참조할 Foreign Key의 이름을 정해줌
  • FetchType.LAZY : DB에서 데이터를 조회할 때 Team 객체까지 한번에 가져올지, 빈 Proxy만 가져왔다가 필요할 때 조회할지 선택. 
    FetchType.EAGER는 한번에, FetchType.LAZY는 Proxy를 가져온다.
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;
}
  • @OneToMany: 1:N 관계를 나타내는 어노테이션
  • mappedBy: Member 테이블의 Team 변수명. private Team team; 이라고 선언했기 때문에 "team"이 된다.
- @OneToMany: 1:N 관계를 나타내는 어노테이션
- mappedBy: Member 테이블의 Team 변수명. private Team team; 이라고 선언했기 때문에 "team"이 된다.



사족

양방향 매핑을 하면 순환참조 에러가 일어날 가능성이 높아 단방향 매핑을 해야한다는데?

0개의 댓글

관련 채용 정보