Validation
์์ฒญ ๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฆ(์ฌ์ฉ์์ ์์ด๋์ ๊ธธ์ด๋ผ๋์ง ์ ๊ทํํ์์ ๋ง์กฑํ๋์ง์ ๋ํ ๊ฒ์ฆ ๋ฑ๋ฑ)๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ณดํต Service ๋ก์ง์ ๋ด๊ฒจ์์ต๋๋ค. DB ์ค๋ณต ์ฒดํฌ ๋ฑ ๋น์ฆ๋์ค ๋ก์ง์ ์๋น์ค์ ๋๊ณ , ์ด ๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์คํ๋ง ๋ถํธ์์ ์ ๊ณตํด์ฃผ๋ Validation ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ์์ฝ๊ฒ ๊ฒ์ฆํ ์ ์์ ๋ฟ๋๋ฌ ์๋น์ค์๋ ์ค์ง ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋ ์ ์๋ ์ฅ์ ์ ๊ฐ์ ธ๊ฐ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ ์ค์ต์ ํตํด ์์ธํ๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋ฐํ๊ฒฝ
- SpringBoot 2.7.9
- JDK 11
- Gradle
์์กด์ฑ ์ถ๊ฐ
SpringBoot 2.3.0 ์ด์๋ถํฐ๋ ์์กด์ฑ์ด ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ์ถ๊ฐํด์ค์ผ ํฉ๋๋ค.
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
Controller
@RestController
public class TestController {
@PostMapping
public Response saveAccount(@Valid @RequestBody SaveDto dto){ // ***
// logic
}
}
public class SaveDto {
@NotBlank(min=6, message="์ ์ ๋ช
์ 6์๋ฆฌ ์ด์์
๋๋ค.")
private String username;
@NotBlank(min=8, message="๋น๋ฐ๋ฒํธ๋ 8์๋ฆฌ ์ด์์
๋๋ค.")
private String password;
}
์ปจํธ๋กค๋ฌ์์ RequestBody์ ๋ฐ๋ ๊ฐ์ฒด์ @Valid ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ๋์ ๋๋ค. SaveDto์ ํ๋กํผํฐ์ ๋ํ ์ ์ฝ์ฌํญ์ ๊ฐ ํ๋์ ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
@NotBlank ์ด ์ธ์๋ ์ฌ๋ฌ ๊ฒ์ฆ์ ํ ์ ์์ต๋๋ค. ๋ ๋ค์ํ ๊ฒ์ฆ์ ํ๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
@Null | null๋ง ํ์ฉ |
@NotNull | null ํ์ฉ X ””, “ “๋ ํ์ฉ |
@NotEmpty | null, “” ํ์ฉ X ” “๋ ํ์ฉ |
@NotBlank | null, “”, “ “ ํ์ฉ X |
@ExceptionHanlder๋ฅผ ์ด์ฉํ ์๋ต ์ฒ๋ฆฌ
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Map<String, String> field(MethodArgumentNotValidException e) {
HashMap<String, String> response = new HashMap<>();
e.getFieldErrors().forEach(error -> {
response.put(error.getField(), error.getDefaultMessage());
});
return response;
}
ํ ์คํธ
ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์คํจํ์ ๋ ์ฌ๋ฐ๋ฅธ ์๋ต๊ฐ์ด ์ค๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
@WebMvcTest
class ValidationControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void validationExceptionTest() throws Exception {
// given
String data = "{\"username\": \"user\", \"password\": \"pass\"}";
// when & then
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content(data))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(jsonPath("username").exists())
.andExpect(jsonPath("password").exists());
}
}
์ ์์ ์ผ๋ก ํ ์คํธ๊ฐ ํต๊ณผํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
๊ฐ์ฌํฉ๋๋ค.