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 엔티티에서 이미지와 같은 컬렉션 데이터를 효율적으로 관리할 수 있습니다. 이 조합은 관계 매핑, 객체 생성, 성능 최적화까지 한 번에 해결하는 강력한 도구입니다. 😊
'Coding 공부 > IntelliJ' 카테고리의 다른 글
[SpringBoot] @ControllerAdvice, @ModelAttribute("member")로 세션 속 멤버 정보를 전달하기 (0) | 2024.06.17 |
---|---|
[SpringBoot] Entity와 DTO를 ModelMapper로 쉽게 변환하기 (0) | 2024.06.17 |
[SpringBoot_MariaDB] 파일 업로드 코드 추가 (0) | 2024.06.11 |
[IntelliJ] 스프링부트 파일 업로트 설정, Multipart (0) | 2024.06.11 |
[IntelliJ_SpringBoot] 스프링 부트에서 세션을 사용한 로그인 정보 저장 (10단계 + 예제 코드) (0) | 2024.05.31 |
댓글