ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ ์ค์ ํ์ด์ง ์ฌ์ด์ฆ๋ฅผ 10, 30, 50์ผ๋ก ์ ํํ๊ณ ์ง์ ํ ์ฌ์ด์ฆ ์ธ์ ๋ค๋ฅธ ์ฌ์ด์ฆ๊ฐ ์ ๋ ฅ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ธ 10์ผ๋ก ํ์ด์งํ๋ ํญ๋ชฉ์ด ์์์ต๋๋ค.
์ฒ์์๋ ๊ฐ ๋๋ฉ์ธ์์ ํ์ด์ง ์ฌ์ด์ฆ ์ ํ ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ์ ์ฉ์ ์งํํ๊ณ ์์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค ArgumentResolver์ ๋ํด ์๊ฒ๋์๊ณ ,
๊ทธ ์ค์์๋ PageableArgumentResolver๋ฅผ ํ์ฉํ์ฌ ํ์ด์ง ์ฌ์ด์ฆ ์ ํ์ ์ ์ฉํ์์ต๋๋ค.
Handler Method Argument Resolver ๋?
Spring MVC์์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋ ํธ์ถ ์ ์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค.
์์๋ก๋ @RequestParam, @ModelAttribute, @RequestBody ๋ฑ์ด ์์ต๋๋ค.
Handler Method Argument Resolver ๋์ ๊ณผ์
- DispatcherServlet → HandlerAdapter
- HandlerAdapter
- Request Mapping Handler Adapter (Handler Adapter์ ๊ตฌํ์ฒด) ๊ฐ Controller ์คํ ์ ์
Handler Method Argument Resolver ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ณํ
- Request Mapping Handler Adapter (Handler Adapter์ ๊ตฌํ์ฒด) ๊ฐ Controller ์คํ ์ ์
- Handler Method Argument Resolver ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณํํ์ฌ Handler Adapter ๋ก ๋ฐํ
- Handler Adapter ๋ ์ด ๊ฐ๋ค์ ๊ฐ์ง๊ณ Controller ๋ฉ์๋ ํธ์ถ
PageableHandlerMethodArgumentResolver ๋?
Pageable์ ๋ํ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณํํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ํ์ํ ๋ถ๋ถ์ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด @Pageable
์ด๋
ธํ
์ด์
์ฌ์ฉ์ ์ ์งํ๋ฉด์ ์ ํ ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค.
PageableArgumentResolver๋ฅผ ํ์ฉํ์ฌ ํ์ด์ง ์ฌ์ด์ฆ ์ ํ์ ํ๋ฉด์ ์ป์ 2๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
— HandlerMethodArgumentResolver๋ฅผ implements
- ๋ชจ๋ ๋ก์ง์ ์ง์ ๊ตฌํํด์ผ ํจ
- ํ๋ผ๋ฏธํฐ ํ์ฑ, ๋ณํ, ๊ฒ์ฆ์ ์ฒ์๋ถํฐ ์์ฑ
- ์ ๋ ฌ(Sort) ์ฒ๋ฆฌ๋ ์ง์ ๊ตฌํ ํ์
- ๋ ์ ์ฐํ๊ฒ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
— PageableHandlerMethodArgumentResolver๋ฅผ extends
- Spring Data์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ตฌํ์ฒด ํ์ฉ
- ํ์ด์ง, ์ ๋ ฌ ๊ด๋ จ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ๋ชจ๋ ์ ๊ณต
- ํ์ํ ๋ถ๋ถ๋ง ์ค๋ฒ๋ผ์ด๋ํด์ ์์
- ๋ ๊ฐ๋จํ๊ณ ์์ ํ ๊ตฌํ
ํ์ฌ ํ๋ก์ ํธ๋ ์ด๋ฏธ Pageable ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฝ๋ ์์ฑ์ด ์๋น ๋ถ๋ถ ์งํ์ค์ด์์ผ๋ฉฐ,
์๊ตฌ๋๋ ์ ํ ์ฌํญ๋ ๊ฐ๋จํ ์กฐ๊ฑด์ด์๊ธฐ์ ์ ์ฐํ ์ปค์คํฐ๋ง์ด์ง๋ณด๋ค๋ ๊ฐ๋จํ๊ณ ์์ ํ ๊ตฌํ์ ์ด์ ์ ๋ง์ถ์์ต๋๋ค.
์ฝ๋ ์์ฑ
— As is
private int validatePageSize(int pageSize) {
if (Set.of(10, 30, 50).contains(pageSize))
return pageSize;
throw new CustomApiException(BaseException.INVALID_PAGESIZE);
}
— To be
public class CustomPageableArgumentResolver extends PageableHandlerMethodArgumentResolver {
private static final Set<Integer> ALLOWED_PAGE_SIZES = Set.of(10, 30, 50); // ์ฌ์ด์ฆ ์ ํ
private static final int DEFAULT_PAGE_SIZE = 10; // ๊ธฐ๋ณธ๊ฐ
@Override
public Pageable resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
Pageable pageable = super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
int pageSize = pageable.getPageSize();
// ์์ฒญ๋ ํ์ด์ง ์ฌ์ด์ฆ๊ฐ ํ์ฉ๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์
if (!ALLOWED_PAGE_SIZES.contains(pageSize)) {
return PageRequest.of(pageable.getPageNumber(), DEFAULT_PAGE_SIZE, pageable.getSort());
}
return pageable;
}
}
package com.ioteam.order_management_platform.global.config;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new CustomPageableArgumentResolver());
}
}
์ ์ฉ ๊ฒฐ๊ณผ
— As is
- ์ ํด๋ ํ์ด์ง ์ธ์ ๋ค๋ฅธ ํ์ด์ง๊ฐ ๋ค์ด์ค๋ฉด exception์ ๋ฐํํ๋๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ์งํํ์ต๋๋ค.
— To be
์์ธ์ฒ๋ฆฌ ์ฝ๋์์ด๋ ์ ํด๋์ง ์์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ธ 5๋ก ๋ณํ๋์ด ์์ฒญ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฉ๋๋ค.
(ํ ์คํธ๋ฅผ ์ํด ๊ธฐ๋ณธ๊ฐ์ ์๊ฒ ์ค์ ํ ์ํ์ ๋๋ค.)
์ฃผ์ํ ์
์ฝ๋ ์์ฑ ์ค์ PageableHandlerMethodArgumentResolver์ PageableArgumentResolver๊ฐ ์๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
PageableArgumentResolver ์ ๊ฒฝ์ฐ Spring 3.x ์ฏค ์ฌ์ฉ๋๋ ๋ ๊ฑฐ์ ํด๋์ค๋ก ํ์ฌ Deprecated ๋ ์ํ์ด๋ฏ๋ก ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ฃผ์ํด์ผ ํฉ๋๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
FeignClient vs RestClient (0) | 2025.02.28 |
---|---|
WebClient์ RestTemplate ๊ทธ๋ฆฌ๊ณ RestClient (0) | 2025.02.21 |
ํ๋ก์ ํธ | ํ๋ก์ ํธ ์ค ํด๊ฒฐ/๊ณ ๋ฏผํ ๋ฌธ์ ๋ค ์ ๋ฆฌ! (feat. JPQL, Querydsl) (1) | 2025.02.20 |
REST API | ๋ฐ์ดํฐ ์์ api ์ด๋ป๊ฒ ๊ตฌํํ ๊น? (PATCH์ @DynamicUpdate ์ฐจ์ด์ ) (0) | 2025.02.19 |
REST API ์์์ HTTP ์๋ต ์ฝ๋ (HTTP 201 Created) (2) | 2025.02.18 |