Spring/Issue

@RequestParam을 Enum 타입으로 받기

블로그 주인장 2024. 1. 7.

축구 커뮤니티 프로젝트를 구현시 발생한 이슈입니다. 링크 : github

현재, Soccer 필드에는 Enum으로 관리되는 League 필드가 있습니다.

 

저는 League를 Request Parameter로 입력받아 Leauge에 해당하는 해당 정보들을 반환하는

GET 요청 API를 만드려고 합니다.

 

League Enum

 

League라는 Enum class에는 나라의 이름과 해당 나라 코드를 선언해놓은 상태입니다.

 

그러다보니 일일이 code나 country 를 request 요청을 하는 것보다

League enum을 변환하여 사용하고 싶다는 생각을 했습니다.

 

문자열과 enum의 이름이 같다면 자동으로 컨버팅해주겠지만, 그렇지 않다면 문제가 있습니다.

1. 휴먼 에러가 발생하기 쉽다.

2. 팀 프로젝트의 경우 중간에 참여한 사람은 익숙하지 않아 알아보기 쉽지 않다.

3. 별도의 유효성 체크가 필요하다.

 

Spring에서는 문자열을 enum으로 변환해주는 컨버터를 직접 만들어서 적용시킬 수 있습니다.

 

enum으로 컨버팅할 수 있도록 코드를 구현해보겠습니다.

 

코드 구현

요청 파라미터로 League Code를 받아 조회하는 상황이라면 해당 코드처럼 구현됩니다.

 

 

요청 파라미터에 해당 LeagueId를 입력받아서 GET 요청 API를 진행합니다.

이 때 URI는 /scorer?leagueid=302와 같을 것입니다.

 

Enum Type 메서드 추가

먼저, Enum 타입인 League 안에 String 타입인 request를 League로 만들어 주는 메서드를 정의합니다.

 

 

Converter 구현

org.springframework.core.convert.converter.Converter 의 convert 메서드를 구현한 클래스를 만듭니다.

 

해당 메서드는 Request Parameter로 입력되는 문자열을 toUpperCase 를 이용해서 모든 문자를 대문자로 바꿔줍니다.

 

대문자로 모두 변경한 이유는 enum 클래스에 선언한 변수들이 대문자로 되어있기 때문에 대문자로 변환해줍니다. 

 

addFormatters 구현

WebConfigurer의 addFormatters 메서드를 재정의한 Converter를 추가합니다.

 

 

위의 두 과정을 수행하면 Spring이 알아서 컨버터의 코드를 호출하여 변환해줍니다.

 

즉, 다음과 같이 요청 파라미터를 변환할 수 있습니다.

 

직접 변환 작업을 처리하지 않아도 되기 때문에 코드가 간결해지는 효과가 있습니다.

 

꼭 enum 타입 변환할 때만 사용할 수 있는 것이 아니라 객체로 데이터를 받을 때 컨버터를 만들어 사용할 수 있습니다.

 

Reference

https://www.baeldung.com/spring-enum-request-param

 

 

본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.

반응형

댓글