개발천재

[Spring Boot] Validation, 검증하기 본문

개발 준비/Spring Boot

[Spring Boot] Validation, 검증하기

세리블리 2025. 2. 18. 23:47
반응형

클라이언트 단에서도 검증을 하고 서버단에서도 검증이 필요한 이유

클라이언트 단과 서버 단에서 각각 검증을 하는 이유는 보안과 사용자 경험을 동시에 고려하기 위함이다. 

클라이언트 단 검증은 사용자 경험을 개선하고, 서버의 부담을 줄이기 위한 용도이며, 서버 단 검증은 보안, 데이터 무결성, 권한 검증 등 중요한 요소들을 처리하기 위한 용도이다. 따라서 클라이언트 단에서 간단한 유효성 검사를 먼저 하고, 서버 단에서 모든 데이터를 최종적으로 검증하는 방식으로 이중 검증을 사용하는 것이 가장 안전하고 효율적이다.

 

 

클라이언트 단에서 검증이 필요한 이유

즉시 피드백 제공

사용자가 잘못된 데이터를 입력할 경우 즉시 피드백을 받을 수 있다. 예를 들어, 이메일 형식이 잘못되었거나 필수 입력란이 비어 있을 경우, 서버에 요청을 보내기 전에 바로 알려줄 수 있다.


서버 부담 감소

클라이언트에서 기본적인 검증을 미리 처리함으로써, 서버로 보내는 잘못된 데이터의 양을 줄일 수 있다. 이로 인해 서버의 리소스를 절약하고, 불필요한 네트워크 트래픽을 방지할 수 있다.


사용자 경험 향상

실시간으로 데이터를 확인하면서 오류를 수정할 수 있기 때문에, 사용자에게 더 나은 경험을 제공한다. 예를 들어, 비밀번호가 너무 짧으면 즉시 경고 메시지를 보여줄 수 있다.

 

 


서버 단에서 검증이 필요한 이유

서버 단에서의 검증은 보안과 데이터 일관성 유지를 위해 반드시 필요하다. 클라이언트 단 검증은 사용자가 쉽게 우회할 수 있기 때문에 서버에서 다시 한 번 확실한 검증이 필요하다.

보안

클라이언트에서 검증을 우회하거나, 자바스크립트를 비활성화시킨 뒤 서버에 잘못된 데이터를 보내는 경우가 있다. 클라이언트 단 검증은 사용자가 임의로 변경할 수 있기 때문에, 서버에서 모든 데이터를 다시 한 번 검증하는 것이 필수적이다. 예를 들어, 사용자가 악의적으로 서버에 SQL 인젝션 공격을 시도할 수 있으므로 이를 막기 위한 서버 측 검증이 필요하다.


일관성 유지

클라이언트에서의 검증만으로는 데이터의 일관성을 보장할 수 없다. 서버에서 모든 데이터를 정확히 검증해야만 애플리케이션의 데이터 상태가 깨지지 않는다. 예를 들어, 데이터베이스에 저장하기 전에 유효성 검사를 통해 잘못된 데이터가 저장되는 것을 방지할 수 있다.


권한 확인

클라이언트에서 검증하는 것은 주로 데이터의 형식이나 값의 유효성만 다루지만, 서버에서는 비즈니스 로직과 관련된 더 중요한 검증을 처리할 수 있다. 예를 들어, 사용자가 어떤 기능에 대해 적절한 권한을 가지고 있는지 확인하는 로직은 서버에서 처리해야 한다.

 

 


 

 

 

Spring에서 Validation 이용하여 검증하기

의존성 추가하기
Spring에서 Validation을 사용하려면 먼저 의존성을 추가해야 한다. Spring Boot에서는 spring-boot-starter-validation 의존성을 추가하여 쉽게 검증 기능을 사용할 수 있다.

// build.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'

 

 

DTO에 어노테이션 적용하기
검증할 DTO 클래스에서 JSR-303/JSR-380 어노테이션을 사용하여 필드에 검증 규칙을 선언한다. 예를 들어, @NotNull, @Size, @Email 등을 사용하여 각 필드가 특정 규칙을 만족하는지 검사할 수 있다.

public class MemberDto {
    @NotNull(message = "이름은 필수입니다.")
    @Size(min = 2, max = 50, message = "이름은 2자 이상 50자 이하로 입력해주세요.")
    private String name;

    @Email(message = "유효한 이메일을 입력해주세요.")
    private String email;

    // Getters and Setters
}

 

 

검증 트리거
검증을 트리거하려면, 컨트롤러에서 @Valid나 @Validated 애너테이션을 사용하여 요청을 처리하는 객체에 대해 검증을 실행한다. 이때 BindingResult를 사용하여 검증 결과를 처리할 수 있다.

@PostMapping("/member")
public String registerMember(
	@Valid @ModelAttribute MemberDto memberDto,
    BindingResult bindingResult
	) {
    if (bindingResult.hasErrors()) {
        return "memberForm";  // 오류가 있으면 다시 폼을 보여줌
    }
    // 회원 등록 처리
    return "redirect:/success";
}

 

 

view에서 에러 메세지 보이기

Thymeleaf를 사용할 때 검증 에러 메시지를 화면에 보여주려면 th:errors를 사용하면 된다.

<form th:action="@{/member/insert}" method="post" th:object="${memberDto}">
    <div>
      <label for="name">이름</label>
      <input type="text" name="name" id="name" th:filed="*{name}">
      <span th:errors="*{name}"></span>
    </div>
    <div>
      <label for="age">나이</label>
      <input type="text" name="age" id="age" th:filed="*{age}">
      <span th:errors="*{age}"></span>
    </div>
    <div>
      <label for="address">주소</label>
      <input type="text" name="address" id="address">
    </div>
    <input type="submit" value="등록" id="btnSubmit" th:filed="*{address}">
    <span th:errors="*{address}"></span>
  </form>

 

 


 

 

Spring에서 제공하는 검증 방법

Spring은 검증을 애너테이션 기반으로 처리하며, 여러 유효성 검사를 지원하는 애너테이션을 제공한다. 주로 사용되는 검증 애너테이션은 다음과 같다.

  • @NotNull: 값이 null이 아니어야 한다.
  • @NotEmpty: 값이 비어 있지 않아야 한다.
  • @NotBlank: 문자열이 공백이 아니어야 한다.
  • @Size(min, max): 문자열이나 컬렉션의 크기가 지정된 범위 내에 있어야 한다.
  • @Email: 유효한 이메일 형식이어야 한다.
  • @Pattern: 정규식 패턴에 맞는 값이어야 한다.
  • @Min / @Max: 숫자가 최소값이나 최대값 내에 있어야 한다.
package com.my.basicCRUD.dto;

import com.my.basicCRUD.entity.Member;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberDto {
    private Long id;
    @Size(min = 2, message = "이릉은 2자 이상으로 입력해야합니다.")
    private String name;
    @Range(min=0, max=120, message = "나이는 0세부터 120세까지 입니다.")
    private int age;
    @NotBlank(message = "주소는 꼭 입력해야합니다.")
    private String address;
}


이렇게 Spring Validation을 통해 DTO 객체에서 검증 규칙을 정의하고, 컨트롤러에서 검증을 트리거하여 유효하지 않은 데이터가 처리되지 않도록 할 수 있다.

반응형