2023. 4. 22. 13:48ㆍ자바/스프링
원래는 중간에 exceptionHandler가 있지만 이전 내용에서 DataBinder에 대한 내용이 있어서 먼저 정리했다.
DataBinder
DataBinder는 이름에서도 알 수 있듯이 Request parameters를 모델에 바인딩하는 역할을 하는 것이다. @InitBinder는 WebDataBinder를 초기화하는 역할을 한다. 즉, @InitBinder 어노테이션을 가진 메서드를 사용한다면 데이터를 모델로 바인딩할 수 있다.
@RequestParam이나 @PathVariable, @ModelAttribute 어노테이션들은 request로 전달받은 값을 다른 타입으로 바인딩을 해주는 과정을 거친다. 이때 WebDataBinder라는 것을 만들어서 전달받은 값을 매핑하게 된다.
@InitBinder 어노테이션을 사용해서 WebDataBinder를 설정해줄 수 있다.
위와 같이 @initBinder로 WebDataBinder에 Editor를 등록하면 전달받고자하는 Date의 포멧을 설정할 수 있다.
위와 같이 포멧을 설정하는 것 뿐만 아니라 바인딩할 수 있는 객체를 추가하거나 검증을 하는 로직을 추가하는 등의 동작도 가능하다. 객체를 바인딩할 때는 그 객체에 해당하는 프로퍼티를 설정하는 방식으로 바인딩한다.
DataBinding 시 getter와 setter?
여기서 중요한 내용이 하나 등장하는데 바인딩되고자하는 객체는 getter와 setter가 있어야한다.
또한 해당 메서드들은 자바 빈 네이밍 규칙을 따라야한다.
만약 'trialCount'라는 필드가 있다고 하자.
이때 getter의 접근제어자는 반드시 public이고 메서드 명은 getTrialCount이어야한다.
setter 또한 public으로 열어줘야하고, setTrialCount이어야 한다.
이 규칙만 지킨다면 객체를 잘 바인딩할 수 있다.
참고로 @RequestBody를 사용해 바인딩을 할 때에는 ObjectMapper를 통해 바인딩을 하기에 setter가 없어도 바인딩이 가능하다. (@RequestBody는 역직렬화를 이용해 Json을 자바 객체로 변환하는 것이기 때문이다.)
단, 바인딩하고자하는 객체에 기본 생성자가 없고, 따로 -parameters 컴파일러 플래그로 컴파일을 하지 않는 경우에 intellij 환경에서 빌드를 한다면 바인딩이 적절하게 이뤄지지 않을 수 있다. intellij로 설정해서 빌드를 하는 경우에는 증분 빌드를 하기에 위의 플래그가 빠지기 때문이다. 이 경우에는 프로퍼티나 역직렬화 어노테이션을 사용하면 해결할 수 있다.
얼마 전에 한참 헤맸던 내용이라 관련해서 삽질 기록을 한번 작성하기도 했다. ㅎㅎ
2023.04.18 - [자바/스프링 삽질 기록] - Spring에서 @RequestBody로 전달받는 객체의 필드에 final 키워드를 붙일 수 있을까?
아무튼 setter나 getter로 풀어줘야한다는 것은 객체지향적인 관점에서 도메인을 다룰 때 주의해야하는 부분 중 하나이다. 객체의 상태가 의도치않게 바뀔 수 있기 때문이다. 따라서 도메인 객체 자체를 바로 바인딩해서 사용하지 않도록 하는 것이 중요하다.
@InitBinder는 어디에서 사용해?
@InitBinder는 바인딩하고자하는 객체를 추가하거나 바인딩을 할 때 검증을 하는 등의 역할을 한다고 했다. 외부로부터 전달된 값을 객체로 바인딩을 한다는 것은 자연스럽게 Controller에서 이뤄진다는 것을 알 수 있다. 따라서 @InitBinder는 Controller나 Controller를 돕는 ControllerAdvice에서 사용할 수 있다.
@InitBinder는 @Controller나 @ControllerAdvice가 있는 클래스의 메서드에 붙일 수 있다.
@Controller 어노테이션이 있는 클래스에서 사용이 가능하기 때문에 당연히 @RestController에서도 사용이 가능하다.
스프링 DataBinder 부분 공식 문서에서는 이 정도 분량이었다. (사실 분량이 더 적었는데, 이것저것 찾아보면서 늘린거다.)
사실 마음 같아서는 여기서 DataBinder에 대한 구현 예제를 더 넣고 싶지만 지금 프로퍼티나 다른 내용도 모르는 상황에서 꾸역꾸역 예제 코드를 넣는 것은 개인적인 학습에 도움이 되지 않을 것 같아 이건 나중으로 미루도록 하겠다!
'자바 > 스프링' 카테고리의 다른 글
스프링 공식 문서 뿌수기(6), ComponentScan이 뭐야? (0) | 2023.04.25 |
---|---|
스프링 공식 문서 뿌수기(5), ApplicationContext란? (0) | 2023.04.24 |
스프링 공식 문서 뿌수기(3), Spring MVC의 Annotated Controllers - RequestMapping (4) | 2023.04.21 |
스프링 공식 문서 뿌수기(2), Spring MVC의 Annotated Controllers - 1 (1) | 2023.04.17 |
스프링 공식 문서 뿌수기 (1), 아니 그래서 Spring이 뭔데? (3) | 2023.04.14 |