Validation API
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ์ ๋ํ ์ ํจ์ฑ ์ฒดํฌ -> @Valid annotation ์ฌ์ฉ
1. dependency ์ถ๊ฐ
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
2. dto์ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
@Data
@AllArgsConstructor
public class User {
private Integer id;
@Size(min=2, message = "Name์ 2๊ธ์ ์ด์ ์
๋ ฅํด์ฃผ์ธ์.")
private String name;
private String password;
@Past // ๊ณผ๊ฑฐ ๋ ์ง๋ง ๊ฐ๋ฅํ ์ ์ฝ ์กฐ๊ฑด
private Date joinDate;
}
3. controller์ ์ถ๊ฐ
- JDK์ ํฌํจ๋ API์ hibernate library์ ํฌํจ๋ validation ๊ธฐ๋ฅ
- @Valid : ์ฌ์ฉ์ ์ถ๊ฐํ ๋ validation ๊ฒ์ฆ
- @RequestBody : ํ์ฌ variable์ด requestBody ํ์์ผ๋ก ๋ค์ด์ด์ ์๋ฆผ
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @ResponseBody User user){ ... }
4. Exception handler ์ถ๊ฐ
handleMethodArgumentNotValid ๋ฉ์๋ ์ฌ์ ์
- ex.getMessage()๊ฐ ์ค๋ณต๋๊ณ ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์ "Validation Failed"๋ผ๋ ๊ฐ์ผ๋ก ๋์ฒด
- ex.getBindingResult.toString() : @Size(message="{๋ฉ์์ง}") ๊ฐ๋ ํฌํจ
@Override // ๋ฉ์๋ ๊ตฌํ์ด ์๋ชป๋๋ ๊ฒ์ ๋ฐฉ์ง
protected ResponseEntity<Object> handleMethodArgumentNotValid
(MethodArgumentNotValidException ex, // ๋ฐ์ํ exception
HttpHeaders headers, // request header
HttpStatus status,
WebRequest request) { // ์์ฒญ request
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(),
"Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
๋ค๊ตญ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ Internationalization ๊ตฌํ
๋ค๊ตญ์ด ์ฒ๋ฆฌ : ํ๋์ ์ถ๋ ฅ ๊ฐ์ ์ฌ๋ฌ ์ธ์ด๋ก ํ์ํด์ฃผ๋ ๊ธฐ๋ฅ(ํ๋ก์ ํธ ์ ๋ฐ์ ์ผ๋ก ์ ์ฉ)
1. yml ํ์ผ์ ์ค์ ์ถ๊ฐ
spring.messages.basename={์ฌ์ฉํ properties ํ์ผ์ ์ด๋ฆ}
#๋ค๊ตญ์ด ํ์ผ ์ค์
spring:
messages:
basename: messages # ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ message ํ์ผ์ ์ด๋ฆ
2. Resources์ {yml ํ์ผ์์ ์ค์ ํ ์ด๋ฆ}.properties ์์ฑ
๋ค๊ตญ์ด ๋ฒ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ ์์ฑ
// message_properties
# properties : ์๋ฐ์ ๋ฆฌ์์ค ๋ฒ๋ค
# ํน์ key๊ฐ๊ณผ value๋ฅผ ์ ์ฅํด ๋๊ณ ์ฌ์ฉํ ์ ์๋ ์ฉ๋๋ก ์ฌ์ฉ๋จ
greeting.message=์๋
ํ์ธ์
// messages_fr.properties
greeting.message=Bonjour
3. @SpringBootApplication์ localeResolver ์์ฑ
@SpringBootApplication์ @Bean์ ๋ฑ๋กํ๊ฒ ๋๋ฉด Spring Boot๊ฐ ์ด๊ธฐํ๋ ๋, ํด๋น ์ ๋ณด์ ํด๋น๋๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
@Bean
// @SpringBootApplication์ @Bean์ ๋ฑ๋กํ๊ฒ ๋๋ฉด Spring Boot๊ฐ ์ด๊ธฐํ๋ ๋,
// ํด๋น ์ ๋ณด์ ํด๋น๋๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.KOREA); // default : ํ๊ตญ์ด ์ฒ๋ฆฌ
return localeResolver;
}
4. Controller์ ๋ฉ์์ง ์ฃผ์
- Header๋ก language ๊ฐ์ ๋ฐ์์ ํด๋น ์ธ์ด์ ๋ง๋ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅ
- @Autowired : spring framework์ ๋ฑ๋ก๋์ด ์๋ bean ์ค ๊ฐ์ ํ์ ์ ๊ฐ์ง bean์ ์๋์ผ๋ก ์ฃผ์ (annotation์ ์ด์ฉํ ์์กด์ฑ ์ฃผ์ )
- "Accept-Language" ๊ฐ์ด ์ค์ ๋์ง ์์์ ๋๋ ์๋์ผ๋ก default๊ฐ์ธ ํ๊ตญ์ด๋ก ์ค์ (๊ธฐ๋ณธ locale ๊ฐ)
- "Accept-Language" ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด locale์ ํด๋น ๊ฐ์ ์ ์ฅ
@Autowired
private MessageSource messageSource;
@GetMapping(path="/hello-world-internationalized")
public String helloWorldInternationalized(
@RequestHeader(name="Accept-Language", required = false) Locale locale) {
// ์ฒซ๋ฒ์งธ ์ธ์: ์ค์ ํ์ผ์์์ key ๊ฐ
// ๋๋ฒ์งธ ์ธ์: ๋ง์ฝ parameter๋ฅผ ๊ฐ์ง ๊ฐ๋ณ๋ณ์๋ผ๋ฉด parameter ์ง์
// ์ธ๋ฒ์งธ ์ธ์: RequestHeader๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ locale
return messageSource.getMessage("greeting.message", null, locale);
}
'๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring boot/RESTful] Response Filtering (0) | 2022.02.18 |
---|---|
[Spring Boot/RESTful] Response ๋ฐ์ดํฐ ํ์ ๋ฐํ(XML format) (0) | 2022.02.18 |
[Spring Boot/RESTful] User Service API ๊ตฌํ (0) | 2022.02.17 |
[Spring Boot/RESTful] Spring Boot๋ก ๊ฐ๋ฐํ๋ RESTful Service (0) | 2022.02.17 |
[Spring Boot/RESTful] Web Service & Web Application (0) | 2022.02.17 |
๋๊ธ