Spring Validationμ ν΅ν΄ λ°μ΄ν° μ ν¨μ± κ²μ¦νκΈ°
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());
}
}
μ μμ μΌλ‘ ν μ€νΈκ° ν΅κ³Όνλ κ²μ νμΈν μ μμ΅λλ€!
κ°μ¬ν©λλ€.