[Spring Basic] 파라미터의 변환과 검증
위의 URL로 요청을 수행하면, 데이터는 Map 자료구조로 변환된다.
해당 Map을 컨트롤러가 파라미터에 있는 MyDate 객체로 묶어준다.
이 과정에서 WebDataBinder가 개입해 타입 변환과 데이터 검증 작업을 수행한다.
WebDataBinder는 스프링 MVC가 제공하는 기능으로, HTTP 요청 파라미터를 자바 객체에 자동으로 바인딩하는 역할을 수행한다.
WebDataBinder가 요청 파라미터를 자바 객체로 변환할 때는 내부적으로 PropertyEditor 또는 Converter 가 사용된다.
PropertyEditor는 java.beans 패키지에 포함돼있고 문자열을 특정 타입의 객체로 변환하거나 객체를 문자열로 변환한다.
Converter는 스프링에서 제공하는 인터페이스로 문자열을 객체로 변환할 수 있지만, 반대는 수행할 수 없다.
PropertyEditor는 인스턴스 변수이기 때문에 stateful하지만 Converter는 인스턴스 변수가 아니기 때문에 stateless하다.
@Controller
public class BaseController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
}
@InitBinder 애너테이션을 클래스 내부에 작성해 PropertyEditor를 WebDataBinder에 등록한다.
해당 메서드로 데이터를 어떻게 변환할 지 정의한다.
이 과정에서 에러가 발생하지 않으면 무사히 객체로 만들어지고, 에러가 발생하면 BindingResult에 에러가 저장된다.
(@ModelAttribute 바로 뒤에 BindingResult가 위치해야 한다)
타입 변환은 위와 같이 진행되고, 데이터 검증은 Validator를 통해 진행된다.
supports메서드로 검증 가능한 여부를 확인하고 User로 바로 형변환해서 사용한다.
validate메서드에서는 검증하는 요소에 따라 적절히 검증하는 역할을 한다.
위의 예시는 Validator를 직접 구현한 경우고, 애너테이션을 사용하면 좀 더 편하게 검증할 수 있다.
public class User {
@NotBlank
private String name;
@Email
@NotBlank
private String email;
}
@Controller
public class UserController {
@PostMapping("/users")
public String createUser(@Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "error";
}
return "success";
}
}
@NotBlank @Email 애너테이션 (Hibernate Validator) 으로 유효한 이메일 주소인지 검증하고 비어 있지 않은지 검증하는 조건을 추가하고
User 클래스를 사용하는 컨트롤러에서는 파라미터에 @Valid 애너테이션을 추가해 요청 파라미터를 검증한다.
(오류는 BindingResult에 담긴다)
검증 조건을 애너테이션으로 추가해도 내부적으로는 Validator 인터페이스의 구현체가 사용된다.
'Spring > Spring' 카테고리의 다른 글
[Spring Basic] DAO Repository DTO VO Entity (0) | 2022.07.09 |
---|---|
[Spring Basic] JUnit Test Framework (0) | 2022.07.09 |
[Spring Basic] DispatcherServlet (0) | 2022.06.23 |
[Spring Basic] 리다이렉트와 포워드 (0) | 2022.05.12 |
[Spring Basic] 서블릿과 JSP (0) | 2022.05.05 |
댓글
이 글 공유하기
다른 글
-
[Spring Basic] DAO Repository DTO VO Entity
[Spring Basic] DAO Repository DTO VO Entity
2022.07.09 -
[Spring Basic] JUnit Test Framework
[Spring Basic] JUnit Test Framework
2022.07.09 -
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23 -
[Spring Basic] 리다이렉트와 포워드
[Spring Basic] 리다이렉트와 포워드
2022.05.12