Java에서는 예외 상황이 발생했을 때 return으로 값을 반환하기보다 Exception을 발생시키는 것이 일반적이다.
Spring도 메서드가 정상적으로 return되면 정상적으로 작업이 완료된 것으로 판단한다.
왜 Exception을 사용할까?
예를 들어 회원을 조회한다고 가정해 보자.
public Member findMember(Long id) {
if (id < 0) {
throw new IllegalArgumentException("id는 0 이상이어야 합니다.");
}
...
}
id가 잘못된 값이라면 메서드를 계속 실행하는 것보다 즉시 예외를 발생시키는 것이 안전하다.
예외가 발생하면 메서드 실행이 즉시 중단되고, 호출한 곳에서도 문제가 발생했다는 사실을 명확하게 알 수 있다.
return은 정상 종료
아래 메서드는 정상적으로 종료된 것으로 처리된다.
public void save() {
return;
}
하지만 아래처럼 Exception이 발생하면 Spring은 작업이 실패한 것으로 판단한다.
특히 @Transactional이 적용된 메서드라면 RuntimeException이 발생했을 때 트랜잭션이 Rollback된다.
public void save() {
throw new RuntimeException();
}
자주 사용하는 Exception
| Exception | 사용 시점 |
| IllegalArgumentException | 잘못된 인자가 전달된 경우 |
| IllegalStateException | 객체의 현재 상태가 올바르지 않은 경우 |
| NullPointerException | null 객체를 참조한 경우(직접 던리는 경우는 거의 없음) |
| NoSuchElementException | 원하는 데이터를 찾지 못한 경우 |
| IndexOutOfBoundsException | 배열이나 List의 범위를 벗어난 경우 |
| UnsupportedOperationException | 지원하지 않는 기능을 호출한 경우 |
| ArithmeticException | 0으로 나누기 등의 산술 오류 |
| RuntimeException | 적절한 예외가 없을 때 사용하는 부모 예외 |
상황에 맞는 Exception
예외를 던질 때는 의미가 맞는 Exception을 사용하는 것이 좋다.
throw new IllegalArgumentException();
만 봐도 "잘못된 인자가 전달되었구나." 라는 것을 바로 알 수 있다.
throw new RuntimeException();
만 사용하면 어떤 문제가 발생했는지 의미를 파악하기 어렵다.
따라서 적절한 Exception이 있다면 그 Exception을 사용하는 것이 좋다.
적절한 Exception이 떠오르지 않는다면 RuntimeException을 사용한다.
예외 메시지
예외를 발생시킬 때는 메시지도 함께 작성하는 것이 좋다.
throw new IllegalArgumentException("회원 ID는 0 이상이어야 합니다.");
로그를 확인하거나 디버깅할 때 원인을 빠르게 파악할 수 있다.
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] HTML Form을 이용해 게시글 작성하기 (0) | 2026.08.10 |
|---|---|
| [Spring] @PathVariable vs @RequestParam 차이와 사용 기준 (0) | 2026.08.07 |
| [Spring] @Transactional이 내부 호출에서 동작하지 않는 이유 (0) | 2026.08.07 |
| [Spring] JPA 메서드 명명 규칙(Query Method) (0) | 2026.08.07 |
| [Spring] Proxy란? @Transactional과 @Lazy가 동작하는 원리 (0) | 2026.08.06 |
댓글