본문 바로가기
Programming/SpringBoot

[Spring Boot] RESTful Service 강의 정리(3) - 유효성체크(Validation API)와 다국어처리(LocaleResolver)

by prinha 2020. 8. 24.
반응형

 

 

[Spring Boot] RESTful Service 강의 정리(2) / User Service API 구현

[User Service API 구현] 1) Domain Class 생성 package com.example.restfulwebservice.user; import lombok.AllArgsConstructor; import lombok.Data; import java.util.Date; @Data @AllArgsConstructor public..

prinha.tistory.com


 

1) 유효성 체크를 위한 Validation API 사용 - 사용자가 입력한 데이터에 대한 유효성 체크 @Valid

// User

import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;

@Data
@AllArgsConstructor
public class User {
    private Integer id;

    @Size(min=2)
    private String name;

    // 과거 데이터 제약 조건
    @Past
    private Date joinDate;
}
// UserController

// @Valid 어노테이션 추가
// 새로운 사용자를 등록하는 method 구현
 @PostMapping("/users")
 public ResponseEntity<User> createUser(@Valid @RequestBody User user){
     User savedUser = service.save(user);

     URI location = ServletUriComponentsBuilder.fromCurrentRequest()
             .path("/{id}")
             .buildAndExpand(savedUser.getId())
             .toUri();

     return ResponseEntity.created(location).build();
 }

잘못된 요청이라고만 뜨고 body에 예외 내용 전달 X

 

 

 

 

 // CustomizedResponseEntityExceptionHandler
 
 // 사용자가 입력한 값에 문제가 생겼을 때 사용하는 예외 메소드 재정의
 @Override
 protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                   HttpHeaders headers,
                   HttpStatus status,
                   WebRequest request) {

        ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
                 ex.getMessage(),ex.getBindingResult().toString());

        return new ResponseEntity(exceptionResponse,HttpStatus.BAD_REQUEST);
    }

handleMethodArgumentNotValid 메소드 재정의 해주기
ExceptionResponse에 작성된 예외가 발생했을 때 메시지 출력

 

 

 

 

 // CustomizedResponseEntityExceptionHandler
 
 // 사용자가 입력한 값에 문제가 생겼을 때 사용하는 예외 메소드 재정의
 @Override
 protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                   HttpHeaders headers,
                   HttpStatus status,
                   WebRequest request) {

        ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
                 "Validation Failed",ex.getBindingResult().toString());

        return new ResponseEntity(exceptionResponse,HttpStatus.BAD_REQUEST);
    }
// User

@Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
private String name;

메시지와 디테일 메시지를 간단하게 

 


 

2) 다국어 처리를 위한 Internationalization 구현 방법

다국어 처리 : 하나의 출력 값을 여러 가지 언어로 표시해주는 기능
(제공하고자하는 언어별로 지역코드, 언어 설정에 따라 적절하게  표시)

- 특정 Controller에 한해서가 아니라 Project 전반적으로 적용

 

- 다국어 처리에 필요한 bean을 Spring Boot Application에 등록(@SpringBootApplication 어노테이션을 가지고 있는 클래스)

- @bean을 등록하게 되면 SpringBoot가 초기화될 때, 해당 빈에 해당하는 정보가 메모리에 같이 등록된다.

package com.example.restfulwebservice;
import org.apache.tomcat.util.descriptor.LocalResolver;
import org.hibernate.Session;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

@SpringBootApplication
public class RestfulWebServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(RestfulWebServiceApplication.class, args);
    }

    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.KOREA);
        return localeResolver;
    }

}

 

- application.yml 에 사용할 다국어파일 등록하기

# 사용할 다국어 파일명을 messages로 사용한다는 의미
spring:
  messages:
    basename: messages

 

- Resource에 다국어 파일(properties) 생성

// messages.properties
greeting.message=안녕하세요

// messages_en.properties
greeting.message=Hello

// messages_fr.properties
greeting.message=Bonjour

 

- Controller에 메세지 주입

// HelloWorldController

// 어노테이션을 통한 의존성 주입
 @Autowired
 private MessageSource messageSource;

 @GetMapping(path="/hello-world-internationalized")
 public String helloWorldInternationalize(
        @RequestHeader(name="Accept-Language", required = false) 
        Locale locale)
 {
     return messageSource.getMessage("greeting.message",null,locale);
 }

 

 

locale값을지정하지않았을때에default_locale값(한국어) 리턴

 

header에key값value값추가

 

 

반응형