[Spring] API, Validation API and LocaleResolver

홍정완·2022년 3월 26일
0

Spring

목록 보기
8/32
post-thumbnail
post-custom-banner

Validation API(유효성 체크) 👉 사용자가 입력한 데이터에 대한 유효성 체크

@Valid




// User Class

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)  // 최소 길이 2개 이상
private String name;  

@Past // 미래 데이터를 사용할 수 없다는 제약 조건
private Date joinDate; 
}



 // UserController Class
 
 @PostMapping("/users")
 public ResponseEntity<User> createUser(@Valid @RequestBody User user){
        User savedUser = service.save(user);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}") //반환 값은 가변 변수 id
                .buildAndExpand(savedUser.getId()) //저장된 user 값의 id 값을 지정
                .toUri(); //URI로 반환

        return ResponseEntity.created(location).build();
        //서버로부터 적절한 상태 코드를 보내주는 것이 좋은 api임
    }



👉 상태 코드는 400 Bad Request 다만, body에 예외 내용 전달은 X




예외가 발생했을 때 메시지를 출력하기 위해 ExceptionResponse에 예외를 작성한다.

다음과 같이 handleMethodArgumentNotValid 메서드를 재정의 한다.


// CustomizedResponseEntityExceptionHandler Class

@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);
    }



👉 상태 코드는 400 Bad Request 동일, body에 예외 내용 전달 O




Refactoring 👉


// CustomizedResponseEntityExceptionHandler Class 👉 수정

ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), 
	"Validation Failed", ex.getBindingResult().toString());
// User Class 👉 수정

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

👉 Body의 예외 message, details 내용이 수정한 대로 전달된다.





다국어 처리를 위한 Internationalization 구현


다국어 처리 : 하나의 출력값을 여러 가지 언어로 표시 해주는 기능


  • (제공하고자 하는 언어별로 지역 코드, 언어 설정에 따라 적절하게 표시)

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



  • 다국어 처리에 필요한 bean을 Spring Boot Application에 등록
@SpringBootApplication
public class RestfulWebServiceApplication {

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

	@Bean
	public LocaleResolver localeResolver() { // 웹 요청과 관련해서 Locale을 추출하고 이 Locale 객체를 이용해서 알맞은 언어의 메시지를 선택
		SessionLocaleResolver localeResolver = new SessionLocaleResolver(); // Session에 Locale 정보를 넣고 이를 통해 다국어를 처리해 주는 역할
		localeResolver.setDefaultLocale(Locale.KOREA);
		return localeResolver;
	}

}



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

  • application.yml에 사용할 다국어 파일 등록

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


// Controller

	@Autowired
    private MessageSource messageSource;

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



locale 값을 지정하지 않았을 때는 👉 default_locale값인 한국어 리턴

ex) Headers에 KEY(Accept-Language) VALUE(fr) 👉 프랑스어 리턴

profile
습관이 전부다.
post-custom-banner

0개의 댓글