
스쳐지나가듯 궁금한 의문점을 곁들인 기본 개념
서비스 로직에서 다음과 같이 IllegalArgumentException을 사용해
예외를 던졌습니다: (오류가 오류지 뭐 라고 생각한 나)
if (userRepository.existsByUsername(dto.getUsername())) {
throw new IllegalArgumentException("중복된 아이디입니다.");
}
하지만 이 방식은 여러 문제를 만듭니다:
의미가 불명확하다.
IllegalArgumentException은 너무 일반적인 예외이기 때문에, "중복된
아이디가 존재함!"이라는 도메인 의미가 제대로 전달되지 않게 됩니다.
구분하기 어렵다.
IllegalArgumentException이 다양한 곳에서 발생할 경우, 어떤 원인인지
컨트롤러 혹은 프론트에서 구분하기 힘듭니다.
포멧 일관되지 않다.
성공 응답은 Response.ok와같은 공통 response로 보내고, 실패는 Spring 기본 에러
JSON으로 나가는 등 포맷이 달라집니다.
모든 API가 동일한 JSON 구조로 응답해야 프론트엔드가 로직을 간단하게 유지할 수 있습니다.
도메인 단위로 명확한 예외 타입을 정의해두면 원인 식별이 쉬워집니다.
예외를 enum/ErrorCode로 관리하면 에러 종류를 한 곳에서 관리할 수 있습니다.
ErrorCode:
public enum ErrorCode {
DUPLICATE_USERNAME(HttpStatus.CONFLICT, "DUPLICATE_USERNAME", "이미 존재하는 아이디입니다."),
INVALID_REQUEST(HttpStatus.BAD_REQUEST, "INVALID_REQUEST", "잘못된 요청입니다."),
INTERNAL_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "INTERNAL_ERROR", "서버 오류");
}
각 Enum타입의 정보에는:
🧑💻 code 는 HttpStatus(400,409등) 큰 범주 안에서 상세 내용이라고 생각.
Ex) 409 하위에는 DUPLICATE_ID, DUPLICATE_NICKNAME, PASSWORD_UNCHANGED등
CustomException:
public class CustomException extends RuntimeException {
private final ErrorCode errorCode;
public CustomException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
}
서비스에서 아래와 같이 예외를 던집니다
if (userRepository.existsByUsername(dto.getUsername())) {
throw new CustomException(ErrorCode.DUPLICATE_USERNAME);
}
@RestControllerAdvice로 전역 예외 처리
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<CommonResponse> handleCustomException(CustomException ex) {
ErrorCode error = ex.getErrorCode();
return ResponseEntity
.status(error.getStatus())
.body(CommonResponse.error(error.getMessage(), error.getCode()));
}
}
이제 오류가 발생하면 항상 같은 JSON 포맷을 반환합니다.
성공:
{
"success": true,
"message": "회원가입 완료",
"code": null,
"data": {...}
}
실패:
{
"success": false,
"message": "이미 존재하는 아이디입니다.",
"code": "DUPLICATE_USERNAME",
"data": null
}
성공/실패 모두 같은 JSON 구조 → 프론트 개발이 쉬워짐
DUPLICATE_USERNAME, INVALID_REQUEST 등 도메인 기준 오류 파악 가능
ErrorCode에 정의만 추가하면 API 전체에서 바로 사용 가능
서버는 HTTP status로, 클라이언트는 code로 오류 판단 가능
어떤 오류가 얼마나 발생했는지 ErrorCode 기반으로 추적 가능
답을 아시는 분 알려주십쇼🙇♂️
자네..!! 스프링부트를 참 잘하는구만