참고 도서 : 스프링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 사용 시, 내부적으로 MessageSource의 getMessage() 메소드를 실행하여 필요한 메시지를 구한다.
▶[메시지 인자 처리] : 인덱스 기반 변수
-MessageSource의 getMessge() 메소드는 인덱스 기반 변수 전달을 위해 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로 검증 |
'Web(웹)_관련 공부 모음 > [개념]_스프링 5 프로그래밍' 카테고리의 다른 글
ch14. MVC 4: 날짜 값 변환/@PathVariable/익셉션 처리 (0) | 2022.02.03 |
---|---|
ch13. MVC 3: 세션 /인터셉터 / 쿠키 (0) | 2022.02.02 |
ch11. MVC 1: 요청 매핑/커맨드 객체/ 리다이렉트/ 폼 태그/모델 (0) | 2022.02.01 |
ch10. 스프링 MVC 프레임워크 동작 방식 (0) | 2022.01.31 |
ch09. 스프링 MVC 시작하기 (0) | 2022.01.31 |