본문으로 바로가기
반응형

java 개발을 처음 시작할 때는 별 신경 쓰지 않고 넘어가지만, 점점 고민이 많아지는 부분이 바로 Exception처리와 Transaction 처리에 대한 부분이다.

특히, Transaction은 잘못 처리하면 데이터가 꼬여 치명적인 결함을 발생시킬 수 있기 때문에 꼭 신경 써 줘야 한다.

먼저 자바 개발시 Exception에 대한 내용을 정리해 보자.



Exception(예외)와 Error(오류)


Error는 개발자가 구현한 로직 보다는 시스템 상에서 비정상적 상황이 생겨 발생하는 치명적인 오류이다. 이는 개발자가 로직 구현 단계에서 예측할 수 없기 때문에 코딩시에 따로 신경 쓸 부분이 없다.

반면에 Exception은 개발자가 구현한 로직에 의해 발생하는 문제이다. 예를 들어 null을 참조하려 하거나, DB에 데이터를 잘못 넣거나 하는 경우에 Exception이 발생한다.

때문에 개발자는 Exception이 발생할 수 있는 부분에 대한 대비가 가능하다. 혹은 심지어 일부러 Exception을 발생시켜 별도의 처리 로직을 수행하는 구현도 가능하다.



Exception의 종류


Exception의 종류에는 Checked Exception과 Unchecked Exception이 있다.

두 Exception의 가장 큰 차이는 '반드시 예외 처리를 해야 하는가?' 이다.

Checked Exception은 체크 하는 시점이 컴파일 단계이기 때문에, 별도의 예외 처리를 하지 않는다면 컴파일 자체가 되지 않는다. 반면에 Unchecked Exception의 경우는 충분히 개발자의 충분한 주의로 피할 수 있는 경우가 대부분이다. 따라서 별도의 예외 처리가 꼭 필요하지 않으며, 처리하지 않더라도 컴파일도 되고 실행까지 가능하다.


(출처 : http://www.nextree.co.kr/p3239/ )


여기서 주의깊게 봐야 하는 것이 바로 트랜잭션 처리에 관한 부분이다.

Checked Exception의 경우에는 예외가 발생하더라도 트랜잭션 단위에 따른 roll-back을 하지 않는다. 

예를 들어 1. X를 insert  -> 2. Y를 update -> 3. Z를 delete 하는 로직에서 '3. Z를 delete' 하는 과정에서 Checked Exception이 발생하면 앞선 과정을 roll-back 해 주지 않는다.

개발할 때 이를 반드시 인지하고 roll-back 규칙 등을 고려 해서 트랜잭션을 적용해야 할 것이다.



예외처리 방법


1. 예외 복구


1
2
3
4
5
6
7
8
9
10
11
12
13
int retry = 0;
while( retry++  < 10){
    try{
        //로직
        return//성공시 바로 리턴
    }catch(Exception e){
        //에러 발생시 별도의 처리(로그 출력 )등
    }finally{
        // 리소스 반납 등 작업
    }
    
}
throw new xxxxException(); //특정 횟수만큼 재시도 후 직접 예외 발생 처리
cs


네트워크에 연결하거나 하는 등의 로직에서 유용하다. 예외가 발생하더라도 일정 수만큼 재시도를 하여 예외 복구를 시도한다. 혹은 예외가 발생했을 경우 plan B의 로직으로 전환시켜 예외를 복구하는 방법도 예외 복구에 해당한다.


2. 예외 회피


1
2
3
public void method() throws Exception {  
    // 로직
}
cs

예외가 발생하면 throws로 해당 메소드를 호출한 쪽으로 예외를 던져버리고 회피한다.

호출한 쪽에서 예외를 처리하거나 예외가 발생했을 때 회피하는 것이 최선의 방법일때 사용해야 한다.


3. 예외 전환


1
2
3
4
5
6
try{
    //로직
}catch(Exception e) {  
   
   throw xxxxException();
}
cs

예외를 잡아 별도로 정의된 예외 처리 로직으로 Exception을 전환시켜 준다. 




반응형

 Other Contents