ch 12. MVC 2: 메시지 / 커맨드 객체 검증

728x90
참고 도서 : 스프링5 프로그래밍 입문 - 최범균 저

ch 12. MVC 2: 메시지 /커맨드 객체 검증 

*[이 장 학습 내용]
-메시지 출력 방법/커맨드 객체 값 검증 방법

 

 1. [프로젝트 준비] : 11장 내용과 동일

-<뷰코드에 직접 하드 코딩 하는 방식의 문제점>
           1) 동일 문자열에 대한 변경 -> 각 폼에서 모두 찾아서 변경해야함.
           2) 다국어 지원 서비스 제공 X (각 언어별로 뷰 코드를 따로 만들어야함)

<spring:message> 태그로 메시지 출력하기

#스프링은
-> 뷰 코드에서 사용할 문자열을 언어별로 파일에 보관
-> 뷰 코드는 언어에 따라 언어별 파일 속 문자열 읽어와 출력하는 기능 자체적 제공

 


 2. [메시지 처리]

<메시지 출력 매커니즘>

 메시지 파일 작성 : 출력할 메시지 내용 작성
 MessageSource 빈 설정 : 메시지 파일 내용 읽어옴
 JSP 코드에서 <spring:message> 태그 사용 : 메시지 출력

▶[메시지 출력하기]

         메시지 파일 작성 : 출력할 메시지 내용 작성

-[.properties] :자바 프로퍼티 파일 형식으로 작성
-UTF-8 인코딩 사용하여 작성 -> 다국어 지원 호환성을 위함(유니코드 값 표현 )

<label.properties 파일>

member.register=회원가입


//약관 동의 Step 뷰에 출력될 메시지 내용
term=약관
term.agree=약관동의
next.btn=다음단계


//회원 가입 Step 뷰에 출력될 메시지 내용
member.info=회원정보
email=이메일
name=이름
password=비밀번호
password.confirm=비밀번호 확인
register.btn=가입 완료


//가입 완료 결과 Step 뷰에 출력될 메시지 내용
register.done=<strong>{0}님 ({1})</strong>, 회원 가입을 완료했습니다.


go.main=메인으로 이동

 

         ➁ MessageSource 빈 설정 : 메시지 파일 내용 읽어옴

-MvcConfig 설정 클래스(스프링 기본 설정 파일) 속에 MessageSource 빈을 추가
-setBagenames() 메소드의 인수 : 메시지 읽어들일 프로퍼티 목록 설정

<MvcConfig.java>

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {//Mvc 기본 설정 클래스 
	 ...
	@Bean //MessaageSoure 타입 빈 추가 
	public MessageSource messageSource() { 
		ResourceBundleMessageSource ms = 
				new ResourceBundleMessageSource();
		ms.setBasenames("message.label"); 
                     //message 패키지 속 label 프로퍼티 파일로부터 메시지 읽어옴 설정
		ms.setDefaultEncoding("UTF-8"); //기본 인코딩 값 UTF-8 로 통일 
		return ms;
	}
}

 

         JSP 코드에서 <spring:message> 태그 사용 : 메시지 출력

-커스텀 태그 사용을 위해 taglib 설정 추가 필요

-<spring:message> 태그

: 이 태그 code 속성값에 일치하는 프로퍼티 값을 출력함
: MessageSource로부터 코드에 해당하는 메시지 값을 읽어오는데,
앞서, MessageSource는 다시 label.properties 파일로부터 메시지를 읽어오기 때문에
                                  이 태그의 위치에 label.properties 에 설정한 프로퍼티 값이 출력된다.

<step1.jsp> //뷰 코드 나머지 뷰코드는 시간관계상 X

<html>
<head>
    <title><spring:message code="member.register" /></title>
</head>
<body>
    <h2><spring:message code="term" /></h2>
    <p>약관 내용</p>
    <form action="step2" method="post">
    <label>
        <input type="checkbox" name="agree" value="true"> 
        <spring:message code="term.agree" />
    </label>
    <input type="submit" value="<spring:message code="next.btn" />" />
    </form>
</body>
</html>
 

[메시지 처리하기]

#스프링은 메시지 문자열 처리하는 MessageSource 인터페이스를 정의하고 있다.

<MessggeSource 인터페이스>
- 이 인터페이스의 getMessage() 메소드
: Locale타입 파라미터는 지역 구분을 위함이다.
: 같은 코드라 하더라도 지역에 따라 다른 메시지 제공할 수 있도록 설계되어 있다.

: 이 기능 덕분에 한국에서 접근 시 -> 한국어로 메시지 처리 후 출력
                     해외에서 접근 시 -> 영어로 메시지 처리 후 출력

public interface MessageSource{ //MessageSource 인터페이스

          String getMessage(String code, Object[] args,
                            String defoultMessage, Locale locale);

          String getMessage(String code, Object[] args, Locale locale)
                             throws NoSuchMessageException;
                    ...
}

-> <spring:message> 태그는 스프링 설정에 등록된 MessageSource 사용 시,                                                                       내부적으로 MessageSourcegetMessage() 메소드를 실행하여 필요한 메시지를 구한다.


[메시지 인자 처리] : 인덱스 기반 변수

-MessageSourcegetMessge() 메소드인덱스 기반 변수 전달을 위해 Object[] 배열타입의 파라미터를 사용.
                       String getMessage(String code, Object[] args, Locale locale)

-뷰 코드는 <string:message> 태그 사용 , arguments 속성을 사용하여 인덱스 기반 변수값 전달
                      <string:message code = “register.done” arguments=“${registerRequest.name}”/>

 3. [커맨드 객체 값 검증과 에러 메시지 처리]

-폼 속 사용자 입력값에 대한 검증 처리 = 커맨드 객체 값 검증에러 메시지 처리를 함

커맨드 객체 검증 -> 검증 결과를 에러코드로 저장


JSP에서 에러코드에 맞는 에러 메시지 출력


출력할 에러 메시지를 메시지 프로퍼티 파일에 추가

                  ➀ 커맨드 객체 검증 -> 검증 결과를 에러코드로 저장

-[Validator 인터페이스]

public interface Validator{
	boolean supports(Class<?> clazz); //Validator가 검증 가능한 타입인지 검사 
	void validate(Object target, Errors errors); //검증 후 오류 결과를 Error 타입에 넣음 
}
-Validator 인터페이스를 구현한 클래스에서 위의 메소드를 재정의하여 커맨드 객체 검사
-검사 후 에러 코드를 지정함. (뷰코드는 여기서 지정한 에러 코드에 맞는 에러 메시지 출력)

                 JSP에서 에러코드에 맞는 에러 메시지 출력

-커맨드 객체의 에러 메시지 출력하기
-앞서 에러 코드를 지정한 이유 : 각 에러 코드에 알맞은 에러 메시지 출력을 위함
-JSP <form:errors> 태그 사용하여 에러 해당 메시지 출력함
-<form:errors> 태그의 path 속성은 에러 메시지 출력할 프로퍼티 이름을 지정

                 ➂ 출력할 에러 메시지를 메시지 프로퍼티 파일에 추가

-label.properties 파일에 해당 에러코드에 해당하는 메시지 내용을 작성한다.


 4. [글로벌 범위 Validator 과 컨트롤러 범위 Validator]

                 [글로벌 범위 Validator] :@Valid 애노테이션

모든 컨트롤러에 적용 가능한 Validator
getValidator() 메소드가 리턴한 객체를 글로벌 범위 Validator로 사용
@Valid 붙이면 글로벌 범위 Validator가 해당 타입 검증 후 그 결과를 Error객체에 저장
이 처리는 요청 처리 메소드 실행 전에 적용된다.
<필요한 설정>

1) MvcConfig 클래스 내부에 getValidator() 메소드 구현
                  -이 메소드가 Validator 구현 객체 리턴하도록 구현함
2) Validator 가 검증할 커맨드 객체 파라미터 앞에 @Valid 붙임

                 [컨트롤러 범위 Validator] :@InitBinder 애노테이션

-@InitBinder 사용 ->컨트롤러 범위에 적용할 Validator 설정 O


 5. [Bean Validation 이용한 값 검증 처리]

-Bean Validation 스펙 안에는 @Valid/@NotNull/@Digits/@Size 등의 애노테이션 정의

-이 애노테이션 사용 -> Validator 작성 없이 커맨드 객체 값 처리 O

<방법>

1) Bean Validation 관련 의존을 설정에 추가


2) 커맨드 객체에 @NotNull/@Digits 등의 애노테이션 이용하여 검증 규칙 설정


3) 애노테이션 적용한 커맨드 객체 검증할 수 있는 OptionalValidatorFactoryBean을 빈으로 등록


4) @Valid를 요청 매핑 처리 메소드의 커맨드 객체 파라미터에 붙여서 글로벌 Validator로 검증

 

728x90