Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240809 Validation 본문

개발Article

[TIL]20240809 Validation

최밤빵 2024. 8. 9. 20:48

Validation에 대해서 솔직히 잘 모르고있다가, 유효성 검사를 위해 @Valid를 사용하면서 그냥 이거만 쓰면 되는건가? 라는 망충한 생각을했기 때문에 공부가 필요했다. 요즘은 개발일지 쓰면서 반성을 많이하게 되는거 같은데, 대체 나는 강의를 어떻게 들었길래 기억이 잘 안나는지 모르겠다😢

Validation(유효성 검사)은 소프트웨어 개발에서 사용자 입력을 검증하고, 잘못된 데이터가 시스템에 들어오는 것을 방지하기 위한 중요한 단계이다. 특히 웹 애플리케이션에서는 클라이언트에서 보내는 다양한 데이터의 형식과 내용을 검증하여 서버의 안정성을 유지하고, 보안을 강화하는 데 큰 역할을 한다. Spring Boot와 같은 프레임워크에서 Validation을 구현하는 방법과 핵심 개념에 대해 알아보고, 간단한 코드 예시를 통해 이해하려고 노력 중! 

🤓Validation이란?

Validation(유효성 검사)은 사용자 입력 데이터가 애플리케이션의 기대와 요구 사항에 맞는지 확인하는 과정을 의미한다. 이 과정은 주로 데이터가 서버로 도달하기 전에 클라이언트 측과 서버 측에서 이루어지고, 이를 통해 예상치 못한 데이터로 인해 발생할 수 있는 시스템 오류나 보안 문제를 예방할 수 있다. Validation은 필수 필드 검증, 형식 검증, 범위 검증, 비즈니스 로직 검증 등 다양한 형태로 적용될 수 있다.

 

▶ Spring Boot에서의 Validation

Spring Boot에서는 데이터 유효성 검사를 쉽게 적용할 수 있도록 javax.validation 패키지(javax는 언제봐도 불편해...)의 표준 어노테이션과 spring-boot-starter-validation 라이브러리를 제공한다. 이 라이브러리를 사용하면 다양한 검증 어노테이션을 DTO(Data Transfer Object) 클래스에 선언하여 유효성 검사를 간편하게 설정할 수 있다.

Spring의 Validation을 적용하기 위해서는 다음과 같은 주요 단계를 따라야 한다:

 

→ 의존성 추가:

spring-boot-starter-validation 의존성을 build.gradle 파일에 추가한다.

→ DTO 클래스에 애너테이션 추가:

데이터 검증이 필요한 필드에 다양한 검증 어노테이션을 추가한다. @NotNull, @Size, @Email, @Pattern 등이 있다.

→ Controller에서 유효성 검사 활성화:

@Valid 또는 @Validated 애너테이션을 사용하여 DTO 객체에 대해 자동으로 유효성 검사를 수행할 수 있다.

 

▶ Validation 애너테이션의 종류

Spring Boot에서는 다양한 Validation 어노테이션을 제공하고, 다양한 형태의 데이터 검증을 손쉽게 구현할 수 있다.

  • @NotNull: 필드가 null이 아닌지 검증한다.
  • @NotEmpty: 필드가 null이 아니고, 빈 문자열이 아닌지 검증한다.
  • @NotBlank: 공백이 아닌 문자를 포함하는지 검증한다.
  • @Size(min, max): 문자열, 컬렉션, 배열 등이 지정된 최소 및 최대 크기를 가지는지 검증한다.
  • @Min / @Max: 숫자가 지정된 최소값/최대값 이상인지 검증한다.
  • @Email: 문자열이 이메일 형식에 맞는지 검증한다.
  • @Pattern: 정규 표현식 패턴에 맞는지 검증한다.

▶Validation 구현 예시

다음은 Spring Boot에서 사용자의 등록 정보를 검증하는 예시로, 여기서는 User 객체에 대한 검증을 설정하고, 유효하지 않은 데이터가 입력될 경우 적절한 에러 메시지를 반환하는 방법을 보여준다.

▽ DTO 클래스 예시: UserRequestDto.java

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public class UserRequestDto {

    @NotBlank(message = "이름은 필수 입력 항목입니다.")  // 공백일 수 없음
    private String name;

    @Email(message = "유효한 이메일 주소여야 합니다.")  // 이메일 형식 검사
    @NotBlank(message = "이메일은 필수 입력 항목입니다.")  // 공백일 수 없음
    private String email;

    @NotNull(message = "나이는 필수 입력 항목입니다.")  // null 불가
    @Min(value = 18, message = "나이는 최소 18세 이상이어야 합니다.")  // 최소 나이 조건
    private Integer age;
    
}

 

→ @NotBlank: name과 email 필드에 공백 문자열을 허용하지 않도록 설정했다.

→ @Email: email 필드에 올바른 이메일 형식인지 검사하도록 설정했다.

→ @NotNull과 @Min: age 필드에 null 값을 허용하지 않으며, 최소값을 18로 설정했다.

 

▽ Controller 클래스 예시: UserController.java

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@Valid @RequestBody UserRequestDto userRequestDto) {
        // 유효성 검사를 통과한 경우
        return ResponseEntity.ok("사용자 등록 성공");
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        // 유효성 검사 실패 시 예외 처리
        String errorMessage = ex.getBindingResult()
                .getAllErrors()
                .stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.joining(", "));

        return ResponseEntity.badRequest().body("유효성 검사 실패: " + errorMessage);
    }
}

 

→ @Valid: UserRequestDto 객체를 자동으로 검증하도록 설정했다.

→ @ExceptionHandler: MethodArgumentNotValidException을 처리하기 위한 메서드를 정의하고, 유효성 검사에 실패한 경우 적절한 에러 메시지를 반환하도록 한다.

 

▶ Validation 사용 시 주의사항

→ 서버 측 유효성 검사:

클라이언트 측에서 유효성 검사를 수행하더라도, 반드시 서버 측에서도 유효성 검사를 수행해야 한다. 클라이언트 측 검사는 사용자 경험을 향상시키기 위한 것이지만, 보안상으로는 서버 측 검사가 필수적이다.

→ 적절한 에러 처리:

유효성 검사 실패 시 사용자에게 명확한 에러 메시지를 제공해야 한다. 이를 통해 사용자가 잘못된 입력을 수정할 수 있도록 해야 한다.

→ 커스텀 Validator:

기본 제공되는 어노테이션으로 충분하지 않은 경우, 커스텀 Validator를 구현하여 복잡한 비즈니스 로직 검증을 처리할 수 있다.

→ 정확한 메시지 관리:

각 유효성 검증 어노테이션은 message 속성을 사용하여 커스텀 오류 메시지를 정의할 수 있다. 명확한 오류 메시지를 통해 사용자 경험을 개선할 수 있다.

 

▶정리

Validation은 웹 애플리케이션의 안전성을 강화하고, 사용자가 의도한 데이터를 서버에 전달할 수 있도록 도와주는 중요한 역할을 한다. 하지만 다양한 유효성 검사를 활용하고, 상황에 맞게 작성하는 과정을 쉽게 생각 할 순 없었다. 그냥 남들 쓰니까 이거 쓰면 되나용? 하고 썼으니까.. 이젠 알았으니까 저런질문은 하지도 말아야겠다... 

'개발Article' 카테고리의 다른 글

[WIL]20240811 Redis  (0) 2024.08.11
[TIL]20240810 단위테스트란?  (0) 2024.08.10
[TIL]20240808 SSE와 웹소켓 비교  (0) 2024.08.08
[TIL]20240807 연관관계  (0) 2024.08.07
[TIL]20240806 RestTemplate  (0) 2024.08.06