Spring Boot Validation 처리

최민길(Gale)·2023년 1월 18일
1

Spring Boot 적용기

목록 보기
15/46

안녕하세요 오늘은 Spring Boot에서 Validation 처리하는 내용에 대해 포스팅하도록 하겠습니다.

우선 Validation이란 올바르지 않는 데이터를 검증하여 보안을 강화하기 위하여 사용되는 데이터 검증입니다. 이를 통해 잘못된 요청으로 인한 보안이 강화될 뿐만 아니라 비즈니스 로직 등의 예외 처리를 통하여 안정적인 서비스 운영이 가능합니다.

저는 이전에 개발했던 로그인 API에서 Validation 검증법에 대해 간단히 소개해드리겠습니다.

    ...
    public ResponseEntity getLoginTokenController(
            @Validated @RequestBody LoginRequestDTO loginRequestDTO,
            BindingResult bindingResult
    ){
        // 입력 객체가 유효하지 않았을 때 처리
        // 상세 처리는 DTO 내부에서 설정
        if(bindingResult.hasErrors()){
            return ResponseEntity.ok(new ResponseDTO(
                    {예외 처리 내용 출력}
            ));
        }
        ...

우선 요청받은 파라미터를 검증하는 방법으로 @Validated 어노테이션이 있습니다. 위의 코드에서처럼 파라미터 앞에 추가하며 뒤에 BindingResult bindingResult 객체를 추가해줍니다. 이 BindingResult가 요청받은 파라미터에서 예외 발생 시 hasErrors() 메소드를 true로 리턴하여 예외를 처리합니다.

@Getter
@Setter
public class LoginRequestDTO {
    @Email
    public String email;
    ...

예외 발생 여부는 DTO 내부에서 직접 설정합니다. 대표적으로 @Email 어노테이션이 붙은 변수의 경우 요청 받은 데이터가 이메일 형식이 아닐 경우 hasErrors() = true로 반환합니다.

        ...
        // 존재하지 않은 이메일인 경우
        if(!validationService.checkExistEmail(loginRequestDTO)){
            return ResponseEntity.ok(new ResponseDTO(
                    {예외 처리 내용 출력}
            ));
        }
        ...

두 번째로 DB에서 요청을 Validation하는 방법이 있습니다. Repository와 Service를 만든 후 관련 처리 쿼리를 만들어 로직을 만든 후 실행하여 결과값을 반환하는 방법입니다. 비즈니스 로직 처리 시 필수적이지만 너무 자주 콜 될 경우 DB에 많은 부하를 주어 성능이 저하될 수 있으니 효과적으로 사용하는 것을 추천드립니다.

        ...
        Authentication authentication;
        try{
            // 저장된 정보와 입력받은 정보와 비교
            authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        catch (Exception e){
            // 비밀번호 틀렸을 경우 null 반환 --> 컨트롤러에서 처리
            return null;
        }
        ...
...
return ResponseEntity.ok(Objects.requireNonNullElseGet(loginResponseDTO, () ->
                    // 이메일의 비밀번호가 틀렸을 경우
                    {예외 처리 내용 출력}
                )
        );

마지막으로 로그인 시 이메일과 비밀번호를 검증할 때 사용하는 방법입니다. 여러 방법이 있겠지만 저는 null 포인터를 체크하는 방식을 통해 처리를 진행했습니다. Service에서 검증을 진행 후 비밀번호가 틀렸을 경우 null을 반환하여 Controller에서 null값을 리턴받았을 경우 예외 처리 내용을 출력하는 방법입니다.

이상으로 대표적인 Validation 방식에 대해 알아보았습니다. 그럼 다음 포스팅에서 뵙겠습니다!

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글