강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

서호준님의 프로필 이미지
서호준

작성한 질문수

스프링 validation을 할때 errors.properties 의 문구가 적용되지 않습니다.

작성

·

160

·

수정됨

0

개인 프로젝트 중 DTO 의 내용을 검증하려고 하는데, 검증 실패시 에러 메시지 내용이 변하지 않아요.

test 환경에서 MessageSource 를 주입받아 확인해보면 값인 정상적으로 나오는데 어디서 문제가 된건지 잘 모르겠네요.

아래는 코드 내용입니다.

  1. DTO

@Data
@AllArgsConstructor
public class MemberJoinForm {
    @NotBlank
    private String id;
    @NotBlank
    private String pw;
    @NotBlank
    @Size(min = 2, max = 5)
    private String name;
    @Size(min = 4, max = 15)
    private String nickName;
    @NotBlank
    private String location;
    @Email
    private String mail;
}
  1. Controller

@Controller
@RequiredArgsConstructor
@Slf4j
@RequestMapping("/member")
public class MemberController {

    private final MemberService memberService;

    @PostMapping("/join")
    public String join(@Validated @ModelAttribute MemberJoinForm memberJoinForm, 
                        BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            log.info("errors={}", bindingResult);
            return "layout/member-join";
        }
        memberService.save(memberJoinForm);
        return "layout/home";
    }
}
  1. (application.properties), (errors.properties) 파일 내용

# messages 객체 메시지
spring.messages.basename=errors
NotBlank= 필수 입력란을 반드시 입력해 주세요.

 

테스트 코드로 확인해보면 MessageSource 에 errors.properties 내용이 담기긴 하는데 정작 NoBlank 에러가 발생할때 오류 문구가 바인딩 되지가 않네요.

뭐가 문제일까요?

답변 1

0

서호준님의 프로필 이미지
서호준
질문자

검색해서 해결했습니다.
https://www.inflearn.com/questions/263918/message-%EC%B2%98%EB%A6%AC-%EC%A7%88%EB%AC%B8


직관적으로 메시지 표시 과정을 표현하면
errors.properties -> MessageSource -> BindingResult -> 타임리프

순으로 작동하게 되는데, 이때 사용자가 지정해준 메시지 내용은 MessageSource 까지만 이동하고, 이후 타임리프에서 BindingResult 에서 발생한 에러 내용 (ex: Size.userCreateRequest.name) 를 확인하여 그에 대응하는 메시지를 MessageSource에서 꺼내오는 원리로 에러 메시지가 출력됩니다. 따라서 타임 리프 문법에 따라 오류 처리를 해줘야 했는데, 이를 옳바르게 처리하지 않았네요.

요약하자면, 스프링 내부적으로는 에러 메시지가 MessageSource 까지만 처리하고, view단에서 보여주는건 타임리프의 기능입니다.

서호준님의 프로필 이미지
서호준

작성한 질문수

질문하기