티스토리 뷰
 [개발] - Spring/Security
                        
                    JWT 예제 구현 (8) 예외처리 로직 추가, Exception(핸들러) 추가, 버전 2.53 업그레이드 등
완벽한 장면 2023. 12. 16. 11:35
MethodArgumentNotValidExceptionHandler
package inflearn.freejwt.handler;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.util.ArrayList;
import java.util.List;
// 이 어노테이션은 클래스가 예외 처리기로 사용될 때 우선순위를 지정.
// Ordered.HIGHEST_PRECEDENCE는 가장 높은 우선순위를 나타내며,
// 이 클래스가 다른 예외 처리기보다 먼저 실행됨을 의미.
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class MethodArgumentNotValidExceptionHandler {
    // 이 어노테이션은 해당 메서드가 호출될 때 HTTP 응답 상태 코드를 BAD_REQUEST로 설정하도록 지정.
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    // 이 어노테이션은 해당 메서드가 HTTP 응답 본문에 데이터를 직렬화하여 반환함을 나타낸다.
    @ResponseBody
    // 이 어노테이션은 해당 메서드가 MethodArgumentNotValidException 예외를 처리한다는 것을 나타낸다.
    // 이 예외는 주로 Spring MVC 컨트롤러에서 요청 매개변수의 유효성 검사 실패 시 발생.
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Error methodArgumentNotValidException(MethodArgumentNotValidException ex) {
        BindingResult result = ex.getBindingResult();
        List<org.springframework.validation.FieldError> fieldErrors = result.getFieldErrors();
        return processFieldErrors(fieldErrors);
    }
    // 필드 오류 목록을 처리하고 오류 응답 객체를 생성하는 메서드.
    private Error processFieldErrors(List<org.springframework.validation.FieldError> fieldErrors) {
        // Error error = new Error(HttpStatus.BAD_REQUEST.value(), "validation error");
        Error error = new Error(HttpStatus.BAD_REQUEST.value(), "@Valid error");
        for (org.springframework.validation.FieldError fieldError : fieldErrors) {
            error.addFieldError(fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());
        }
        return error;
    }
    // 오류 응답을 나타내는 내부 클래스.
    static class Error {
        private final int status;
        private final String message;
        private List<FieldError> fieldErrors = new ArrayList<>();
        // 오류 객체를 생성할 때 HTTP 응답 상태 코드와 메시지를 설정.
        Error(int status, String message) {
            this.status = status;
            this.message = message;
        }
        public int getStatus() {
            return status;
        }
        public String getMessage() {
            return message;
        }
        // 필드 오류를 추가하는 메서드.
        public void addFieldError(String objectName, String path, String message) {
            FieldError error = new FieldError(objectName, path, message);
            fieldErrors.add(error);
        }
        public List<FieldError> getFieldErrors() {
            return fieldErrors;
        }
    }
}
build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.5.3' // qusrud
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
}
group = 'inflearn'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
	// 아래 전부 수정한 내용.
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'
}
tasks.named('test') {
    useJUnitPlatform()
}
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip // 업그레이드
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
728x90
    
    
  반응형
    
    
    
  '[개발] - Spring > Security' 카테고리의 다른 글
| JWT 예제 구현 (10) Response 시 DTO를 통해서만 응답하도록 변경 (0) | 2023.12.19 | 
|---|---|
| JWT 예제 구현 (9) Exception 세분화, 리다이렉트 수정, Response 로직 변경, 리다이렉트 테스트 추가 (1) | 2023.12.18 | 
| [중간점검] JWT 2.41 버전 구현 로직 완성 코드 (0) | 2023.12.15 | 
| JWT 예제 구현 (7) 회원가입, 권한 검증 로직 (0) | 2023.12.13 | 
| JWT 예제 구현 (6) Dto, Repository, UserDetailsService 구현 인터페이스 (0) | 2023.12.12 | 
 
                            Comments