스프링 공식 문서 뿌수기(4), Spring MVC의 Annotated Controllers - DataBinder

2023. 4. 22. 13:48자바/스프링

728x90
반응형

원래는 중간에 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에서도 사용이 가능하다.

 

@ControllerAdvice 공식 문서에서도 바로 @InitBinder에 대한 이야기가 나온다.

 

 

스프링 DataBinder 부분 공식 문서에서는 이 정도 분량이었다. (사실 분량이 더 적었는데, 이것저것 찾아보면서 늘린거다.)

 

사실 마음 같아서는 여기서 DataBinder에 대한 구현 예제를 더 넣고 싶지만 지금 프로퍼티나 다른 내용도 모르는 상황에서 꾸역꾸역 예제 코드를 넣는 것은 개인적인 학습에 도움이 되지 않을 것 같아 이건 나중으로 미루도록 하겠다!

728x90
반응형