Java - Exception.. 복습[hong]

홍석진·2021년 3월 31일
0

JAVA

목록 보기
4/10

Exception 이란..

오늘 수업때는 자바에서 사용하는 예외에 관하여 배우는 시간이었다.
오늘은 유난히도 선생님께서 치시는 코드를 따라치기 조차 벅찬 시간이었다.
지금 머리속에서 정리가 전혀 되지않지만 여러자료를 종합해서 정리해보도록 하겠다..

1.예외랑 오류

예외를 처음에 보자마자 오류(Error)예외(exception) 를 바로 비교를 했습니다. Error는 컴퓨터나 다른 기계들을 사용하다가 뭔가 잘못되었을때 자주 나와서 너무나도 익숙한 단어지만 또 자세하게 무슨의미인지 서술하기는 어려운 말이 었습니다. Error의 중요한 의미는 시스템에 비정상적인 상황이 생기면 발생한다고 하고 시스템 레벨(하드웨어의 메모리 부족 등등..)이라 치명적이고 개발자가 예측할수 없는것이라 오류에 관해서는 처리를 할 수 없다고 합니다.
오류가 시스템 레벨이어서 개발자가 처리할 수 없는 문제라고 한다면 예외는 개발자가 구현한 로직안에서 발생하는 것이라고 합니다. 즉 예외는 발생할 상황을 미리 예측하여 처리할 수 있습니다. 예를 들어 숫자를 입력해야하는데 문자를 입력한다고 하면 예외처리를 하여 다시 입력하라고 말해주는 그런 느낌으로 생각하고 있습니다. 결국 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리방법을 명확히 알고 처리를 해야합니다.

2.예외

예외를 처리하기 위해서 예외클래스를 구성합니다.
예외 클래스는 최상위에 object라는 객체가 있고 그 객체 밑에 Throwable 클래스(object의 자식)이 있고 그 Throwable 클라스를 상속받는 Error와 Exception이 있습니다. Error는 아까 언급했는데 시스템 레벨에 심각한 수준에 문제여서 일반적으로 시스템에 변화를 주어서 처리해야 합니다.
반면에 Exception은 개발자가 로직을 추가하여 처리할 수 있습니다.
Exception은 수많은 자식클래스를 가지고 있는데 그중에서도 RuntimeException을 기준으로 RuntimeException의 자식클래스인 Unchecked Exception과 제외한 CheckedException으로 나누어 공부해보려 한다.

3.Unchecked Exception과 Checked Exception

Unchecked Exception과 Checked Exception의 구분기준은 꼭 처리를 해야하느냐 라고 한다. 약간 Checked 체크해야하는 예외, Unchecked 체크안해도 되는 예외 같은 느낌? Checked Exception이 발생할 가능성이 있는 메소드는 '반드시' 로직을 try/catch로 감싸거나 throw로 던져서 처리해야한다. 반면 Unchecked Exception는 명시적인 예외처리를 하지않아도 된다. 이 것은 피할수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이고 미리 예측 못하는 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리 할 필요가 없도록 만들어져 있다.
다른 구분 방법으로는 컴파일 단계에서 명확하게 예외를 체크 할수 있는 것이 Checked Exception이고 Unchecked Exception은 컴파일 단계에서는 확인할 수 없는 예외이고 실행과정으로 넘어가면서 발견 되는 예외다. 그래서 Runtime Exception이라 한다고 한다.
또 다른 꿀팁이 있다면 예외발생시 트랜잭션의 roll-back 여부다.

트랜잭션(transaction)

트랜잭션은 sql다룰때 깊게는 아니고 이런 것이 있다 정도로만 들었던 부분인데 이번에도 나와서 잠깐 다뤄보려고 한다.
트랜잭션이란
insert, update, delete 등 DB 변경에 해당하는 명령이 있는 SQL 구문을 트랜잭션이라고 함
Commit – 트랜잭션의 결과를 DB에 반영
Rollback – 트랜잭션 결과를 DB에 미반영
트랜잭션의 기본 개념

원자성, 일관성, 격리성, 지속성

  1. 원자성(Atomicity) - 트랜잭션 내에 있는 모든 작업이 완료되거나 모든 작업이 완료되지 않아야 한다. 즉, 트랜잭션 내의 작업 중 하나라도 에러가 발생하면 트랜잭션 내의 모든 작업은 롤백(rollback)되어야 합니다.
  2. 일관성(Consistency) - 트랜잭션 중에 오류 없이 유효한 데이터만 데이터베이스에 저장되어야 합니다.
  3. 격리성(Isolation) - 트랜잭션 중에 변경된 내용이 트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 미쳐서는 안됩니다.
  4. 지속성(Durability) - 트랜잭션이 완료된 경우 시스템 고장이나 네트워크 에러 등으로 데이터가 유실되지 않고 정상적으로 기록되어야 한다.

주의사항
1. 디폴트는 autocommit(true); 이다.
2. autocommit(false); 를 선언한후 작업이 다 완료되면
자동위탁모드를 다시 true로 바꿔야 한다.
3. catch 구문에서 rollback를 해주어야 한다.
4. commit or rollback를 호출하여 Connection 객체가 현재 보관 유지하는 데이터베이스 락을 해제합니다.

[출처] 자바 트랜잭션 java transaction 설명 개념 / 방법 처리|작성자 shkim

내 생각

sql을 사용하면서는 default값이 자동커밋이라 많이 인지하고 있지 못한 개념이었다.
트랜잭션은 데이터가 좀 더 안정적으로 일관성이 있게 해서 치명적인 문제가 생기면 복구하려고 해놓은 것 임을 알았다.

3-1)트랜잭션의 roll-back 여부로 예외 확인

Checked Exception은 예외가 발생하면 트랜잭션을 롤백안하고 던져준다. 하지만 Unchecked Exception은 예외 발생시 트랜잭션을 롤백한다. 이 두 예외에 트랜잭션을 어떻게 묶어놓냐에 따라 롤백에 범위가 달라지기 떄문에 개발자가 인지하지 못하면 실행결과가 다르거나 예상치 못한 예외가 발생할 수 있다.

예외 처리 방법

1. 예외 복구

예외복구는 예외가 발생하더라도 어플리케이션은 정상적인 흐름이로 진행된다는 것 이라고 한다
예외가 발생하더라도 재시도를 통해 복구하고 정상적으로 작업을 종료할 수 있도록 유도한다.

2. 예외 처리 회피

throws로 던진다. 호출한 쪽에서 다시 예외를 받아서 처리하도록 하거나 호출한 쪽에서 처리를 확실하게 할수 있을 때 던저야 한다.(무책임하게 던지면...매우위험)

3. 예외 전환

예외를 잡아서 다른 예외를 던진다. Checked Exception에 복구 불가능한 예외가 잡히면 Unchecked Exception으로 전환해서 던져주어 다른 계층에서 일일이 예외를 선언할 필요 없게 할 수도 있다. -> 솔직히 잘 이해가 가지는 않지만..

[출처] https://www.nextree.co.kr/p3239/

profile
질문이나 의견이 있으시면 남겨주세요. 서로의 발전이라고 생각합니다.

0개의 댓글