# 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 구현할 때 사용