Back-end/TIL

[SpringBoot] Repository에서 nativeQuery 사용시 / private final로 변수 선언하는 이유 / Page vs. Slice

sw_develop 2022. 3. 16. 09:39

# Repository에서 nativeQuery 사용시

//Bad
@Query(...)
Page<Object[]> findAll(Pageable pageable);

//Good
@Query(...)
Page<DtoVo> findAll(Pageable pageable);

public interface DtoVo {
	Long getId();
}
  • 첫 번째 방식: Object 배열의 인덱스로 접근해야 하므로, 오류 발생 가능성이 크다.

 

  • 두 번째 방식
    • interface에 필요한 필드를 불러오는 getter 메서드만 선언해둔다.
    • Spring Data JPA에서 @Query()에서 설정한 변수 값으로 DtoVo에 바로 매핑해준다. (nativeQuery외에 일반 JPQL에서도 동일하게 작동함)
//예시 코드
@Query("select pm.id as id, " +
            "pm.menuKorName as menuKorName, " +
            "pm.menuEngName as menuEngName, " +
            "from PharmacyMenu pm " +
            "where (pm.menuKorName like %:menuName% or pm.menuEngName like %:menuName%)")
 Page<PharmMenuListResDtoVo> findByMenuName(@Param("menuName") String menuName, Pageable pageable);

 

# private final로 변수 선언하는 이유

  • Spring에서 DI(의존성 주입)를 위해 생성자 주입 방식을 선호한다.
  • private final로 선언하여 에러 체크(ex. 객체 생성이 안된 경우 등)를 잘 하기 위함이다.

 

# Page vs. Slice

  • Page: 1, 2, 3 .. 이렇게 Pagination 구현할 때 사용
  • Slice: 더보기로 Pagination 구현할 때 사용