스프링 SneakyThorws에 관하여

dropKick·2024년 2월 23일

개발 이슈

목록 보기
12/14

개요

  • 배치 서비스 구현을 위해 Scheduled Task를 구현하던 중 @SneakyThrows를 통해 예외 처리하는 것을 확인
  • 어떤 용도이고, 왜 쓰고, 언제 써야하는건지 알아봄

@SneakyThrows

✅ Lombok에서 제공하는 어노테이션
✅ 컴파일러 수준에서 try-catch 또는 throws 선언 없이 예외를 던질 수 있도록 지원 (예외 처리 불필요)
✅ 런타임 예외(RuntimeException)가 아닌, 컴파일 시점 체크 예외(Checked Exception)도 예외 처리를 생략 가능

구현

try-catch 예외 처리 구현

public void runTask() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e); // 예외 처리
    }
}

@SneakyThorws

import lombok.SneakyThrows;

@SneakyThrows
public void runTask() {
    Thread.sleep(1000); // 컴파일러가 자동으로 예외 처리
}

ScheuledTask에서 @SneakyThrows를 사용하는 이유

  • Spring @Scheduled 메서드는 void 타입, throws 선언 불가
  • @Scheduled 내부에서 Checked Exception을 던지려면 반드시 try-catch가 필요
  • @SneakyThrows를 사용하면 try-catch 없이 예외를 처리 가능
@Scheduled(fixedRate = 5000)
@SneakyThrows
public void scheduledTask() {
    throw new IOException("Checked Exception 발생"); // 자동으로 예외 처리
}

@SneakyThrows를 언제 쓰면 좋을까?

✅ try-catch가 없어도 명확한 예외인 경우 (예외를 명확히 명시하지 않아도 되는 경우)
@Scheduled 같은 throws 선언이 불가능한 메서드인 경우
✅ Checked Exception을 강제로 Unchecked Exception처럼 사용하고자 하는 경우
✅ 람다식 내부에서 컴파일 예외를 처리해야하는 경우

결론적으로 throws로 예외를 선언 가능할 경우는 무조건 try-catch를 이용하여 명확하게 예외를 명시하는게 좋음

profile
안아줘요

0개의 댓글