messages.properties에 이런식으로 메시지를 지정해둘 수 있고
messages_en.properties, messages_ko.properties 와 같이 영어 버전이나 한국어 버전으로 국제화 시킬 수 있다. 이후 요청할 때 헤더나 언어 선택, 쿠키를 통해 적절한 값으로 반환해준다
# messages_en.properties
page.main=Main page
page.detail=Detail page
comment.hello=Hello
# messages_ko.properties
page.main=메인 페이지
page.detail=상세 페이지
comment.hello=안녕
BindingResult
스프링이 제공하는 검증 오류 처리 방법
필드에 오류가 있으면 FieldError 객체를 생성해 bindingResult 에 담아둠
특정 필드가 아닌 글로벌 오류인 경우는 ObjectError 객체에 담음
bindingResult가 없으면, ModelAttribute에 바인딩시 타입 오류가 발생했을 때, 400 에러를 내뱉지만, 있으면 컨트롤러가 호출된다
Validator
@ModelAttribute 모델에 요청을 바인딩할 때 주로 사용
Validator 인터페이스는 supports() 메소드와 validate() 메소드가 있다
supports - 이 검증기가 검증할 수 있는 오브젝트 타입인지를 확인
validate - supports를 통과한 경우 호출.
validate 만약 오류가 발견되면 validate(Object target, Errors errors) 에서 Errors 인터페이스를 통해 오류 정보 등록 가능
Controller에서 @Valid
어노테이션을 사용하면, 객체의 제약 조건을 검증한다
검증 기능을 코드로 작성하는 것의 번거로움 → 검증 로직을 표준화한 것이 Bean Validation → 검증 애노테이션과, 여러 인터페이스의 모음
spring-boot-starter-validation
라이브러리 필요,
javax.validation 으로 시작하면 특정 구현에 관계 없이 제공되는 표준 인터페이스
org.hibernate.validator 는 하이버네이트 구현체에만 제공
spring-boot-starter-validation
라이브러리를 넣으면, 자동으로 Bean Validator 를 인지하고 스프링에 통합함 - LocalValidatorFactoryBean을 글로벌 Validator로 등록한다. - 이 Validator가 애노테이션을 보고 검증한다. - 글로벌 Validator가 적용되어 있기에, @Valid, @Validated 만` 적용하면 된다 - 검증 오류가 발생하면 BindingResult에 담아준다
Bean Validation은 등록, 수정 같은 기능별로 validation이 다르다. 때문에 각 기능별로 맞는 객체를 만들어 전달함
ex) public class ItemSaveForm { }