Wookim

예외처리 고찰 본문

카테고리 없음

예외처리 고찰

개발자인 경우 2020. 1. 2. 18:55

프로그래머를 괴롭히는 2가지 문제

개발하면서 발생하는 문제를 크게 2가지라 볼수있다.

  1. error

    코드 문제가 아닌 하드웨어나 외부요인으로 인한 프로그램 먹통 현상.

    프로그래머가 관리할 문제가 아니라 볼 수 있다.

  2. exception

    프로세스 실행 중에 발생한 예외를 의미함.

    이로 인해 프로세스가 중지될 수 있지만, 예외 처리를 통해 이를 막을 수 있다.

    프로그래머가 반드시 관리해야 할 문제다.

Exception (예외)

코딩을 하다보면 예외처리가 필수적이다.

이유는 runtime exception을 처리하기 위해서이다.

 

이를 하지 않는 실수를 한다면, 프로세스가 실행중에 죽을 수 있다.

이를 해결하기 위한 작업이 예외처리이다.

 

하지만.

 

이곳 저곳에서 예외처리를 해놨다면,

불필요한 예외처리 구문에 의해 성능저하 등의 이슈를 발생시키기고,

유지보수하기 어려워 진다. (try-catch지옥)

 

따라서 예외처리 전략을 세우고 지키는 것이 중요하다고 생각한다.

구체적인 상황을 세우고 이를 해결할 방법에 대해 생각해 보자.

상황

  1. spring을 이용한 백엔드 서버 개발
  2. mvc패턴 사용

위와 같은 상황일 때 예외처리의 적용 지점에 대해 생각해 보자.

보통 mvc 패턴으로 백엔드 서버를 구성했다면

frontend → request → backend server → controller → service ...

와 같은 프로세스로 사용자의 요청을 처리할 것이다.

 

보통 controller 클래스는 client가 원하는 service를 연결하는 진입점이다.

controller 클래스의 메소드에 연결이 된 후,

해당 메소드 블럭에서 알맞는 service 클래스의 메소드들을 사용한다.

java의 예외 처리

  1. try-catch
  2. throw exception

자바의 예외처리 방식은 프로그래머마다 다양하고 정답은 없다.

중요한것은 예외처리 전략을 세웠다면 제대로 예외를 처리해야 한다고 생각한다.

throw Exception

필자는 thorw를 이용해 예외를 던지는 것을 선호한다.

이유는 try-catch를 남발하면

문제가 발생할 수도 있기 때문이다. (실수할 확률이 높다)

 

필자가 사용하는 예외처리 전략은 다음과 같다.

 

어떤 코드 블럭에서 다양한 메소드가 실행될 때,

해당 코드 블럭이 예외처리를 할 지점으로 설정한다.

 

* 여러 가지 메소드를 사용하는 지점 *

 

즉 위 코드 블럭은 다양한 메소드들을 실행하고 관리하는 포인트라 볼 수 있다.

위의 예제에선 controller의 getTaskListByPermision() 메소드 라 볼 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
@RequestMappitng(url....)
public void getTaskListByPermision(){
 
// 권한을 확인하여 taks list를 받아오는 서비스
 
// 해당 메소드들이 서로 연관성이 있을 때
 
  try{
      userInfoService.getUserPermission();
      taskService.getTaskList();
  }catch(userInfoServiceExcepion e){
      e.printStackTrace();
  }catch(taskServiceException e){
      e.printStackTrace();
  }catch(Exception e){
      e.printStackTrace();
  }
----------------------------------------------------------------------------
 
 
public void getUserPermission() throws UserInfoServiceException, Exception{
  if(예외상황1){
      throw new UserInfoServiceException();
  } 
  ...
  if(예외상황2){
      throw new Exception();
  }
 
 
 
public void getTaskList() throws TaskServiceException, Exception{
 
  if(예외상황1){
      throw new TaskServiceException();
  }
  ...        
  if(예외상황2){
      throw new Exception();
  }
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

위 예제는 필자가 사용하는 예외처리 전략이다.

특징

  1. 여러 메소드들이 사용되는 지점에 try-catch가 한번만 사용된다.

  2. 메소드들은 if문등 제어문을 이용해 에러가 발생하는 분기를 직접 만들어,

    메소드를 사용하는 지점에 예외를 던질 수있다.

  3. return을 사용하는 것이 아닌 예외를 던저 탈출 할 수 있다.

이 전략을 이용하면 메서드들의 모든 예외를 try-catch안에 구현할 필요가 없다.

단지 메서드를 사용하는 지점에 분기한 예외를 던질 뿐이다.

즉 에러 상황을 if문 등을 이용해 처리할 수 있다.

 

위의 예는 예일뿐 절대적이지 않다.

쉽게 설명하기위해 저런식으로 작성했다.

try-catch 구문이 컨트롤러에 있어야 할 이유는 없다.

특정 서비스에서 여러 메소드들이 있을 때,

public ServiceClass{
  public Map<String, Object> processMethod(){
    try{
      this.method1();
      this.method2();
      this.method3();
    }catch(Exception){
    	...
    }
  }

  private vodi method1() throws Exception{
   ...
  }
  private vodi method2() throws Exception{
   ...
  }
  private vodi method3() throws Exception{
   ...
  }

}

위 처럼 작성해도 무방하다. 그렇게 해야 할때도 있다. 

(DB예외를 다룬다거나...) 

 

가독성 향상은 덤.

 

해당 글을 마무리 하며...

예외처리 하는 방법은 다양하고 이것이 옳다 하는것은 없다고 생각한다.

 

제일 중요한것은 예외를 제대로 처리하는 것이라고 생각한다.

Comments