[java] JAX-RS를 이용한 데이터 검증과 유효성 검사

JAX-RS는 Java 언어를 사용하여 RESTful 웹 서비스를 개발할 때 많이 사용되는 프레임워크입니다. 이를 통해 간단하게 API를 작성하고 호출할 수 있습니다. 하지만 API의 입력 데이터의 유효성을 검사하는 기능이 필요한 경우가 많이 있습니다. 이를 위해 JAX-RS에서 제공하는 데이터 검증과 유효성 검사 기능을 알아보겠습니다.

1. 데이터 검증 어노테이션 사용하기

JAX-RS에서는 javax.validation 패키지를 통해 데이터 검증을 위한 여러 어노테이션을 제공합니다. 이 어노테이션들은 입력 데이터의 각 필드에 적용하여 유효성을 검사할 수 있습니다.

가장 기본적인 어노테이션으로는 @NotNull, @Size, @Min, @Max 등이 있습니다. 이들 어노테이션을 사용하여 필드의 값이 null이 아니고, 지정된 사이즈나 값 범위 내에 있는지 검증할 수 있습니다.

@Path("/users")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class UserController {
    
    @POST
    @Path("/")
    public Response createUser(@NotNull @Size(min = 1, max = 50) String name) {
        // 유효성 검사에 실패한 경우, JAX-RS는 자동으로 400 Bad Request 응답을 반환합니다.
        // 유효성 검사에 통과한 경우, API 로직을 실행하고 200 OK 응답을 반환합니다.
    }
}

위의 예제에서는 createUser 메서드의 name 매개변수에 @NotNull 어노테이션과 @Size 어노테이션을 적용했습니다. 이를 통해 name 필드의 값이 null이 아니고, 길이가 1에서 50 사이인지 검사합니다.

2. 커스텀 검증 어노테이션 만들기

JAX-RS에서 제공하는 어노테이션만으로는 모든 검증 규칙을 표현하기에는 한계가 있습니다. 이런 경우에는 커스텀 검증 어노테이션을 만들어 사용할 수 있습니다.

커스텀 검증 어노테이션을 만들기 위해서는 javax.validation.ConstraintValidator 인터페이스를 구현해야 합니다. 이 인터페이스를 구현하는 클래스에서는 검증 로직을 작성하여 입력 데이터의 유효성을 검사할 수 있습니다.

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {
    String message() default "Invalid value";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 유효성 검사를 위한 로직 작성
    }
}

위의 예제에서는 @MyCustomValidation이라는 커스텀 검증 어노테이션을 정의하였습니다. 이 어노테이션을 사용하면 해당 필드의 값이 특정 조건을 만족하는지 검사할 수 있습니다.

3. JAX-RS와 데이터 검증 통합하기

JAX-RS에서는 검증 예외가 발생할 경우 자동으로 400 Bad Request 응답을 반환하는 기능도 제공합니다. 이를 위해 javax.validation.ValidationExceptionMapper 클래스를 사용할 수 있습니다. 이 클래스를 사용하면 검증 예외가 발생하면 예외 메시지와 함께 400 Bad Request 응답을 자동으로 반환합니다.

@Provider
public class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {
    @Override
    public Response toResponse(ValidationException exception) {
        String message = exception.getMessage();
        return Response.status(Response.Status.BAD_REQUEST).entity(message).build();
    }
}

위의 예제에서는 javax.validation.ValidationException 예외가 발생하면 ValidationExceptionMapper 클래스가 해당 예외를 처리하여 400 Bad Request 응답을 반환합니다. 이를 JAX-RS 어플리케이션에 등록하면 자동으로 데이터 검증과 예외 처리를 통합할 수 있습니다.

JAX-RS를 사용하여 데이터 검증과 유효성 검사를 쉽게 구현할 수 있습니다. 데이터 검증 어노테이션을 사용하거나, 커스텀 검증 어노테이션을 만들어 사용하면 API의 입력 데이터의 유효성을 쉽게 검사할 수 있습니다. 또한, JAX-RS에서 제공하는 예외 처리 기능을 이용하여 검증 예외가 발생했을 때 적절한 응답을 반환할 수 있습니다.

참고 자료