@InitBinder 어노테이션은 스프링 MVC에서 컨트롤러에 들어오는 요청의 데이터 바인딩과 유효성 검사를 커스터마이즈하는 데 사용되는 어노테이션입니다.
기본적인 사용 방법은 다음과 같습니다:
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalBindingInitializer {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
}
@ControllerAdvice와 함께 사용하여 전역 설정이 가능합니다.WebDataBinder를 통해 다양한 바인딩 옵션을 설정할 수 있습니다.@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("id");
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addValidators(new UserValidator());
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(PhoneNumber.class, new PhoneNumberEditor());
}
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
전역적으로 @InitBinder 메서드를 적용하려면 @ControllerAdvice와 함께 사용할 수 있습니다:
@ControllerAdvice
public class GlobalBindingInitializer {
@InitBinder
public void initBinder(WebDataBinder binder) {
// 전역 바인딩 설정
}
}
@InitBinder가 적용된 컨트롤러를 테스트할 때:
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testDateBinding() throws Exception {
mockMvc.perform(post("/users")
.param("birthDate", "1990-01-01"))
.andExpect(status().isOk());
}
}
@InitBinder 메서드는 스레드 안전해야 합니다.@InitBinder 메서드의 목적을 주석으로 명확히 설명하세요.@InitBinder는 스프링 MVC에서 데이터 바인딩과 유효성 검사를 세밀하게 제어할 수 있게 해주는 강력한 도구입니다. 이를 통해 개발자는 복잡한 데이터 변환 로직을 구현하거나, 특정 필드에 대한 바인딩을 커스터마이즈할 수 있습니다. 특히 날짜 형식 변환, 열거형 처리, 복잡한 객체 그래프 바인딩 등에 유용하게 사용될 수 있습니다. 다만, 과도한 사용은 애플리케이션의 복잡성을 증가시킬 수 있으므로, 필요한 경우에만 적절히 사용하는 것이 중요합니다.
@ControllerAdvice
@Valid
@ModelAttribute
@RequestMapping
@Controller