스프링MVC 2(1)

Seung·2023년 2월 14일
0
post-thumbnail

메시지와 국제화

메시지

  • messages.properties 라는 메시지 관리용 파일을 만들고 사용

    item=상품
    item.itemName=상품명
    item.itemPrice=상품가격

국제화

  • messages_en.properties, messages_ko.properteis 등
  • 국제화가 적용되지 않을 경우 기본인 messages.properties가 기본이다.
    해당 경로는 /resource/messages.properties이다.

    messages.properties
    hello=안녕
    hello.name=안녕 {0}

    messages_en.properties
    hello=hello
    hello.name=hello {0}

스프링부트 메시지 소스 설정

  • application.properties 설정

    spring.messages.basename=messages,config.i18n.messages
    기본 설정값은 messages 추가 설정시 ',' 를 사용해서 추가
    i18n은 다국화 처리

검증

BindingResult 사용과 오류 메시지

  • 검증 오류를 보관하는 객체이다. 검증 오류가 발생시 여기에 보관된다.
    BindingResult가 있을 경우 @ModelAttribute에 데이터 바인딩시 오류가
    발생해도 컨트롤러가 호출된다.
  • BindingResult가 검증 오류를 적용하는 3가지 방법
    • 객체에 타입오류 등으로 바인딩 실패하는 경우 FieldError로 넣어준다.
    • 개발자가 직접 넣어준다.
    • Validator 사용
  • FieldError, ObjectError 생성자

    public FieldError(String objectName, String field, String defaultMessage);
    public FieldError(String objectName, @Nullable Object rejectValue, boolean bindingFailure, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage);
    파라미터 종류
    objectName : 오류가 발생한 객체명
    field : 오류 필드
    rejectValue : 사용자가 입력한 값(오류 값)
    bindingFailure : 타입오류 가은 바인딩 실패인지, 검증 실패인지 구분값
    codes : 메시지 코드
    argument : 메시지에서 사용하는 인자
    defaultMessage : 기본 오류메시지
    *ObjectError 도 유사하게 두가지 생성자를 제공한다.

  • errors 메시지 파일 생성

    application.properties에 메시지 설정추가
    'spring.message.basename=messages,errors'
    errors.properties 추가

  • 기본 메시지 생성규칙

    객체오류
    1: code + "." + object name
    2: code
    ex) 오류코드가 : required, object name : item
    1: required.item
    2:required
    필드오류
    1: code + "." + object name + "." + field
    2: code + "." + field
    3: code + "." + fiedl type
    4: code
    ex) 오류코드 : typeMismatch, object name : user,
    field : age, field type : int
    1:typeMismatch.user.age
    2:typeMismatch.age
    3:typeMismatch.int
    4:typeMismatch

  • errors.properties 예시

    #objectError Level1
    totalPriceMin.item=상품의 가격은 {0}원 이상이어야 한다. 현재값 = {1}
    #Lever2
    totalPriceMin=가격은 {0}원 이상이어야 한다. 현재값 = {1}
    #FieldError Level1
    required.item.itemName=상품명은 필수입니다.
    required.item.price=가격은 {0}~{1}까지 허용합니다.
    #Lever2
    생략
    #Lever3
    required.java.lang.String=필수 문자입니다.
    required.java.lang.Integer=필수 숫자입니다.
    #Levet4
    required=필수 값 입니다.
    *자세한 내용부터 우선순위로 메시지가 생성된다.

  • reject(), rejectValue() 메서드

    void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
    void reject(String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage);
    파라미터
    field : 오류 필드명
    errorCode : 오류코드명 (기본 오류메시지 활용)
    errorsArgs : 오류메시지 {0}을 치환하기 위한 값
    defaultMessage : 오류메시지를 하나도 못찾을 경우 사용할 메시지 기본값

public String add(@ModelAttribute Item item, BindingResult bindingReult){
 ----
 검증로직
 검증 오류가 있을 경우 
 1.ObjectError, FieldError 사용
   bindingResult.addError(new ObjectError(--));
   bindingResult.addError(new FieldError(--));
 2.rejectValue, reject 사용
 BindingResult는 target (item) 이라는 것을 알기에 단순화 가능
   bindingResult.rejectValue("itemName","required");
   bindingResult.reject("totalPriceMin",new Object[]{10000,10000},null);
 ----
 }

BeanValidation 사용

ItemSaveForm item저장용 폼 예시
BeanValidation 애노테이션 적용 

@Data
public class ItemSaveForm{

	@NotBlank
    private String itemName;
    
    @NotNull
    @Range(min = 1000, max = 1000000)
    private Integer price;
}
  • 등록폼과 수정폼 객체 구분은 각각 요구하는 데이터가 다르거나, 요구사항이 다르기때문에 분리하여 작성
  • 스프링부트는 애노테이션을 보고 검증을 수행한다.
    사용시 @Valid, @Validate 를 사용하여 검증을 수행한다.
    @Valid는 자바표준검증
    @Validate는 스프링전용검증
public String addForm(@Valid @ModelAttribute ItemSaveForm form, BindingResult bindingResult, RedirectAttributes redirectAttributes){

---
@Valid,@Validate로 ItemSaveForm의 FieldError는 BindingError로 바인딩된다.
bindingResult가 있을 경우 에러 처리
ObjectError는 따로 구현하는게 편함.

RedirectAttributes는 페이지 리다이렉션을 위하여 사용
---
return "redirect:/~~";
}
  • 검증순서
  1. @ModelAttribute 각각의 필드에 타입 변환시도.
    • 성공시 다음으로
    • 실패시 typeMismatch로 FieldError 추가
  2. Validator 적용
  • BeanValidation 오류메시지는 애노테이션 명과 동일
    ex) @NotBlank > NotBlank.item.itemName
profile
한번 해봅시다.

0개의 댓글