ParameterBinding
앞서 Dto로 전달한 Category의 viewName으로 가게리스트를 카테고리별로 조회하는 기능을 만들고자 했다.
/**
* 가게 리스트 종류별 조회
*/
@GetMapping("/category/{category}")
@Operation(summary = "카테고리별 가게 리스트 조회 요청", description = "카테고리별 가게 리스트 조회 요청 API 입니다.")
public ResponseEntity<List<GetStoreDto>> getStoresByType(
@PathVariable("category") Category category) {
List<GetStoreDto> getStoreDtos = storeService.getStoresByType(category);
return ResponseEntity.ok(getStoreDtos);
}
이렇게만 구성하니 당연하게도 Category의 Name으로 조회하는 방식이었다.
viewName으로 조회하기 위해서는 Converter을 커스텀해줘야 한다.
Category.ofView를 통해 value에 맞는 category값을 찾아준다.
public class StoreCategoryRequestConverter implements Converter<String, Category> {
@Override
public Category convert(String value) {
return Category.ofView(value);
}
}
만약 value값 조회가 아닌 Name 대소문자 구분을 없애고 싶다면 Category.valueOf(value.toUpperCase()) 로
convert 함수 내의 값을 바꿔주면 된다.
Converter을 모두 구현했으니 이제 이를 등록해줘야 한다.
WebMvcConfigurer 인터페이스의 addFormatters 메서드를 오버라이딩해서 등록한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StoreCategoryRequestConverter());
}
}
Spring이 애플리케이션 시작 시에 해당 설정 정보를 읽게 하기 위해 @Configuration을 사용하면 된다.
Converter오류 시 발생하는 ConversionFailedException을 처리해 주기 위해 아래의 코드를 추가해 주었다.
@RestControllerAdvice
public class ExceptionAdvice {
...
@ExceptionHandler(ConversionFailedException.class)
public ResponseEntity<ErrorResponse> handleConvertException(Exception e) {
final ErrorResponse response = ErrorResponse.of(ErrorCode._BAD_REQUEST);
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
...
}
https://techblog.woowahan.com/2527/
https://www.baeldung.com/spring-enum-request-param
'💻 프로젝트 > 🍝 홍잇' 카테고리의 다른 글
[HongEat] 리팩토링 - Enum/toJson(@JsonValue) (0) | 2023.04.22 |
---|---|
[HongEat] 리팩토링 - Enum/toEntity(@JsonCreator, @EnumValid) (0) | 2023.04.22 |
[HongEat] 리팩토링 - 변경사항 (0) | 2023.04.22 |
[HongEat] 리팩토링, 어떻게 진행했는가 (0) | 2023.04.22 |