Coding 공부/IntelliJ

[SpringBoot_JPA] 엔티티 어노테이션 @OneToMany, @Builder.Default, @BatchSize

CBJH 2024. 6. 13.
728x90
반응형

JPA 엔티티에서 이미지 관리를 위한 어노테이션 3종 세트 뽀개기 💥

JPA(Java Persistence API)를 사용하여 데이터베이스와 객체를 매핑할 때, 관계 설정은 빼놓을 수 없는 중요한 부분입니다. 특히 이미지처럼 여러 개의 파일을 하나의 게시글과 연결해야 할 때는 @OneToMany, @Builder.Default, @BatchSize 어노테이션 조합이 강력한 도구가 될 수 있습니다. 😎

1. @OneToMany: 일대다 관계 매핑의 핵심 🗝️

  • 역할: 하나의 게시글 엔티티(Board)가 여러 개의 이미지 엔티티(BoardImage)를 가질 수 있는 일대다 관계를 설정합니다.
  • mappedBy 속성: 관계의 주인이 어떤 엔티티인지 명시합니다. 여기서는 BoardImage 엔티티의 board 필드가 관계의 주인임을 나타냅니다. 즉, BoardImage가 외래 키를 관리합니다.
  • cascade 속성: 특정 작업(영속화, 병합, 삭제 등)이 Board 엔티티에 수행될 때, 연관된 BoardImage 엔티티에도 동일한 작업을 전파할지 결정합니다. CascadeType.ALL은 모든 작업을 전파함을 의미합니다.
  • fetch 속성: 연관된 엔티티를 가져오는 방식을 지정합니다. FetchType.LAZY는 Board 엔티티를 조회할 때 imageSet은 즉시 로드하지 않고, 실제로 접근할 때 로드합니다.
  • orphanRemoval 속성: Board 엔티티에서 imageSet에서 제거된 BoardImage 엔티티를 자동으로 삭제할지 여부를 결정합니다. true로 설정하면 제거된 이미지는 데이터베이스에서도 삭제됩니다.

2. @Builder.Default: 빌더 패턴과 기본값 설정의 만남 🤝

  • 역할: Lombok의 @Builder 어노테이션과 함께 사용되어 빌더 패턴으로 객체를 생성할 때 특정 필드에 기본값을 설정합니다.
  • BoardImage 객체의 초기화: imageSet 필드가 HashSet으로 초기화되도록 보장합니다. 이는 빌더 패턴을 사용하여 Board 객체를 생성할 때 imageSet 필드를 명시적으로 설정하지 않아도 빈 HashSet으로 초기화됨을 의미합니다.

3. @BatchSize: N+1 문제 해결사 💪

  • 역할: @OneToMany 관계에서 발생하는 N+1 문제를 해결하기 위해 사용됩니다.
  • N+1 문제란? Board 엔티티를 조회할 때, 각 Board마다 연관된 BoardImage 엔티티들을 개별적으로 조회하여 성능 저하를 일으키는 문제입니다.
  • 해결 방법: @BatchSize를 사용하여 연관된 BoardImage 엔티티들을 한 번에 특정 개수(여기서는 20개)만큼 가져오도록 설정하여 성능을 향상시킵니다.

코드 예시 💻

 
@Entity
public class Board {
    // ...

    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @Builder.Default
    @BatchSize(size = 20)
    private Set<BoardImage> imageSet = new HashSet<>();

    // ...
}
 

결론 🎉

@OneToMany, @Builder.Default, @BatchSize 어노테이션을 함께 사용하면 JPA 엔티티에서 이미지와 같은 컬렉션 데이터를 효율적으로 관리할 수 있습니다. 이 조합은 관계 매핑, 객체 생성, 성능 최적화까지 한 번에 해결하는 강력한 도구입니다. 😊

댓글