Custom Exception

SeokHwan An·2023년 3월 27일
0

java

목록 보기
6/10

지금까지 미션을 진행하면서 에러의 메세지 처리를 발생하는 곳에서 처리하는게 하였습니다. 그 동안에는 자연스럽다고 생각했었는데 문득 domain에서 에러 메세지를 가지고 있는 것이 좋은 방법일까?라는 의문을 가지게 되었고 이 의문점을 해결하는 과정에서 custom exception을 접했습니다.

custom exception이란

custom excption이란 개발자가 비즈니스 로직에서 발생하는 예외를 보다 구체적으로 알려주기 위해서 생성한 클래스입니다. 개발을 하다보면IllegalArgumentException,UnsupportedOperationException보다 상황에 맞는 용어로 예외를 처리하고 싶어지고 보다 상세한 정보를 가진 예외를 처리하고 싶을 때가 있습니다. 이와 같은 상황에서 custom exception을 활용해 보는 것을 추천해주고 싶습니다.

custom exception을 만드는 방법은 다음과 같습니다.

public class CustomException extends Exception {
	public CustomException(String message) {
		super(message);
	}
}

위의 코드를 보면 알 수 있 듯이 custom exception은 Exception 혹은 자신이 원하는 Excpetion 타입을 상속을 받아서 이용할 수 있습니다.

사실 여기까지만 보면 custom exception을 이용했을 때 단순하게 네이밍을 명확하게 해준다라는 것 말고는 크게 와닿는 것이 없다고 생각할 수 있습니다. 하지만 custom exception을 사용하는 이유는 다양하게 있습니다.

custom exception을 사용하는 이유

  1. 도메인에서 예외처리 메세지를 모르게 할 수 있다.

custom exception을 이용하면 도메인에서는 예외처리 메세지를 모르게 할 수 있습니다.

public class InvalidMoveException extends RuntimeException {
		
	public InvalidLineExcpetion() {
		super("잘못된 움직임입니다.");
	}
}

위의 코드가 좋은 방법이라고 생각될 수 있지만 에러메세지의 수정이 필요한 경우에는 각 클래스에 접근하여 메세지를 수정해야합니다. 이 역시 리팩토링을 하는데 많은 비용이 들 수 있다고 말할 수 있습니다. 그렇기에 에러 메세지를 하나의 enum으로 묶어서 관리하면 보다 편리하게 관리할 수 있습니다.

public class InvalidMoveException extends RuntimeException {
		
	private ExceptionMessage message = INVALID_MOVE;

	public InvalidMoveException() {
		super(message.get(message));
	}
}

public enum ExceptionMessage {
		
	INVALID_MOVE("잘못된 움직임 입니다."),
	INVALID_POSITION("잘못된 위치 입니다.");
		
	final String message;

	Exception(String message) {
		 this.message = message;
	}
		
	public String getMessage() {
		return this.message;
	}		
}
  1. 메세지 정보를 다양하게 줄 수 있습니다.

IllegalArgumentException 와 같이 자바에서 제공해주는 Exception에서는 메세지(”잘못된 움직임 입니다”)를 통해서만 에러정보를 줄 수 있습니다. 하지만 custom exception을 이용하면 보다 다양한 정보를 주어서 에러 정보를 줄 수 있습니다.

public class InvalidMoveException extends RuntimeException {
		
	public InvalidMoveException(Position source, Position target) {
		super(source.makeToString + " -> " + target.makeToString + "잘못된 움직임 입니다" );
	}
}

위의 코드와 같이 시작위치(source)와 도착위치(target)의 정보를 인자로 받아 예외 메세지로 위치 정보를 나타내주어 보다 예외처리를 보고 어떤 상황이 문제인지 쉽게 파악할 수 있게 도움을 줄 수 있습니다.

custom exception의 불편한 점

하지만 custom exception을 이용하는 방법이 항상 좋은 방법이라고 할 수는 없습니다. 그 이유는 다음과 같습니다.

  1. 잦은 custom exception 클래스 생성

custom exception을 만들 때마다 클래스를 생성해주어야 하며 이를 각각 관리해주어야 한다는 것입니다. 크지 않은 규모에서는 적은 예외처리만 발생해서 생성되는 클래스가 적을 수 있지만 규모가 커지는 개발에서는 예외처리하는 상황이 많기에 사소한 예외까지 custom 하게 된다면 수 많은 클래스를 관리해야하는 상황이 올 수 있습니다.

  1. 가독성이 떨어질 수 있다.

IllegalArgumentExceptionNullPointerException 과 같이 자바에서 제공해주는 표준 예외 클래스는 이미 개발자들이 많이 접한 클래스들이어서 쉽게 이해하고 넘길 수 있지만 custom exception의 경우 네이밍이 올바르게 되지 않는다면 오히려 무슨 예외처리인지 쉽게 파악하지 못하는 일이 발생할 수 있습니다.

결론

custom Exception의 경우 도메인과 exception의 관계를 끊는데 도움을 줄 수 있지만 그로인해서 발생하는 비용이 많다는 것을 알 수 있습니다. 그래서 custom Exception을 이용할 상황이라면 custom Exception을 활용하는 것도 좋지만 표준 예외를 통해서도 잘 설명해줄 수 있다면 표준 예외를 이용해서 처리하는 것이 비용적인 측면에서 좋은 방법이라고 생각합니다.

0개의 댓글