[Spring Boot] OneToMany

김광일·2024년 10월 2일
0

SpringBoot

목록 보기
15/19
post-thumbnail
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY)

이는 Spring과 JPA에서 엔티티 간의 관계를 설정할 때 사용되는 개념이다.


[1] @OneToMany 개념

: @OneToMany는 하나의 엔티티가 여러 개의 다른 엔티티와 연결될 때 사용하는 애너테이션이다.

  • 예를 들어, 하나의 User(사용자)는 여러 개의 Post(게시물)를 작성할 수 있다.
    -> 따라서 User와 Post는 1 대 N 관계다. 즉, 한 명의 사용자가 여러 개의 게시물을 가질 수 있다는 것을 나타낸다.

[2] mappedBy = "author"

: mappedBy는 두 엔티티가 서로 관계를 맺을 때, 어느 쪽이 주도권을 가지는지를 나타낸다.

  • 여기서 mappedBy = "author"는 Post 엔티티가 관계의 주도권을 가진다는 뜻입니다. 즉, Post 클래스의 author라는 필드에 의해 관계가 설정된다.
    -> 간단히 말해, User 클래스에서는 Post가 주도하는 관계를 참고하고 있다는 의미다.

[3] cascade = CascadeType.ALL

: cascade는 한 엔티티에서 발생한 변화가 연관된 다른 엔티티에도 영향을 미치는 방식을 정의한다.

  • CascadeType.ALL은 모든 종류의 변화(저장, 삭제, 수정 등)가 연관된 엔티티에도 적용된다는 뜻이다.

1) 예시

  • User가 삭제되면 그와 관련된 모든 Post도 자동으로 삭제된다.
  • User가 저장되면, 그와 연관된 Post들도 자동으로 저장된다.

-> 즉, CascadeType.ALL은 부모-자식 관계에서 부모(User)의 행동이 자식(Post)에게도 적용된다는 뜻이다.

[4] fetch = FetchType.LAZY

: fetch는 데이터를 가져오는 방식을 나타낸다.

  • LAZY(지연 로딩)는 필요할 때만 데이터를 가져오는 방식이다.

1) 예시

  • 사용자가 게시글을 많이 작성했다면, 사용자의 정보를 조회할 때 그 게시글 정보도 함께 불러오는 것은 시간이 오래 걸릴 수 있다.
    -> LAZY 설정을 통해 게시글 정보는 실제로 필요할 때만 불러온다.
  • 반대로 EAGER(즉시 로딩)는 사용자 정보를 불러올 때, 연관된 게시글 정보도 즉시 함께 불러오는 방식이다.

[5] 요약

@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  • @OneToMany: 한 명의 User는 여러 개의 Post를 가질 수 있다.
  • mappedBy = "author": Post 엔티티의 author 필드가 관계의 주도권을 가진다.
  • cascade = CascadeType.ALL: User의 변화가 연관된 Post에도 모두 적용된다.
  • fetch = FetchType.LAZY: Post 정보는 필요할 때만 불러온다.

-> 이 설정은 엔티티 간의 관계를 효과적으로 관리하면서 성능을 최적화하고, 연관된 데이터를 쉽게 조작할 수 있도록 돕는다.

profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글