스터디

Custom Exception / Standard Exception

webmaster 2024. 12. 8. 15:14
728x90

Custom Exception의 필요성

Effective Java에서는 다음과 같은 이유로 Standard Exception의 사용을 권장한다.

  • 우리의 API가 다른 사람이 익히고 사용하기 쉬워진다.
  • 예외를 재사용하므로써 예외 클래스 수가 줄어들고 그에 따라 메모리의 사용량, 클래스를 적재하는 시간도 적게 든다.

하지만 다음과 같은 이유라면 표준 예외를 확장해도 좋다고 한다.

  • 표준 예외가 이름뿐만 아니라 예외가 던져지는 맥락도 부합하지 않다면 표준 예외를 확장하라.
  • 더 많은 정보를 제공하기 원한다면 표준 예외를 확장해도 좋다.

우리 코드중 예외가 발생할만한 포인트

인프라 이슈 -> DB/네트워크 등 오류

DB 이슈

https://way-be-developer.tistory.com/249

JPA Exception 종류

트랜젝션 롤백을 표시하는 예외 : 매우 심각한 예외로, 트랜잭션 복구해서는 안된다.

트랜젝션 롤백을 표시하는 예외

트랜잭션 롤백을 표시하지 않는 예외 : 트랜잭션 커밋/롤백할지 선택 가능

트랜잭션 롤백을 표시하지 않는 예외

 

스프링 프레임워크는 데이터 접근 계층에 대한 예외를 추상화해서 아래와 같이 제공

예외 추상화

JAVA기본 예외도 변환

변환된 예외

네트워크 오류(API 호출)

REST 클라이언트

https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-http-interface-exceptions

4XX, 5XX 오류 : RestClientException 오류 발생

  • 커스텀 정의를 하기 위해서는 아래와 같은 처리 필요
RestClient restClient = RestClient.builder()
    .defaultStatusHandler(HttpStatusCode::isError, (request, response) -> {
        // 사용자 정의 오류 처리 로직
        System.out.println("사용자 정의 오류 처리기: " + response.statusCode());
        // 요청과 응답을 여기에서 처리하여 맞춤형 작업을 수행할 수 있습니다.
    })
    .build();

RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

Web 클라이언트

4XX, 5XX 오류 : WebClientResponseException 오류 발생

  • 커스텀 정의를 하기 위해서는 아래와 같은 처리 필요
WebClient webClient = WebClient.builder()
		.defaultStatusHandler(HttpStatusCode::isError, resp -> ...)
		.build();

WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(adapter).build();

도메인 오류(도메인 별로 확인 가능한 Custom 오류를 발생시킬 것인가, 기본 JAVA 오류를 사용할 것인가, 특정 오류 코드를 사용할 것인가)

  1. JAVA 기본 오류 + Message (IllegalArgumentException, IllegalStatementException)
public class Service(

){
	
	public void test(){
		//비지니스 코드
		int a = 1
		int b = 10
		if ( a + b != 11){
			throw new IllegalArgumentException("도메인 오류 상세 메시지");
		}
		
	}
}
  • 예외는 JAVA 기본 예외만 사용하며, 예외 메시지를 통한 예외 처리를 한다.
  1. Runtime 예외를 상속한 커스텀 오류 생성(Code값은 없이 예외만)
public class DomainCustomException extends RuntimeException {    
    public DomainCustomException(String message) {
        super(message);
    }

    public DomainCustomException(String message, Throwable cause) {
        super(message, cause);
    }
}
public class Service(

){
	
	public void test(){
		//비지니스 코드
		int a = 1
		int b = 10
		if ( a + b != 11){
			throw new DomainCustomException("도메인 오류 상세 메시지");
		}
		
	}
}
  1. Runtime 예외를 상속한 커스텀 오류 생성(Code값 존재)
public class DomainCustomException extends RuntimeException {
    private int errorCode;
    
    public DomainCustomException(String message) {
        super(message);
    }

    public DomainCustomException(String message, Throwable cause) {
        super(message, cause);
    }

    public DomainCustomException(String message, int errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
}
public class Service(

){
	
	public void test(){
		//비지니스 코드
		int a = 1
		int b = 10
		if ( a + b != 11){
			throw new DomainCustomException("도메인 오류 상세 메시지", 1000);// 해당 오류가 여행 관련 오류라 1000번 반환
	
		}
		
	}
}
  • 도메인 별 특정 Error 코드 영역을 가지고 있으며, 특정 에러 코드는 협의가 필요
  • 모두 다른 서비스를 개발하고 있다면 중복되는 에러 코드가 발생할 수 있다.

인증 오류

728x90