Programming/Java
[JAVA] Exception보다 RuntimeException을 상속받는 게 좋은 이유
아이바
2025. 2. 21. 09:55
현재 CouponBoxException은 Exception을 상속받고 있어.
하지만 특별한 이유가 없다면 RuntimeException을 상속받는 게 더 유리한 경우가 많아.
이유는 다음과 같아.
📌 1. Exception은 체크 예외 (Checked Exception)
java
복사편집
public class CouponBoxException extends Exception { // Checked Exception
- Exception을 상속받으면 Checked Exception이 돼서,
모든 호출하는 곳에서 try-catch 또는 throws를 강제해야 함. - 불필요한 예외 처리가 많아져 코드가 복잡해질 수 있음.
📌 Checked Exception의 단점 예시
java
복사편집
public void processCoupon() { try { throw new CouponBoxException(CouponBoxStatusCode.INVALID_COUPON); } catch (CouponBoxException e) { // 반드시 예외를 처리해야 함 (강제됨) System.out.println("쿠폰 예외 발생: " + e.getMessage()); } }
✔ 매번 try-catch가 강제되므로, 코드가 지저분해질 가능성이 큼.
📌 2. RuntimeException은 언체크 예외 (Unchecked Exception)
java
복사편집
public class CouponBoxException extends RuntimeException { // Unchecked Exception
- RuntimeException을 상속받으면 Unchecked Exception이 돼서,
호출하는 곳에서 try-catch를 강제하지 않음. - 예외가 발생하면 런타임 시점에 자연스럽게 전파됨.
- 필요할 때만 try-catch를 사용할 수 있음.
📌 Unchecked Exception의 장점 예시
java
복사편집
public void processCoupon() { throw new CouponBoxException(CouponBoxStatusCode.INVALID_COUPON); } // 예외 처리가 필요하면 컨트롤러 레벨에서 한 번만 처리 가능 @ExceptionHandler(CouponBoxException.class) public ResponseEntity<String> handleCouponException(CouponBoxException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); }
✔ 예외 처리를 강제하지 않으면서, 한 곳에서만 효율적으로 처리할 수 있음.
📌 3. 스프링과 같은 프레임워크에서 Unchecked Exception이 더 유리
- 스프링에서는 @ExceptionHandler, @ControllerAdvice 등을 활용해 전역 예외 처리를 많이 함.
- Unchecked Exception이면, 서비스 레이어에서 예외를 던지기만 하면 되고, 컨트롤러 단에서 한 번에 처리 가능함.
- Checked Exception을 쓰면 모든 메서드에 throws를 붙이거나 try-catch를 해야 해서 불편함.
📌 결론: 특별한 경우가 아니면 RuntimeException을 쓰는 게 더 좋음!
✅ Checked Exception (Exception 상속)
- 반드시 try-catch 또는 throws가 필요함 → 코드가 복잡해질 수 있음.
- 파일 I/O, 네트워크 에러처럼 반드시 처리해야 하는 예외에 적합.
✅ Unchecked Exception (RuntimeException 상속)
- try-catch 강제가 없고, 예외가 전파됨 → 코드가 간결해짐.
- 대부분의 비즈니스 로직 예외는 RuntimeException을 쓰는 게 유리함.
- 스프링의 전역 예외 처리 (@ExceptionHandler)와 잘 어울림.
👉 그래서 CouponBoxException도 RuntimeException을 상속받는 게 더 적절해! 🚀
728x90