[Spring Boot] JPA 연관관계 매핑

2021. 3. 9. 15:12Spring/Spring Boot

1. JPA 연관관계 매핑

1) 주요 용어

- 방향

  • 단방향 (한쪽만 참조)
  • 양방향 (서로 참조)

- 다중성

  • 일대일 관계
  • 일대다 관계
  • 다대일 관계
  • 다대다 관계

- 연관관계의 주인

  • 객체를 양방향 연관관계를 만들기 위해서는 연관관계 주인을 정해야한다. 일반적으로 다대일, 일대다 관계에서 연관관계의 주인은 '다'에 해당하는 객체이다.

2) 단방향 연관관계

- '한명의 회원은 여러 게시글을 이용할 수 있다.'

 

Board에서 Member로 접근하는 단방향 매핑

@Getter
@Setter
@ToString
@Entity
public class Member {
    @Id
    @Column(name = "MEMBER_ID")
    private Long id;
    private String password;
    private String name;
    private String role;
}
@Getter
@Setter
@ToString
@Entity
public class Board {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String content;
    
    @ManyToOne
    @JoinColumn(name = "MEMBER_ID", nullable = false)
    private Member member;
}

※ @JoinColumn 어노테이션에 nullable 속성을 추가한 이유는, 실행할 때 외부 조인이 아닌 내부 조인을 하기 위해서이다.

2) 양방향 연관관계

@Getter
@Setter
@ToString
@Entity
public class Member {
    @Id
    @Column(name = "MEMBER_ID")
    private Long id;
    private String password;
    private String name;
    private String role;
    
    @OneToMany(mappedBy = "member")
    @ToString.Exclude
    private List<Board> boardList = new ArrayList<>();
}

※ mappedBy로 member가 연관관계의 주인이라고 지정

@Getter
@Setter
@ToString
@Entity
public class Board {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String content;
    
    @ManyToOne
    @JoinColumn(name = "MEMBER_ID", nullable = false)
    @ToString.Exclude
    private Member member;
}

※ @ToString.Exclude는 양방향 관계에서 @ToString이 상호 호출을 하기에 StackOverflowError가 발생하는 것을 방지하기 위해 설정


Cascade 설정으로 영속성 전이(부모 엔티티 저장, 삭제 시 자식 엔티티도 저장, 삭제)가 가능하도록 한다.

@Getter
@Setter
@ToString
@Entity
public class Board {
    @Id
    @GeneratedValue
    private Long id;
    private String title;
    private String content;
    
    @ManyToOne
    @JoinColumn(name = "MEMBER_ID", nullable = false, cascade = CascadeType.All)
    @ToString.Exclude
    private Member member;
}

[참고] Spring - Spring - 참고 사항

[참고] junghwanta.tistory.com/5?category=849204

728x90