예외처리 파고들기
ControllerAdvice와 RestControllerAdvice의 차이 :
@RestControllerAdvice는 @ResponseBody가 붙어 있어 응답을 Json으로 내려준다
그렇다면 orElseThrow 와 ResponseEntity... 중 어떤게 더 효율적일까?
| 구분 | return ResponseEntity.status(...).body(...) | orElseThrow(() -> new BusinessException(...)) |
| 처리 위치 | Controller (응답을 직접 제어) | Service (로직에만 집중) |
| 코드 스타일 | if-else 문이 많아져 코드가 길어짐 | 한 줄로 처리되어 가독성이 좋음 |
| 유지보수 | 에러 응답 형식이 바뀌면 모든 컨트롤러를 수정해야 함 | Advice 클래스 한 곳만 수정하면 전체 적용됨 |
| 주요 용도 | 간단한 프로젝트, 혹은 컨트롤러에서 즉시 끝낼 때 | 실무/대규모 프로젝트에서 공통 에러 처리 시 |
orElseThrow 방식의 장점 :
1. 서비스 레이어에서 예외만 알리면 됨. 간편.
2. 트랜잭션 - RuntimeException을 던지면 진행중이던 DB작업이 롤백된다. return을 보내면 반영될 위험이 있음.
3. 가독성: if-else 간소화
전체적인 흐름 :
1. 서비스 레이어에서 문제 발생
2. 예외(Throw) BusinessException 실행
흐름 중단: 예외가 발생하는 즉시 이후의 코드는 실행되지 않고, 호출 스택을 따라 예외가 위로 던져짐
3. @RestControllerAdvice가 장착된 GlobalExceptionHandler가 이 예외를 감지하고 낚아챈다
-------
제네릭(Generic)
- 다양한 데이터 타입을 보관해야 할 때
--Object 타입으로 만들면 반환된 값을 매번 타입캐스팅해야 하므로 안정성 문제가 존재한다.
---제네릭 클래스를 사용하여 인스턴스 생성시 타입을 지정