진짜 개발자
본문 바로가기

FrameWork/Spring MVC

SpringMVC - Spring MVC 설정 - 2 (Formatter)

728x90
SpringMVC - Spring MVC 설정 - 2 (Formatter)

SpringMVC 설정 2번째 포스팅입니다. 이번시간에는 SpringMVC 사용시 자주 설정되는 것들중 하나인 Formatter에 대해서 포스팅하겠습니다. 우선 formatter를 설정하는 방법을 알아보기 이전에 왜 필요하고 어떤것을 도와주는지에 대해 알아보겠습니다.


1.데이터바인딩이란

이전 포스팅(https://galid1.tistory.com/519 ) 에서 데이터바인딩에 대해서 알아본적이 있습니다. 다시 한번 말씀드리자면 데이터바인딩이란 사용자의 입력값을 특정 도메인객체에 맵핑하는 것을 일컫는 말입니다. 데이터 바인딩은 사용자가 입력한 값들은 보통 문자열이기 때문에 이것을 숫자, 또는 여러 객체들로 자동으로 맵핑시켜주기 위해 필요합니다.

 

 

 

2. Formatter

Formatter는 데이터바인딩을 수행해주는 것 입니다. 조금더 자세히 말씀드리자면, 어떤 객체를 문자열로 또는 문자열을 객체로 변환할 수 있도록 도와주는 것 입니다.

 

2.1 @Pathvariable

@Pathvariable을 이용하면 자동으로 값을 받을 수 있습니다. 하지만 이것은 데이터 바인딩과는 다른 것 입니다.

 

예를 들어 위와같은 테스트가 있습니다. 위의 테스트는 /hello/번호 으로 요청이 올때 응답으로 hello 번호으로 응답을 받도록하는 테스트입니다.

 


위의 테스트를 통과하기 위한 코드는 위와 같습니다. 간단히 @PathVariable을 이용하여 {}안의 값을 String name변수에 담을수 있습니다.

 

 

2.2 Formatter 생성

그렇다면 Formatter는 언제 사용할까요? 말씀드렸듯이 사용자의 요청을 특정 객체로 맵핑을 해야하는 경우 필요합니다.

 

바로 이러한 경우에 Formatter가 필요합니다. 사용자의 요청중 {id}에 담긴 값을 Person객체로 맵핑하여 그 객체에 담긴 값을 통해 응답을 보내고자 합니다. 우선 Person Class가 필요할것 같습니다. 아 그전에 PathVariable에 대해 잠깐 알아보겠습니다.

 

@PathVariable

*중요한 점은 매개변수에 적힌 값을 토대로 매핑할 문자열을 사용자 요청에서 찾는 다는 것입니다. 즉 위의 경우 매개변수에 적힌 변수의 이름이 person이므로 /hello/{id}"에서 {person}이라고 적힌 값을 찾는다는 것 입니다. 따라서 위의 그림 처럼 person변수에 매핑될 값을 @PathVariable("id")처럼 괄호안에 적어주어야 합니다.

 

EventController가 실행되기위해 필요한 코드만을 작성했습니다. id을 필드로 가지며 getter, setter 만이 존재합니다.

 

오류들이 사라졌으니 다시, 테스트를 실행해 보겠습니다.

 

테스트가 실패하는 것을 볼 수 있습니다. name으로 들어오는 문자열을 Person객체로 변환하는 방법을 Spring에서 알 수 없기 때문입니다. 이런 문제를 해결해 줄 수 있는 것이 바로 Formatter입니다.


Formatter인터페이스를 구현하고 제네릭 안에는 상호변환에 사용될 객체를 입력합니다. 2가지 메소드가 구현이 되는데요, parse는 문자열을 객체로 변환할때 사용이 되며, print는 객체를 문자열로 변환할 때 사용됩니다.

 


2.3 Formatter 등록 


2.3.1 WebMvcConfigurer의 addFormatters 이용

지난 포스팅(https://galid1.tistory.com/532)에서 Spring MVC에서 설정들을 추가하는 간단한 방법을 알아 보았습니다. 즉, @EnableWebMvc 어노테이션이 부여된 경우 WebMvcConfigurer를 구현하여 간편하게 설정들을 추가할 수 있었습니다.


이제 WebApplication 설정파일에가서 addFormatters를 오버라이딩한 뒤 우리가 만든 Formatter를 등록만 해주면 됩니다.

 

성공입니다.




2.3.2 Bean으로 등록 (Spring boot를 사용하는 경우)

앞서서 Formatter, Converter를 사용했던것 처럼 Registry를 이용해 등록하는 과정이 필요없습니다. 즉, Web관련 Configure클래스가 필요없다는 것 입니다. 우선 Formatter를 생성합니다.

 

Formatter

앞서 생성했던 Formatter와 같지만 이번에는 Bean으로 등록하기 위해 @Component어노테이션을 부여했습니다.

 

Controller

Controller에서는 ConversionService를 사용하기 위해 @Autowired어노테이션을 부여합니다. SpringBoot를 사용하고 있다면 자동으로 WebConversionService가 주입이 됩니다. 이것은 SpringBoot의 기능이지만 빈으로 등록된 Converter와 Formatter의 경우 자동으로 ConversionService에 등록이 됩니다.