Replies: 2 comments
|
수고하셨습니다 ㅎㅎ!! |
0 replies
|
정리 스타일 좀 바뀌셨군요 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-Object: 예외도 객체(객체의 최상위 부모)이다.
-Throwable: 최상위 예외이다.
-Error: 메모리 부족, 심각한 오류, 복구 불가능한 시스템 예외, 개발자는 이 예외 잡으려함 안 된다.
**언체크 예외: 자바 프로그램이 실행될 때 생길 수 있는 오류(컴파일 할 때는 문제 없음)
-Exception: 체크 예외
-RuntimeException: 언체크 예외, 런타임 예외
ex) Exception을 catch로 잡으면 하위 예외들 모두 잡음
ex) Exception을 throws로 던지면 하위 예외들 모두 던짐
**예외를 처리 못하고 계속 던진다면?
체크 예외 기본 이해
**자바에서 컴파일할 때 컴파일러가 꼭 예외 처리를 확인하는 예외 반드시 예외 처리 코드(try-catch)를 추가하거나 throws 키워드로 예외를 던져야함
체크 예외 전체 코드
** 스택 트레이스: 오류 발생 위치, 경로 정보
체크 예외의 장단점
-체크 예외는 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 필수로 선언해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
언체크 예외 기본 이해
-RuntimeException과 그 하위 예외는 언체크 예외로 분류된다.
-컴파일러가 예외를 체크하지 않는다는 뜻이다.
-언체크 예외는 체크 예외와 기본적으로 동일하다. 차이는 예외를 던지는 throws 선언하지 않고, 생략 가능, 이 경우 자동으로 던진다.
언체크 예외 전체 코드
언체크 예외의 장단점
-언체크 예외는 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 생략할 수 있다.
체크 예외 활용
-기본적으로 언체크(런타임) 예외를 사용하자
-체크 예외는 비즈니스 로직상 의도적으로 던지는 예외에만 사용하자
체크 예외의 문제점
-체크 예외는 컴파일러가 예외 누락을 체크해주기 때문에 개발자가 실수로 예외를 놓치는 것을 막아준다. 그래서 항상 명시적으로 예외를 잡아서 처리하거나, 처리할 수 없을 때는 예외를 던진다. method() throws 예외로 선언해야 한다.
-리포지토리는 db에 접근, 데이터를 저장하고 관리한다. 여기서는 SQLExecption 체크 예외 던진다.
-NetworkClient는 외부 네트워크에 접속, 어떤 기능을 처리하는 객체이다. 여기서는 ConnectException 체크 예외를 던진다.
-서비스는 리포지토리와 NetworkClient 둘 다 호출한다.
따라서 두 곳에서 올라오는 체크 예외인 SQLException 과 ConnectException 을 처리해야 한다.
그런데 서비스는 이 둘을 처리할 방법을 모른다. ConnectException 처럼 연결이 실패하거나,
SQLException 처럼 데이터베이스에서 발생하는 문제처럼 심각한 문제들은 대부분 애플리케이션 로직에서 처리할 방법이 없다.
서비스는 SQLException과 ConnectException을 처리할 수 없으므로 둘 다 밖으로 던진다.
체크 예외이기 때문에 던질 경우 method() throws SQLException, ConnectException
-웹 어플리케이션이라면 서블릿의 오류 페이지나, 스피링 mvc가 제공하는 ControllerAdvice 에서 이런 예외를 공통으로 처리한다.
체크 예외 문제점 - 코드 - CheckedAppTest
2가지 문제
SQLException에 의존하던 모든 서비스, 컨트롤러의 코드를 JPAException에 의존하도록 고쳐야 한다.
서비스나 컨트롤러 입장에서는 처리할 수 없는 예외를 의존해야 하는 큰 단점이 발생하게 된다. 결과적으로 OCP, DI 통해 클라이언트 코드의 변경 없이 대상 구현체를 변경할 수 있다는 장점이 체크 예외 때문에 발목이 잡힌다.
-JDBC -> JPA 같은 기술로 변경하면 예외도 함께 변경해야한다. 예외를 던지는 모든 부분도 변경해야 한다.
throws Exception
-SQLException, ConnectException 같은 시스템 예외는 컨트롤러나 서비스에는 대부분 복구가 불가능하고 처리할 수 없는 체크 예외이다. 따라서 다음과 같이 처리해주어야 한다.
-void method() throws SQLException, ConnectException {..}
-Excetion 도 가능 void method() throws Exception {..}
Exception은 편하지만 문제 발생: 다른 체크 예외 체크할 수 있는 기능 무효화, 중간에 중요한 체크 예외가 발생해도 컴파일러는 Exception을 던지기 때문에 문법에 맞다고 판단, 컴파일 오류가 발생하지 않는다.
언체크 예외 활용
런타임 예외 사용

런타임 예외 사용 변환 - 코드 - UncheckedAppTest
런타임 예외 throws 생략
-런타임 예외이기 떄문에 컨트롤러나 서비스 예외를 처리할 수 없다면 다음 부분 생략 가능
런타임 예외 throws 생략
예외 포함과 스택 트레이스
-예외를 전환할 때는 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스 확인할 때 심각한 문제가 발생한다.
-로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.
트레이스를 로그에 출력할 수 있다.
All reactions