오늘 수업때는 자바에서 사용하는 예외에 관하여 배우는 시간이었다.
오늘은 유난히도 선생님께서 치시는 코드를 따라치기 조차 벅찬 시간이었다.
지금 머리속에서 정리가 전혀 되지않지만 여러자료를 종합해서 정리해보도록 하겠다..
예외를 처음에 보자마자 오류(Error) 랑 예외(exception) 를 바로 비교를 했습니다. Error는 컴퓨터나 다른 기계들을 사용하다가 뭔가 잘못되었을때 자주 나와서 너무나도 익숙한 단어지만 또 자세하게 무슨의미인지 서술하기는 어려운 말이 었습니다. Error의 중요한 의미는 시스템에 비정상적인 상황이 생기면 발생한다고 하고 시스템 레벨(하드웨어의 메모리 부족 등등..)이라 치명적이고 개발자가 예측할수 없는것이라 오류에 관해서는 처리를 할 수 없다고 합니다.
오류가 시스템 레벨이어서 개발자가 처리할 수 없는 문제라고 한다면 예외는 개발자가 구현한 로직안에서 발생하는 것이라고 합니다. 즉 예외는 발생할 상황을 미리 예측하여 처리할 수 있습니다. 예를 들어 숫자를 입력해야하는데 문자를 입력한다고 하면 예외처리를 하여 다시 입력하라고 말해주는 그런 느낌으로 생각하고 있습니다. 결국 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리방법을 명확히 알고 처리를 해야합니다.
예외를 처리하기 위해서 예외클래스를 구성합니다.
예외 클래스는 최상위에 object라는 객체가 있고 그 객체 밑에 Throwable 클래스(object의 자식)이 있고 그 Throwable 클라스를 상속받는 Error와 Exception이 있습니다. Error는 아까 언급했는데 시스템 레벨에 심각한 수준에 문제여서 일반적으로 시스템에 변화를 주어서 처리해야 합니다.
반면에 Exception은 개발자가 로직을 추가하여 처리할 수 있습니다.
Exception은 수많은 자식클래스를 가지고 있는데 그중에서도 RuntimeException을 기준으로 RuntimeException의 자식클래스인 Unchecked Exception과 제외한 CheckedException으로 나누어 공부해보려 한다.
Unchecked Exception과 Checked Exception의 구분기준은 꼭 처리를 해야하느냐 라고 한다. 약간 Checked 체크해야하는 예외, Unchecked 체크안해도 되는 예외 같은 느낌? Checked Exception이 발생할 가능성이 있는 메소드는 '반드시' 로직을 try/catch로 감싸거나 throw로 던져서 처리해야한다. 반면 Unchecked Exception는 명시적인 예외처리를 하지않아도 된다. 이 것은 피할수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이고 미리 예측 못하는 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리 할 필요가 없도록 만들어져 있다.
다른 구분 방법으로는 컴파일 단계에서 명확하게 예외를 체크 할수 있는 것이 Checked Exception이고 Unchecked Exception은 컴파일 단계에서는 확인할 수 없는 예외이고 실행과정으로 넘어가면서 발견 되는 예외다. 그래서 Runtime Exception이라 한다고 한다.
또 다른 꿀팁이 있다면 예외발생시 트랜잭션의 roll-back 여부다.
트랜잭션은 sql다룰때 깊게는 아니고 이런 것이 있다 정도로만 들었던 부분인데 이번에도 나와서 잠깐 다뤄보려고 한다.
트랜잭션이란
insert, update, delete 등 DB 변경에 해당하는 명령이 있는 SQL 구문을 트랜잭션이라고 함
Commit – 트랜잭션의 결과를 DB에 반영
Rollback – 트랜잭션 결과를 DB에 미반영
트랜잭션의 기본 개념
원자성, 일관성, 격리성, 지속성
주의사항
1. 디폴트는 autocommit(true); 이다.
2. autocommit(false); 를 선언한후 작업이 다 완료되면
자동위탁모드를 다시 true로 바꿔야 한다.
3. catch 구문에서 rollback를 해주어야 한다.
4. commit or rollback를 호출하여 Connection 객체가 현재 보관 유지하는 데이터베이스 락을 해제합니다.
[출처] 자바 트랜잭션 java transaction 설명 개념 / 방법 처리|작성자 shkim
sql을 사용하면서는 default값이 자동커밋이라 많이 인지하고 있지 못한 개념이었다.
트랜잭션은 데이터가 좀 더 안정적으로 일관성이 있게 해서 치명적인 문제가 생기면 복구하려고 해놓은 것 임을 알았다.
Checked Exception은 예외가 발생하면 트랜잭션을 롤백안하고 던져준다. 하지만 Unchecked Exception은 예외 발생시 트랜잭션을 롤백한다. 이 두 예외에 트랜잭션을 어떻게 묶어놓냐에 따라 롤백에 범위가 달라지기 떄문에 개발자가 인지하지 못하면 실행결과가 다르거나 예상치 못한 예외가 발생할 수 있다.
예외복구는 예외가 발생하더라도 어플리케이션은 정상적인 흐름이로 진행된다는 것 이라고 한다
예외가 발생하더라도 재시도를 통해 복구하고 정상적으로 작업을 종료할 수 있도록 유도한다.
throws로 던진다. 호출한 쪽에서 다시 예외를 받아서 처리하도록 하거나 호출한 쪽에서 처리를 확실하게 할수 있을 때 던저야 한다.(무책임하게 던지면...매우위험)
예외를 잡아서 다른 예외를 던진다. Checked Exception에 복구 불가능한 예외가 잡히면 Unchecked Exception으로 전환해서 던져주어 다른 계층에서 일일이 예외를 선언할 필요 없게 할 수도 있다. -> 솔직히 잘 이해가 가지는 않지만..