카테고리 없음

애플리케이션 계층별 입력값 검증 책임

개발자 김마늘 2025. 5. 18. 23:14

애플리케이션에서 입력값 검증을 어디서 어떻게 처리해야할지 정리한 글입니다.

 

컨트롤러

컨트롤러는 사용자로부터 받은 입력값의 형식적인 유효성을 검사하는 역할을 담당합니다.

  • 이메일 형식이 올바른지 (@Email)
  • 필수 값이 들어왔는지 (@NotBlank, @NotNull)
  • 문자열 길이가 제한을 초과하지 않았는지 (@Size)

등은 대부분 컨트롤러에서 처리합니다.
Spring에서는 @Valid를 통해 쉽게 처리할 수 있습니다.

서비스

서비스 계층에서는 비즈니스 로직 관점의 유효성 검을 수행해야 합니다.

  • 이메일은 형식상 맞더라도 이미 가입된 이메일인지 체크
  • 비공개 채널을 수정하려 할 때 권한이 있는 사용자만 가능하게
  • 포인트가 부족한데 결제를 시도한 경우 막기

이처럼 입력값이 실제로 의미 있는지 판단하는 작업은 서비스 계층의 책임입니다.

 

엔티티 (도메인)

엔티티나 도메인 객체 자체가 불변 조건이나 상태 전이 제약을 가지고 있다면, 그 유효성은 도메인 레벨에서 처리해야 합니다.

  • 사용자의 이메일은 null이 될 수 없다
  • 계좌의 잔액은 음수가 될 수 없다

이런 조건은 지금은 그렇다가 아니라 항상 그래야 하며, 어떤 메서드를 호출해도 절대 위반되면 안됩니다. 이런 검증은 서비스보다 도메인 레벨에서 수행해야 객체가 스스로 자신의 유효성을 책임질 수 있습니다.