실무 처럼! JWT 로그인 1(기본 설정 및 예외처리)

요한·2025년 5월 19일

실무처럼!

목록 보기
2/5

실무 처럼 코드를 작성하고싶다 그럴수록 고민도 더 많아지고 생각할께 많아진다...

컴퓨터만 보면서 생각하는 글쓴이 모습....

Gradle

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

jwt를 사용하기 위해 라이브러리 추가해야한다!

.gitignore

src/main/resources/application.properties

application.properties에 중요한 정보 jwt시크릿 키 db정보등 외부로 보여지면 안된다 그래서 꼭 외부로 보여지면 안되는 정보는 이그노어 처리를 하고 깃허브에 올리자!

예외처리

ErrorCode

@Getter
public enum ErrorCode {
    DUPLICATE_USERID(409,"U001","ID가 중복입니다."),
    UNAUTHORIZED(401, "A001", "인증되지 않은 사용자입니다."),
    INVALID_SIGNATURE(401, "A003", "JWT 서명이 유효하지 않습니다."),
    EXPIRED_TOKEN(401, "A004", "JWT 토큰이 만료되었습니다."),
    MALFORMED_TOKEN(400, "A005", "잘못된 JWT 형식입니다."),
    INVALID_TOKEN(401, "A006", "유효하지 않은 JWT 토큰입니다."),
    ACCESS_DENIED(403, "A003", "접근 권한이 없습니다."),
    USER_NOT_FOUND(404, "U002", "존재하지 않는 사용자입니다.");

    private final int status;
    private final String errorCode;
    private final String errorMsg;


    ErrorCode(int status, String errorCode, String errorMsg) {
        this.status = status;
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

}

상황마다 오류를 작성해서 오류가 나도 어디부분인지 잘 알수 있도록 많이 작성했는데 수정을 더 수정하면 좋을거같다.

CustomException

public class CustomException extends RuntimeException{
    private final ErrorCode errorCode;

    public CustomException(ErrorCode errorCode) {
        super(errorCode.getErrorMsg());
        this.errorCode = errorCode;
    }
    public ErrorCode getErrorCode() {
        return errorCode;
    }
}

ErrorResponse

package com.jobdam.jwt_login.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public class ErrorResponse {
    private int status;
    private String message;
    private String errorCode;
}

ExceptionController

@RestControllerAdvice
public class ExceptionController {
    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleException(CustomException ex){
        ErrorCode errorCode = ex.getErrorCode();
        ErrorResponse errorResponse = new ErrorResponse(errorCode.getStatus(),errorCode.getErrorMsg(),errorCode.getErrorCode());
        return ResponseEntity.status(errorCode.getStatus()).body(errorResponse);
    }
}

이렇게 @RestControllerAdvice 를 사용하면 @RestController에 나는 부분은 정상적인 부분만 처리하면되고 오류가 나는부분을 @RestControllerAdvice로 처리해서 관점을 명확히 분리할수있다.

Error발생시

응답 예시)

{
	status = 409,
	errorCode = U001,
	errorMsg = ID가 중복입니다. 
}

이런식으로 일관적으로 관리할수 있는 장점있다!

지금은 로그인 기능하나라서 ErrorCode가 한정적인데 서비스 별로 분리 하면 조금더 복잡해 질거같다.. ㅎㅎ

긴글 읽어주셔서 감사합니다! :)

profile
코드 깍는 개발자 kangyohan.dev.0421@gmail.com

0개의 댓글