본문 바로가기
Back-End/Spring

TIL 230726 : CustomException 사용하기

by 우인입니다 2023. 7. 26.

예외처리 또한 개발의 중요한 역량 중 하나로 느껴진다.

오늘은 커스텀예외처리를 만들고 관리하는 법을 배웠다.

 


CustomException 사용하기 (에러 메시지 관리 messages.properties)

커스텀예외처리를 알맞게 쓰는 게 어렵지, 쓰는 건 어렵진않다.

 

예외 클래스 만들기

원하는 이름으로 만들고 표준예외를 상속받는다.

 

 

생성자로 예외를 만들기 (던져주기)

원래는 IllegalArgumentException이 있던 곳에 만들어둔 예외를 생성하기만 하면된다.

위의 경우엔 메시지를 받는 생성자를 만들어 두었다.

 

 

 

CustomException '잘' 썼을 때의 장점

아마 이 부분이 더 중요할 것 같다.

잘 쓰는 것이 어렵다.

 

1. 일단은 표준예외를 우선한다.

 

이펙티브 자바 책에서는 이렇게 소개한다.

 - 표준예외를 사용함으로써 익숙해진 규약을 그대로 따르기 때문에 다른 사람이 익히고 사용하기 쉬워진다.
 - 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.

 

 

2. 예외클래스 이름만으로 파악이 되기 쉽다.

 

댓글을 작성하기 위해 게시글 정보와 유저 정보를 DB에서 가져오는 경우가 있다고 하자.

NoSuchElementException 예외가 던져졌다면 어떤 값(게시글 or 유저)이 찾을 수 없는 지 한번에 파악이 어렵다.

PostNotFoundException으로 네이밍 되어있다면 따로 에러메시지 없이도 직관적으로 파악할 수 있다.

 

 

3. 발생위치를 파악하기 쉽다.

 

표준예외가 얼마나 많은 곳에서 쓰일 것인지 쉽게 예상할 수 있다.

이럴 때 특정 조건에서의 예외를 만들어둔 경우 이를 파악하기 쉽다.

IllegalArgumentException만 보고서 어디서 파악한지 알아내기는 쉽지않다.

 

 

4. 예외 정보를 전달해줄 수 있다.

 

특정 정보를 같이 주면 이를 보고 수정하기에 용이하다. 단순히 message만 넣어주는 것이 아닌 해당 객체의 id, name등의 정보를 같이 받아서 상속받은 표준예외를 생성해줄 수 있다.

public class IllegalIndexException extends IndexOutOfBoundsException {
	private static final String message = "범위를 벗어났습니다.";

	public IllegalIndexException(List<?> target, int index) {
		super(message + " size: "  + target.size() + " index: " + index);
	}
}

 

 

아직 장점이 크게 와닿진 않고, 실제 표준예외들의 상속관계와 최상단의 Throwable 이 어떻게 생성하고 예외 cause를 받아서 return하고 출력하는 지 파고들지 못 해서 아직은 겉으로만 이해한 느낌이다. 좀 더 예외처리에 대한 부분도 염두하며 다른 공부들을 이어나가보기로 한다.

에러메시지 한번에 관리하기 (messages.properties)

 

위에 커스텀 예외처리한 부분이 있다. 여기에 에러메시지를 직접 입력해줘서 해당 정보도 갖도록 생성했다.

 

만약에 같은 예외가 많은 곳에 코드로 남겨뒀는데 에러메시지는 동일하게 수정해야한다면 하나하나 찾아야하는 수고스러운 일이 발생한다.

Spring은 이를 한번에 수정할 수 있는 기능을 제공한다.

 

정확히 파일이름을 지정해야 해당 아이콘으로 변한다.

위와 똑같은 파일을 만들어 준다.

 

그 안에 메시지 코드(키)와 메시지(값)를 남겨준다.

 

해당 파일에서 불러와줄 기능을 갖고 있는 MessagesSource를 가져와준다.

빈으로 등록이 되어있다.

 

 

그리고 예외 생성시 메시지에 해당 빈객체를 이용해 메시지를 만들어준다.

위에서 세개의 파라미터를 받는데

1. code : Messages.properties에서 설정해준 코드(키)값

2. Object[] args :  메시지(값)에 '{0}'과 같이 표기된 곳에 해당 index에 값을 넣어준다. @Nullable이기에 null도 가능하다.

3. Locale : 이 값은 항상 요구받는데 특정 국가를 목표로 하는 게 아니라면 Locale.getDefault()로 기본값을 넣어준다.

 

+ defaultMessage : 3번째 파라미터로 추가할 수 있는데, 코드를 찾지 못했을 경우 반환하는 String값이다.

 

 

 


커스텀 예외처리에 대한 부분은 정형화 되어있지 않은 느낌을 받는다.
우선은 기본적인 개념과 어떤 방향의 주의점들이 있는 지 정도는 숙지했으니,
이후 개발시에 고민할 수 있는 선택지를 넓힌 것으로 만족한다.

 

 

 

더 공부할 내용

- StackTrace다루기 : 예외 클래스 생성시 이를 굳이 생성하지 않도록 하여 리소스를 아낄 수 있다고는 하는데 개념적으로 아직 이해가 부족하다.