적합한 유효성 검사?

2024. 6. 2. 09:00TIL

✔오늘 배운 중요한 🔑 point

  • 간단한 데이터 검증이 필요한 경우에는 @어노테이션을 사용하는 것이 좋고, 복잡한 데이터 검증 로직이 필요한 경우에는 내부 함수 로직을 사용하는 것이 좋다.

🎯 오늘 배운 내용

 

우리가 평소 웹사이트를 이용할때 특정 조건에 맞는 형식을 사용해야할 때가 있다

네이버 회원가입

특정 형식에 맞지않는 입력값들을 입력했을경우에는 회원가입이 되지 않는식으로 되어있는 형태는 우리에게 매우 익숙하다.

 

이러한 규칙들은 API를 처음 설계할때 정하는 POLICY이며 사용자에 따라서 POLICY정책을 다르게 설정 할 수 있다.

 

이러한 데이터를 검증하는 방식으로는 @어노테이션을 사용하는 방법과 함수 내부 로직으로 검증하는 방법이 존재한다

 

@Valid

 

@Valid 어노테이션을 사용하는 방법은 매우 간단하다.

import javax.validation.Valid
import javax.validation.constraints.NotBlank
import javax.validation.constraints.Size

data class UserRequest(
    @field:Size(min = 4, max = 20, message = "유저 이름은 최소4글자에서 최대20글자입니다")
    val username: String,

    @field:Size(min = 8, message = "비밀번호는 최소 8글자 이상이어야만 합니다")
    val password: String
)

@RestController
class UserController {
    @PostMapping("/users")
    fun createUser(@Valid @RequestBody request: UserRequest): ResponseEntity<String> {
        return ResponseEntity.ok("User created")
    }
}

 

@field에는 

@field:Email  -이메일 형식인지 검증

@field:Pattern - 문자열의 형식 제한 (특수문자가 포함되면 안된다, 숫자가 반드시 포함되어야 한다 등)

@field:NotNull - null이거나 공백인지 검증

@field:Size - 크기나 길이 검증

등 매우 간편하게 데이터검증을 사용할 수 있는 장점이 있고 복잡한 로직이 아닌 경우에는 매우 손쉽게 해당 기능들을 사용할 수 있다.

 

하지만 단점으로는 javax.validation 라이브러리에 매우 의존하게 되며

복잡한 로직의 경우에는 검증이 불가능할수도 있다.

 

 

함수 내부 로직

data class UserRequest(val username: String, val password: String)

@RestController
class UserController {
    @PostMapping("/users")
    fun createUser(@RequestBody request: UserRequest): ResponseEntity<String> {
        validateUserRequest(request)
 
        return ResponseEntity.ok("User created")
    }

    private fun validateUserRequest(request: UserRequest) {
        if (request.username.length < 4 || request.username.length > 20) {
            throw IllegalArgumentException("유저 이름은 최소4글자에서 최대20글자입니다")
        }

        if (request.password.length < 8) {
            throw IllegalArgumentException("비밀번호는 최소 8글자 이상이어야만 합니다")
        }
    }
}

 

복잡한 로직의 경우에도 직접 커스텀해서 데이터 검증을 하기때문에 문제없이 사용할 수 있다.

검증 로직을 직접 설계하기 때문에 정확히 어떤식으로 데이터 검증이 이루어지는지를 명확하게 확인할 수 있는 장점이 있다.

 

단점으로는  @어노테이션을 사용하는것보다 코드 가독성이 매우 떨어지며  직접 내부 로직을 작성해야하기 때문에 시간이 더 걸린다는 점이 있다.

 

🤔 어떻게 활용할까?

간단한 웹사이트의 로그인 방식을 구현할때는 어노테이션을 사용해서 데이터 검증을 하는것이 더 효율적일 수 있다.

📓 오늘의 한줄

"A man without a goal is like a ship without a rudder."

- Thomas Carlyle -