
현재 개발 중인 앱에 피드백 기능이 있는데, 프론트엔드에서는 300자로 글자 수 제한을 두고 있지만, API를 이용해 직접 요청을 보내면, 글자 수 제한 없이 요청이 가능한 것을 확인했어요. 이는 앱을 사용하는 사용자가 비정상적으로 요청을 보내게 되면 백엔드에서는 무한정으로 보낼 수 있기 때문에 혹시나 하는 상황을 대비해 백엔드에서도 이를 처리할 수단이 필요하다 생각되었어요.
프론트엔드에서만 글자 수 제한을 둬서 막아도, 백엔드에서는 무한정 받을 수 있으니까요.
Spring Boot Validation 을 사용하려면, build.gradle에서 아래의 의존성을 추가해줘야 해요.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
먼저, Controller 부분이에요. @RequestBody 를 사용하는 부분 앞에 @Valid 어노테이션을 추가해줘요.
@PostMapping("/request")
public ResponseEntity<SupportResponseDto> requestSupport(@Valid @RequestBody SupportRequestDto supportRequestDto) {
return supportService.requestSupport(SecurityUtil.getCurrentUsername(), supportRequestDto);
}
그 다음, 위 Controller에서 이용하는 SupportRequestDto에 대한 부분이에요. 아래와 같이 Validation 값을 추가하였어요.
supportType은 Null이 되어서는 안 된다.title은 최소 5자, 최대 20자까지만 허용한다.content는 최소 20자, 최대 300자까지만 허용한다.public class SupportRequestDto {
@NotNull
private SupportType supportType;
@Size(min = 5, max = 20)
private String title;
@Size(min = 20, max = 300)
private String content;
}
Validation을 적용하기 이전에는 아래의 요청 값이 200 OK로 정상 처리되었어요. 아래 값을 확인해 보면, title의 값은 20자가 초과되었고, content 값 또한 300자가 초과되었죠.
{
"supportType": "APP",
"title": "대충 이 곳이 Input 이 문장dasd",
"content": "대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요. 대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정이에요."
}

하지만 위와 같이 API(백엔드)에서는 정상 처리되어 Support가 등록된 것을 확인할 수 있어요.

위와 같이 똑같은 요청 값으로 API 요청을 보낸 것을 위 사진을 통해 확인할 수 있어요.

하지만, 400 Bad Request 결과가 나오며 등록이 되지 않는 것을 확인할 수 있죠. 이제 아래와 같이 정상적인 값(Validation을 만족하는 요청)으로 요청을 다시 보내볼게요.
{
"supportType": "APP",
"title": "대충 이 곳이",
"content": "대충 이 곳이 Input 이 문장은 300자 정도로 작성될 예정"
}

200 OK 결과 값이 나오며, 정상적으로 등록되는 걸 확인하며 Validation이 잘 적용된 것을 확인할 수 있어요.
@Email@Future@Past@Future 어노테이션과 반대돼요.@Max(value = 값)value의 값보다 큰 값만 유효해요.@Min(value = 값)value의 값보다 작은 값만 유효해요.@NotNull@NotEmpty@Pattern(regxp = 정규식)@Size(min = 최소값, max = 최대값)