1️⃣ 테이블 객체 다루는 법
Cascade (영속성 전이)
- 사용 위치
→ 연관관계의 주인 반대편, 즉 @OneToMany, @OneToOne에서 사용
→ 예: 게시글 - 첨부파일 → 게시글에 설정 - 사용 조건
- 엔티티 생명주기가 비슷하거나 동일해야 함
- 다른 주체에서 동일 자식 객체에 전이 설정 금지
- 종류
옵션 설명 ALL 전체 상태 전이 PERSIST 저장 REMOVE 삭제 MERGE 병합 REFRESH 갱신 DETACH 준영속
추천 조합
orphanRemoval = true + cascade = CascadeType.ALL
→ 자식의 생명주기를 부모와 완전히 일치시킬 수 있음. Repository 없어도 삭제·저장 자동처리!
orphanRemoval (고아 객체 제거)
- 사용 위치
@OneToMany, @OneToOne에서 사용 - 설명
리스트에서 자식 객체 제거 시, DB에서도 DELETE 처리됨
parent.getChildList().remove(0); // delete 쿼리 실행됨
차이점 요약
- CascadeType.REMOVE : 부모 삭제 시 자식도 삭제
- orphanRemoval=true : 부모 리스트에서 자식 제거만 해도 삭제
Fetch (조회 전략)
- 옵션
-
타입설명
EAGER 즉시 로딩 LAZY 지연 로딩 (기본값) - 전략
- 항상 LAZY 기본 사용
- fetch join으로 LAZY 무시하고 즉시 로딩 가능
2️⃣ 테이블 객체로 자동 쿼리 생성하기
JpaRepository란?
- CrudRepository, PagingAndSortingRepository + 쿼리 자동 생성 기능까지 포함
- @EnableJpaRepositories가 내부에서 SimpleJpaRepository 구현체를 자동 등록
커스텀 빈 등록은 ImportBeanDefinitionRegistrar 를 사용
메서드 이름 기반 쿼리 생성법
List<User> findByNameAndPassword(String name, String password);
Page<User> findByAgeGreaterThanEqual(int age, Pageable pageable);
규칙
findBy + {프로퍼티명} + (And|Or...) + 조건 + OrderBy ...
- 접두어: Find, Get, Count
- 도입부: Distinct, Top3, First...
- 조건: IgnoreCase, Between, Contains...
- 정렬: OrderBy + 필드명 + Asc/Desc
📌 메서드 최적화 팁
1. Optional 처리 생략
default User findUserById(Long id) {
return findById(id).orElseThrow(...);
}
2. 가독성 좋은 이름 지정
default List<Product> findProductsByCategoryAndPriceRange(...) {
return findAllByCategoryAndPriceGreaterThanEqualAndPriceLessThanEqual(...);
}
3️⃣ 테이블 객체로 페이지 조회하기
PageRequest로 페이징 처리
Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending());
Page<Post> page = postRepository.findByAuthor("John", pageable);
- Page<T> : 전체 개수 포함 (게시판)
- Slice<T> : 다음 페이지 여부만 (더보기 버튼)
- List<T> : 전체 조회 (카운트 X)
정렬하기
- 단순 정렬
Sort sort = Sort.by("name").ascending();
- SQL 함수 기반 정렬
List<User> users = findByUsername("user", JpaSort.unsafe("LENGTH(password)"));
4️⃣ 요약
| 항목 | 설명 |
| Cascade | 부모 → 자식 자동 전이 |
| orphanRemoval | 부모에서 자식 리스트 제거 시 DB 삭제 |
| Fetch | EAGER(즉시), LAZY(지연) |
| JpaRepository | CRUD + 쿼리 자동생성 + 페이징 기능 제공 |
| Page/Slice/List | 각각의 페이징 목적에 따라 선택 |
| Sort | 다중 조건, SQL 함수, alias 기반까지 가능 |
'SPRING' 카테고리의 다른 글
| [SPRING] 조건 검색 개선 (인덱싱, 파티셔닝, 분리 조회) (3) | 2025.05.02 |
|---|---|
| [SPRING] 파티셔닝(Partitioning) (1) | 2025.05.02 |
| [SPRING] 쿠키(Cookie) (1) | 2025.04.25 |
| [SPRING] SSE(Sever-sent-event) (1) | 2025.04.25 |
| [SPRING] JPA Proxy (3) | 2025.04.21 |