728x90
Custom Exception의 필요성
Effective Java에서는 다음과 같은 이유로 Standard Exception의 사용을 권장한다.
- 우리의 API가 다른 사람이 익히고 사용하기 쉬워진다.
- 예외를 재사용하므로써 예외 클래스 수가 줄어들고 그에 따라 메모리의 사용량, 클래스를 적재하는 시간도 적게 든다.
하지만 다음과 같은 이유라면 표준 예외를 확장해도 좋다고 한다.
- 표준 예외가 이름뿐만 아니라 예외가 던져지는 맥락도 부합하지 않다면 표준 예외를 확장하라.
- 더 많은 정보를 제공하기 원한다면 표준 예외를 확장해도 좋다.
우리 코드중 예외가 발생할만한 포인트
인프라 이슈 -> DB/네트워크 등 오류
DB 이슈
https://way-be-developer.tistory.com/249
JPA Exception 종류
트랜젝션 롤백을 표시하는 예외 : 매우 심각한 예외로, 트랜잭션 복구해서는 안된다.

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

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

JAVA기본 예외도 변환

네트워크 오류(API 호출)
REST 클라이언트
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 오류를 사용할 것인가, 특정 오류 코드를 사용할 것인가)
- JAVA 기본 오류 + Message (IllegalArgumentException, IllegalStatementException)
public class Service(
){
public void test(){
//비지니스 코드
int a = 1
int b = 10
if ( a + b != 11){
throw new IllegalArgumentException("도메인 오류 상세 메시지");
}
}
}
- 예외는 JAVA 기본 예외만 사용하며, 예외 메시지를 통한 예외 처리를 한다.
- 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("도메인 오류 상세 메시지");
}
}
}
- 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 코드 영역을 가지고 있으며, 특정 에러 코드는 협의가 필요
- 모두 다른 서비스를 개발하고 있다면 중복되는 에러 코드가 발생할 수 있다.
인증 오류
- Spring Security 오류
- https://colabear754.tistory.com/182
- 실제 Security 적용시 확인(실제 시큐리티를 사용하지 않을수도 있기에 PASS)
728x90