SPRING

[SPRING] JPA로 테이블 객체 다루기

도원좀비 2025. 4. 30. 20:57

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