스프링부트 native query

2021. 4. 12. 02:14Spring Boot

반응형

검색어를 저장해주는 테이블을 만들고 그 테이블에서 상위 인기 검색어 10개를 뽑기 위해 native query를 사용했다.

 

jpa는 쿼리를 직접 짜지 않고 쿼리를 실행할 수 있는 장점이 있지만 group by 같은 문법을 활용하려면 조금 복잡해진다. 

 

위와 같은 경우에 native query를 사용하지않고 자바단에서 처리할 수 있는 방법도 있을 수 있을텐데 쿼리를 사용하는게 훨씬 간단히 해결할 수 있을 거 같아 native query를 사용했다. 

 

 

 

- Controller

    /**
     * 인기 검색어 조회 API
     * [GET] /recipes/best-keyword
     * @return BaseResponse<List<GetRecipesBestKeywordRes>>
     */
    @GetMapping("/best-keyword")
    public BaseResponse<List<GetRecipesBestKeywordRes>> getRecipesBestKeyword() {

        try {
            int jwtUserIdx = jwtService.getUserId();

            List<GetRecipesBestKeywordRes> getRecipesBestKeywordRes = recipeKeywordProvider.retrieveRecipesBestKeyword();

            return new BaseResponse<>(getRecipesBestKeywordRes);
        } catch (BaseException exception) {
            return new BaseResponse<>(exception.getStatus());
        }
    }

 

 

- Provider

    /**
     * 인기 검색어 조회 API
     * @return List<GetRecipesBestKeywordRes>
     * @throws BaseException
     */
    public List<GetRecipesBestKeywordRes> retrieveRecipesBestKeyword() throws BaseException {
        GetRecipesBestKeywordRes getRecipesBestKeywordRes;

        List<Object[]> bestKeywordList;
        try {
            bestKeywordList = recipeKeywordRepository.findByBestKeywordTop10();
        } catch (Exception ignored) {
            throw new BaseException(FAILE_TO_GET_BEST_KEYWORD);
        }

        return bestKeywordList.stream().map(keyword -> {
            String bestKeyword = String.valueOf(keyword[0].toString());

            return new GetRecipesBestKeywordRes(bestKeyword);
        }).collect(Collectors.toList());


    }

 

 

 

- Repository

@Repository
public interface RecipeKeywordRepository extends CrudRepository<RecipeKeyword, Integer> {
    @Query(value="select keyword,count(keyword) as keywordCount\n" +
            "from RecipeKeyword\n" +
            "where status = 'ACTIVE'\n" +
            "group by keyword\n" +
            "order by keywordCount desc limit 10;",nativeQuery = true)
    List<Object[]> findByBestKeywordTop10();
}

 

 

 

- GetRecipesBestKeywordRes

@Getter
@AllArgsConstructor
public class GetRecipesBestKeywordRes {
    private String bestKeyword;

}

 

 

 

<결과> 

 

 

 

www.popit.kr/jpa-native-query-%EC%82%AC%EC%9A%A9-%EC%8B%9C-dto%EB%A1%9C-%EB%A7%A4%ED%95%91%ED%95%98%EA%B8%B0/

 

charlie-choi.tistory.com/246

 

반응형