[Exception]_Spring 예외처리

2022. 6. 16. 17:22[Spring]_

728x90
반응형

Exception 이란?

 

Error 와 Exception 의 차이는 개발자의 의도인지 아닌지 라고 생각합니다.

 

Error 같은 경우에는 시스템의 심각한 오류, 서버 다운 등

말 그대로 에러인 경우이고, 시스템 레벨에서 일어납니다.

개발자가 의도하거나, 예상 할 수 없습니다.

 

Exception 의 경우에는 개발자가 작성한 코드 안에서 일어나는 것들을 말합니다.

개발자가 미리 알고, 예상 할 수 있는 범위를 뜻합니다.

 

Error 의 경우 개발자가 예측하여 해결할수 없습니다.

따라서 개발자는 자기가 작성한 코드 내에서 일어날 수 있는 예외를 생각해야 하고,

코드를 작성할 때 예외가 충분히 일어날 수 있는 곳에는 예외처리를 해줘야 합니다.

 


 

Exception 의 종류

 

예외에는 크게 2가지 종류가 있습니다.

 

Checked Exception : RuntimeException 을 상속받지 않는 Exception 들 이며, 해당 예외처리는 반드시 try catch 문으로 감싸서 예외처리를 해줘야 합니다. 그렇지 않을 경우에는 컴파일 오류가 발생하고, 멈추게 됩니다.

 

RuntimeException : Checked Exception 이 아닌것들이며, 해당 예외는 시스템을 멈추게 하진 않습니다.

지정한 Exception 종류의 오류에 런타임 예외가 발생합니다.

 


 Exception 처리

 

1. 예외 복구

 

try catch finally 을 활용하여 예외처리가 날 곳을 예상하고 오류가 나지 않도록 다른 로직으로 유도 합니다.

String key ="";

try{
   BoardService.boardInsert(params);
}catch (PersistenceException e){
   logger.debug("SQL EXCEPTIONS");
   key = "";
   return key;
}catch(SQLException e){
   if(e.getErrorCode() == 1111){
      logger.debug("부적절한 열 입력 (null)");
   }
}finally{
   if(CommonUtil.isEmpty(params.get("key"))){
      key = "";
   } else{
      key= params.get("key").toString();
   }
   logger.debug("TEST");
   logger.debug(key);
   return key;
}

예외가 일어날 곳에 try

catch 문 안에는 일어날 예외를 잡아둡니다.

finally 문에는 예외가 일어나는지 여부와는 상관없이 무조건 실행되는 로직입니다.


2. 예외처리 회피

예외처리를 해당 클래스에서 해결하지 않고 다른곳으로 위임 하는 경우입니다.

 

mybatis 등을 사용할 때 mapper 부분과 service 에는 예외처리를 잘 하지 않습니다.

보통 service 상속 클래스에서 처리합니다.

 

@Override
public int boardInsert(Map<String, String> params) throws SQLException, PersistenceException {
   return BoardMapper.boardInsert(params);
}

throws 를 통해 service에서 serviceImpl로 예외를 넘기는 모습입니다.


3. 예외 전환

 

try catch 문으로 예외를 잡았다면 catch 문 안에는 적절한 예외처리를 해줘야 합니다.

보통 2가지로 나뉩니다. 

 

첫번째로는 알기쉬운 예외로 만들어서 반환하는 방법입니다.

catch(SQLException e){
   if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY){
      DuplicateUserIdException();
   }else{
   	  throw e;
   }
}

예외코드를 가져오는 메소드를 활용해서 비교하는 방법이 있습니다.

 

두번째 로는 checkedException을 RuntimeException으로 포장해서 전달하는 방법입니다.

 

CheckException의 경우 컴파일오류가 발생하기 때문에 이를 런타임으로 포장합니다.

catch(SQLException e){
   if(e.getErrorCode() == 1111){
      throw new PersistenceException(pe);
   }

SQLException 은 CheckedException 입니다 이를 RuntimeException을 상속한 PersistenceException으로 바꿔준 예시입니다.


마무리

 

예외처리를 잘 해두면 유지보수가 용이하고, 오류 발생시 빠른 수정이 가능합니다.

 

다음에는 예외처리를 좀더 깊숙하게 알아보겠습니다. 

 

감사합니다.

 

 

728x90
반응형