본문 바로가기
language/java

Java Checked vs Unchecked Exception 완벽 이해하기

by 죄니안죄니 2026. 5. 28.
반응형

Java Checked vs Unchecked Exception 완벽 이해하기

Java 예외 처리에서 가장 중요한 개념 중 하나가 바로:

Checked Exception
vs
Unchecked Exception

차이입니다.

실무 면접에서도 정말 자주 나오고,
실제 프로젝트 설계에도 엄청 큰 영향을 줍니다.

특히 현대 Spring Framework 실무에서는:

왜 RuntimeException(Unchecked)을 더 많이 쓰는가?
 

를 이해하는 것이 매우 중요합니다.

이번 글에서는:

  • Checked / Unchecked 차이
  • RuntimeException 구조
  • 컴파일러 동작
  • 설계 철학
  • 현대 Spring 실무 전략
  • 트랜잭션 rollback
  • 계층 구조 문제

까지 깊게 정리해보겠습니다.


1. 전체 Exception 구조 복습

Java 예외 구조:

Throwable
 ├── Error
 └── Exception
      └── RuntimeException
 

2. 핵심 구분

매우 중요.

종류기준
Checked Exception RuntimeException 제외
Unchecked Exception RuntimeException 계열

3. Checked Exception이란?

Checked exception 은:

컴파일러가 처리 강제하는 예외

입니다.


4. 대표 Checked Exception

예외의미
IOException 파일/네트워크 문제
SQLException DB 문제
FileNotFoundException 파일 없음

5. 특징

컴파일러가:

“반드시 처리해라”
 

강제.

즉:

  • try-catch
  • throws

반드시 필요.


6. 예시

 
FileReader reader =
    new FileReader("a.txt");
 

컴파일 오류 가능.


7. 해결 방법 1

 
try {

} catch(IOException e) {

}
 

8. 해결 방법 2

 
void read() throws IOException
 

9. 왜 Checked Exception 만들었을까?

Java 초기 철학 때문.

핵심 목표:

복구 가능한 예외를 강제로 처리
 

입니다.


10. 대표 철학

예:

파일 없음
네트워크 오류
DB 장애
 

“반드시 대응해야 한다”
 

11. Unchecked Exception이란?

RuntimeException 기반 예외.


12. 특징

컴파일러가 처리 강제 안 함
 

즉:

 
throw new RuntimeException();
 

해도:

try-catch 없어도 컴파일 가능
 

13. 대표 Unchecked Exception

예외의미
NullPointerException null 접근
IllegalArgumentException 잘못된 인자
IndexOutOfBoundsException 범위 초과
IllegalStateException 잘못된 상태

14. 왜 unchecked일까?

보통:

개발자 코드 문제
 

에 가까운 경우 많기 때문.

즉:

컴파일러가 강제해도 해결 어려움
 

15. 가장 큰 차이

항목CheckedUnchecked
컴파일 검사 O X
처리 강제 O X
대표 원인 외부 환경 프로그래밍 오류

16. Checked Exception의 장점

대표 장점:

예외 처리 누락 방지
 

17. 예시

 
IOException
 

발생 가능하면:

컴파일러가 강제로 알림
 

18. 하지만 현실 문제가 생김

매우 중요합니다.


19. 대표 문제: throws 전파 지옥

예:

Repository
↓
Service
↓
Controller
 

20. Repository에서 IOException 발생

그러면:

 
throws IOException
 

전파 필요.


21. 결국 전체 계층 오염

 
controller()
    throws IOException
 

까지 올라갈 수 있음.


22. 이것이 계층 결합 증가

즉:

하위 기술 예외가 상위 계층까지 침투
 

합니다.


23. 실무에서 매우 싫어하는 부분

특히 대규모 서비스에서:

throws Exception 남발
 

상황 발생 가능.


24. 그래서 현대 Spring은?

매우 중요.

대부분:

RuntimeException 기반 전략
 

사용.


25. 왜 RuntimeException 선호할까?

핵심 이유:

이유설명
계층 오염 감소 O
코드 간결 O
전역 처리 쉬움 O
Spring rollback 연동 O

26. Spring 트랜잭션과 연결

매우 중요합니다.

Spring Transaction Management 은 기본적으로:

RuntimeException 발생 시 rollback
 

수행.


27. Checked Exception은?

기본 설정에선:

rollback 안 할 수도 있음
 

28. 왜 이렇게 설계했을까?

Spring 철학:

Unchecked Exception
=
복구 어려운 비즈니스 실패
 

로 보는 경우 많음.


29. 예시

 
@Transactional
public void save() {

    throw new RuntimeException();
}
 

자동 rollback 가능.


30. Checked Exception이면?

 
throw new IOException();
 

기본 rollback 안 될 수 있음.


31. 해결 방법

 
@Transactional(
    rollbackFor = Exception.class
)
 

설정 가능.


32. 그런데 왜 기본은 RuntimeException만?

Spring이:

Checked Exception 남용 지양
 

철학에 가까웠기 때문.


33. 현대 Java 실무 흐름

매우 중요.


과거 Java 철학

Checked Exception 적극 사용
 

현대 Spring 실무

RuntimeException 중심
 

34. 대표적인 실무 패턴

예:

 
class BusinessException
    extends RuntimeException
 

35. 이유

비즈니스 실패를:

Unchecked로 전파
 

하는 것이 보통 더 유연.


36. Checked Exception이 여전히 좋은 경우

그렇다고 완전히 사라진 건 아님.


37. 대표 사례

상황이유
파일 처리 복구 가능
네트워크 재시도 대응 가능
외부 API fallback 가능

38. 즉 핵심 기준

매우 중요.

“호출자가 복구 가능한가?”
 

입니다.


39. 복구 가능하면 Checked 고려

예:

파일 다시 선택
재시도
fallback 처리
 

가능.


40. 복구 어렵다면 RuntimeException

예:

비즈니스 정책 위반
개발자 실수
불가능한 상태
 

41. 대표 RuntimeException 예

 
throw new IllegalArgumentException();
 

잘못된 API 사용
 

42. 예외 전환(Exception Translation)

실무에서 매우 중요.


43. 예시

 
catch(SQLException e) {

    throw new DataAccessException(e);
}
 

44. 왜 중요할까?

하위 기술 예외를:

비즈니스 의미 예외로 변환
 

가능.


45. Spring도 사용

Spring DataAccessException 이 대표적.

JDBC Checked Exception을:

RuntimeException 계열로 변환
 

합니다.


46. 실무에서 자주 하는 실수

1) throws Exception 남발

계층 오염 심함.


2) Checked Exception 과도 사용

코드 복잡도 증가.


3) RuntimeException 무조건 나쁘다고 생각

현대 Spring은 오히려 적극 사용.


4) rollback 정책 이해 부족

트랜잭션 버그 발생 가능.


47. 핵심 비교 정리

항목CheckedUnchecked
컴파일 검사 O X
처리 강제 O X
코드 복잡도 증가 가능 비교적 단순
Spring rollback 기본 X 가능 기본 O
현대 실무 사용 감소 추세 매우 많음

48. 핵심 흐름 요약

Checked
=
복구 가능한 외부 문제

Unchecked
=
비즈니스 실패/개발 오류
 

49. 가장 중요한 핵심 한 줄

현대 Java/Spring 실무에서는
“복구 가능한 예외만 Checked로 고려하고,
대부분은 RuntimeException 기반으로 설계”하는 흐름이 강하다
 

입니다.


50. 정리

Checked vs Unchecked Exception은 단순 문법 차이가 아닙니다.

실제로는:

  • 계층 설계
  • 트랜잭션 rollback
  • Spring 예외 전략
  • Exception Translation
  • 유지보수성

전체와 연결되는 Java/Spring 핵심 설계 개념입니다.

특히 실무에서는:

  • RuntimeException 선호 이유
  • rollback 정책
  • 예외 전환
  • 계층 오염 방지
  • 복구 가능성 기준

을 정확히 이해하는 것이 매우 중요합니다.

다음 글에서는:

try-catch-finally 흐름

을 JVM Stack Unwinding, finally 실행 보장, return 충돌, suppressed exception까지 포함해서 깊게 정리해보겠습니다.

반응형

댓글