사용자 정의 예외
규모 있는 어플리케이션을 개발하다 보면 표준 API에서 제공하는 예외 클래스만으로는 표현하기 힘든 예외들이 있습니다. 예를들어 회원가입 기능을 구현하기 위해서는 중복확인 API를 구현하게 됩니다. 이때 입력한 아이디가 이미 존재하는 경우 표준 API의 어떤 예외를 발생시켜야 할까요? 이럴때에 UserAlreadyExistException 같은 예외를 만들어서 던지게 된다면 내가 개발한 API를 다른 개발자가 사용하는데에 있어서 많은 정보를 얻을 수 있을것입니다. 
또한 서버환경이라면 문제가 발생했을 때 표준 API에서 제공하는 예외를 돌려쓰는 것 보다 구체적인 정보를 담고 있는 예외를 정의하여 던지게 해 놓았을 때 서버 콘솔이나 로그파일을 보고 한눈에 알아볼 수 있을 것 입니다.


사용자 정의 예외 클래스 만드는 방법
사용자 정의 예외를 만드는 방법은 간단합니다. 기존 표준 API에서 제공되는 예외를 상속하면 됩니다. 만약 특정한 프레임워크나 라이브러리를 사용하고 있다면 해당 라이브러리에서 제공하는 예외를 상속하여 만들 수도 있습니다.
예외를 만들 때에는 예외 클래스명을 xxxException 과 같이 예외 클래스임을 알려주도록 하는것이 관례입니다.
보통의 경우 Exception 또는 RuntimeException을 상속 받아 정의합니다.

예외를 강제 하고 싶은 경우 Exception을 상속받으면 되고 느슨하게 정보만 제공하고 싶은 경우 RuntimeException을 상속합니다. 또한 상속만 하여 사용할 수도 있지만 다음과 같이 필요한 생성자를 구현하여 사용할 수 있습니다.
public class UserAlreadyExistException extends RuntimeException{
    
    public UserAlreadyExistException() {
        super();
    }
    
    public UserAlreadyExistException(String message){
        super(message);
    }
    
    public UserAlreadyExistException(Throwable ex){
        super(ex);
    }
    
    public UserAlreadyExistException(String message, Throwable ex){
        super(message, ex);
    }
}

또한 예외를 정의할 때 필요에 따라 추가 기능을 구현해 줄 수도 있습니다. 프로그램에서 사용할 에러코드 규칙을 팀 내에서 정한 후 API를 사용할때 중복이 발생하는 경우 케이스 별로 다양한 에러코드 사용한다 라고 가정했을때 다음과 같이 예외를 정의하여 사용할 수 있을 것입니다.
public class UserAlreadyExistException extends RuntimeException{
    
    private final String ERR_CODE;
    
    public UserAlreadyExistException(String errCode){
        super("유저가 이미 존재합니다. 에러코드 : [" + errCode + "]");
        this.ERR_CODE = errCode;
    }
    
    public String getErrCode(){
        return this.ERR_CODE;
    }
    
}

 
사용자 예외를 사용하는 방법
사용자 예외도 기존 예외를 상속받은 Exception이기 때문에 표준 예외와 똑같이 사용 가능합니다.
예외가 발생하는 경우 JVM에서 인식 하므로 기존과 같이 사용할 수 있습니다.
public class ExceptionRunner {

    public static void main(String[] args) {

        UserDao userDao = new UserDao();
        
        boolean isExistUser = userDao.isExistUser("testId@test.net");
    }

}

public class UserDao {
    
    public boolean isExistUser(String userId) throws UserAlreadyExistException{
        //db에 유저가 있는지 검사하는 로직
        User user = userDao.findUserById(userId);
        
        if(user != null){
            throw new UserAlreadyExistException("001");
        }
    }
    
}

Exception in thread "main" javaTest.exception.UserAlreadyExistException: 유저가 이미 존재합니다. 에러코드 : [001]
    at javaTest.exception.UserDao.isExistUser(UserDao.java:9)
    at javaTest.exception.ExceptionRunner.main(ExceptionRunner.java:7)



참고글


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,