try {
// JDBC 수행
} catch (SQLException e) {
throw new RuntimeException("DB 처리 중 오류 발생", e); // 원인 예외 e 포함
}
Object
▲
Throwable
▲ ▲
Exception Error
Throwable이 가지는 대표적인 자식들
클래스 설명
Exception 예외. 우리가 try-catch 로 잡아서 처리할 수 있음
Error 시스템/VM 문제. 코드로 처리 안 함 (ex. 메모리 부족 등)
왜 Throwable이 따로 있냐?
Exception 과 Error 를 하나로 처리할 수 있게 하려고 만든 최상위 클래스
그래서 catch (Throwable t) 이렇게 쓰면 모든 예외 + 에러까지 다 잡을 수 있어
(하지만 Error는 웬만하면 안 잡는 게 좋음)
주요 메서드
메서드 | 설명 |
---|---|
getMessage() | 예외 메시지를 리턴 |
printStackTrace() | 예외가 어디서 났는지 콘솔에 출력 |
getCause() | 원인 예외 리턴 (다른 예외를 감쌌을 경우) |
toString() | 예외 클래스명 + 메시지 문자열 리턴 |
종류 | 설명 | 예시 |
---|---|---|
Exception | 우리가 자주 쓰는 예외 (파일 못 찾음, DB 오류 등) | IOException , NullPointerException |
Error | 시스템 자체 문제 (메모리 부족 등) → 보통 catch 안 함 | OutOfMemoryError , StackOverflowError |
Throwable | 이 둘의 조상. 모든 예외/에러를 포괄 | catch (Throwable t) 가능 |
구분 | Exception | Error |
---|---|---|
대상 | 네 코드에서 발생하는 예외 | 시스템/JVM 문제 |
예시 | IOException , NullPointerException | OutOfMemoryError , StackOverflowError |
처리 | try-catch 로 처리 권장 | 처리 안 함이 원칙 |
목적 | 복구 가능한 문제 | 복구 불가능한 문제 |
ㄴController단 예외 처리 (@ControllerAdvice, @ExceptionHandler)
1. @RestControllerAdvice 또는 @ControllerAdvice
전역 예외 처리 클래스로 지정하는 어노테이션
@ControllerAdvice + @ResponseBody = @RestControllerAdvice
2. @ExceptionHandler(예외클래스.class)
해당 예외가 발생하면 실행되는 예외 처리 메서드
어노테이션 | 설명 |
---|---|
@ExceptionHandler | 특정 예외를 처리하는 메서드 (컨트롤러 안/밖 모두 사용 가능) |
@ControllerAdvice | 모든 컨트롤러의 예외를 전역적으로 처리 |
@RestControllerAdvice | 위 + API 응답용 (JSON 리턴) |
예 )
List<String> names = List.of("이름1", "이름2", "이름3");
List<String> upperNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList()); // 결과를 List로 수집
자주 쓰는 Collectors
Collectors 메서드 | 결과 타입 | 설명 |
---|---|---|
toList() | List<T> | 리스트로 수집 |
toSet() | Set<T> | 중복 제거 후 수집 |
toMap() | Map<K, V> | 키-값으로 변환 |
joining() | String | 문자열 병합 |
groupingBy() | Map<K, List<V>> | 그룹핑 |
partitioningBy() | Map<Boolean, List<V>> | 조건 기반 분리 |
counting() | Long | 요소 개수 |
summarizingInt() | IntSummaryStatistics | 합계/평균/최대/최소 다 계산 |
.stream() — 컬렉션에서 스트림 꺼낼 때
List, Set, Map.keySet(), Map.entrySet() 같은 컬렉션 객체에서 사용
컬렉션이 이미 있을 때, 스트림 변환용
Stream.of(...) — 스트림을 직접 생성할 때
배열이나 값 나열할 때 바로 스트림 만들고 싶을 때
컬렉션이 없는 경우에도 사용 가능