엔지니어로 가는 길

@ModelAttribute도 Formatter가 필요할까 본문

프로그래밍/Spring

@ModelAttribute도 Formatter가 필요할까

탐p슨 2020. 8. 25. 22:05
728x90

@RequestParam 또는 @PathVariable로 들어온 값을 객체로 받으려면 Formatter가 필요하다.

 

String 타입 변수 name을 갖는 Person 클래스가 있다.

 

 

컨트롤러에서 위와 같이 name을 String이 아니라 바로 Person 객체로 받고 싶다고 해보자.

 

 

테스트를 돌리면 MethodArgumentConversionNotSupportedException가 발생한다. 매우 직관적인 이름이다. 컨트롤러의 인자로 Person 타입을 받겠다고 했는데 실제로 주어진 것은 String 타입이었다. String이 Person으로 conversion되지 않아서 예외가 발생한 것이다.

 

이렇게 Formatter를 등록(spring boot는 Formatter를 따로 등록할 필요 없이 빈으로만 만들어주면 알아서 등록해준다)해주면 테스트를 통과한다.

 

이 부분을 공부하다가 문득 @ModelAttribute가 떠올랐다. @ModelAttribute도 객체가 아닌 값을 받아서 객체로 변환해주는 로직이었던 것 같은데 Formatter를 등록하지는 않았던 것 같기 때문이다.

 

위와 같이 핸들러를 작성하고,

 

 

테스트를 돌리면 통과다. 기억에 의하면 @ModelAttribute가 붙었을 때 내부적으로 일어나는 일은, 해당 객체를 만든 뒤에 form 태그에 전달되는 값들을 객체에 바인딩하여 바인딩 된 객체를 전달해주는 것으로 알고 있다. 그러니까 요청으로 name에 bryant를 주었는데, Person 객체에 name이라는 field가 있어서 바인딩이 잘 이루어졌고, 바인딩된 Person 객체를 핸들러에 전달해준 것이다.

 

아, @PathVariable이나 @RequestParam는 값과 객체간의 1:1 변환이고 @ModelAttribute는 바인딩이다. 변환이니까 무엇으로 변환해야하는지 알려주는 Formatter가 있어야하고, 바인딩이니까 일단 바인딩을 시도해서 이름이 일치하는 필드가 있으면 바인딩하고 없으면 오류를 발생시키면 되므로 Formatter가 필요 없는 것 아닐까?

728x90
Comments