JSR-303 그리고 validation
Bean Validation 1.0 은 JSR-303이고 Bean Validation 2.0 은 JSR-380이다.
우리는 특정 값이 null 을 허용하지 않고 싶다. 그러면 아래와 같이 @notnull 하나 추가하면 바로 해결된다.
@Data
@ApiModel(description="User Model")
public class User {
@ApiModelProperty("user 식별자")
private Long id;
@NotNull
@ApiModelProperty("user 이름")
private String name;
@NotNull
@ApiModelProperty("user 나이")
private Integer age;
}
체크해야 되는 부분에서 @Valid 어노테이션을 달아준다.
@PostMapping("/")
@ApiOperation(value = "사용자 생성", notes = "user model 세팅된 값으로 사용자 생성")
public String postUser(@Valid @RequestBody User user) {
users.put(user.getId(), user);
return "success";
}
cUrl 로 요청을 해본다.
curl -X POST \
http://localhost:8080/users/ \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 72745d04-caa5-44a1-be84-ba9c115f4dfb' \
-H 'cache-control: no-cache' \
-d '{
}'
결과
{
"timestamp": "2022-12-21T05:45:19.221+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotNull.user.age",
"NotNull.age",
"NotNull.java.lang.Integer",
"NotNull"
],
"arguments": [
{
"codes": [
"user.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
}
],
"defaultMessage": "null을 허용안함",
"objectName": "user",
"field": "age",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
},
{
"codes": [
"NotNull.user.name",
"NotNull.name",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"user.name",
"name"
],
"arguments": null,
"defaultMessage": "name",
"code": "name"
}
],
"defaultMessage": "null을 허용안함",
"objectName": "user",
"field": "name",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
}
],
"message": "Validation failed for object='user'. Error count: 2",
"path": "/users/"
}
다른것도 체크해보자. 문자열 길이, 수자크기, 포맷 등.
@Data
@ApiModel(description="User Model")
public class User {
@ApiModelProperty("user 식별자")
private Long id;
@NotNull
@Size(min = 2, max = 10)
@ApiModelProperty("user 이름")
private String name;
@NotNull
@Max(100)
@Min(18)
@ApiModelProperty("user 나이")
private Integer age;
@NotNull
@Email
@ApiModelProperty("user 메일")
private String email;
}
curl -X POST \
http://localhost:8080/users/ \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 114db0f0-bdce-4ba5-baf6-01e5104a68a3' \
-H 'cache-control: no-cache' \
-d '{
"name": "abcdefg",
"age": 17,
"email": "aaaa"
}'
{
"timestamp": "2022-12-21T06:24:30.518+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"Size.user.name",
"Size.name",
"Size.java.lang.String",
"Size"
],
"arguments": [
{
"codes": [
"user.name",
"name"
],
"arguments": null,
"defaultMessage": "name",
"code": "name"
},
5,
2
],
"defaultMessage": "2와10사이",
"objectName": "user",
"field": "name",
"rejectedValue": "abcdefg",
"bindingFailure": false,
"code": "Size"
},
{
"codes": [
"Min.user.age",
"Min.age",
"Min.java.lang.Integer",
"Min"
],
"arguments": [
{
"codes": [
"user.age",
"age"
],
"arguments": null,
"defaultMessage": "age",
"code": "age"
},
10
],
"defaultMessage": "18보다 작을수 없습니다.",
"objectName": "user",
"field": "age",
"rejectedValue": 8,
"bindingFailure": false,
"code": "Min"
},
{
"codes": [
"Email.user.email",
"Email.email",
"Email.java.lang.String",
"Email"
],
"arguments": [
{
"codes": [
"user.email",
"email"
],
"arguments": null,
"defaultMessage": "email",
"code": "email"
},
[],
{
"defaultMessage": ".*",
"codes": [
".*"
],
"arguments": null
}
],
"defaultMessage": "메일격식이 아닙니다.",
"objectName": "user",
"field": "email",
"rejectedValue": "aaaa",
"bindingFailure": false,
"code": "Email"
}
],
"message": "Validation failed for object='user'. Error count: 3",
"path": "/users/"
}
어노테이션 하나로 if ... else 과정을 건너뛸수있어서 참 편리하다.
끝!
Last updated