티스토리 뷰
JAVA/SpringBoot
Spring boot - @ControllerAdvice, @ExceptionHandler를 사용하여 전역 예외처리
realizers 2021. 12. 11. 16:29728x90
반응형
@ControllerAdvice란?
- @ControllerAdvice란 모든 Controller에서 발생할 수 있는 예외를 잡아 처리해주는 어노테이션입니다.
@ExceptionHandler란?
- @ExceptionHandler란 @Controller, @RestController 어노테이션이 적용된 Bean 내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리를 해주는 기능입니다.
- Contoller, RestController에서만 적용이 가능합니다.(@Service 같은 빈에서는 적용이 안됩니다.)
예제
- 해당 예제는 DB에 Insert시 query문에서 오타가 있어서 DB에 저장이 안되고 nested exception is java.sql.SQLSyntaxErrorException 와 같은 예외를 발생시킵니다.
- 여기서 Service단에서 예외가 발생했는데 어떻게 @ControllerAdvice가 잡아주는거지? @ControllerAdvice는 Controller에서 발생하는 예외를 잡아주는거 아닌가? 라고 생각할 수 있습니다.
- Service안에서 Exception이 발생하는데 이 메서드를 호출하면 서비스에서 예외가 발생했지만 결국 컨트롤러 내에서 발생한 것과 동일하므로 ExceptionHandler가 잡아낼 수 있게됩니다.
Controller
@RequestMapping("/notice")
@RestController
@RequiredArgsConstructor
public class NoticeController {
private final NoticeService noticeService;
@PostMapping("add")
public Map addNotice(@Valid NoticeAddDto noticeAddDto){
return noticeService.addNotice(noticeAddDto);
}
}
Service
@Service
@RequiredArgsConstructor
public class NoticeService {
private final NoticeMapper noticeMapper;
public Map addNotice(NoticeAddDto noticeAddDto) {
Map<String, Object> result = new HashMap();
NoticeDao noticeDao = new NoticeDao();
noticeDao.setNoticeStatus(noticeAddDto.getNoticeStatus());
noticeDao.setKind(noticeAddDto.getKind());
noticeDao.setTitle(noticeAddDto.getTitle());
noticeDao.setContent(noticeAddDto.getContent());
noticeDao.setRegisterId(noticeAddDto.getRegisterId());
noticeMapper.insertNotice(noticeDao); // insert 시 오류 발생
result.put("addNotice", noticeAddDto);
return result;
}
}
ErrorResponse
@Setter
@Getter
public class ErrorResponse {
private int code = HttpStatus.BAD_REQUEST.value();
private Object error;
public ErrorResponse(int code, Object error) {
this.code = code;
this.error = error;
}
}
ExceptionController
@ControllerAdvice
public class ExceptionController {
/**
**** Servic 단에서 SQ에 예외가 발생했을 때
**/
@ExceptionHandler({SQLException.class, DataAccessException.class})
@ResponseBody
public ResponseEntity<ErrorResponse> handleSQLException(Exception e){
ErrorResponse errorResponse = new ErrorResponse(500, "DB 접속 오류가 발생했습니다. DB정보를 다시 확인해주세요.");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
728x90
반응형
'JAVA > SpringBoot' 카테고리의 다른 글
Spring boot - log4j2 를 사용하여 로그남기기 (0) | 2022.03.11 |
---|---|
Spring boot - Spring Security에 대하여 (0) | 2022.02.22 |
Spring boot - Exception Handling (0) | 2022.02.01 |
Spring boot - security-jwt 연동과 흐름(feat.AccessToken, RefreshToken) (10) | 2021.12.25 |
Spring boot - @Valid, @ControllerAdvice를 사용하여 유효성 검사 (0) | 2021.12.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 공간 기반 아키텍처
- pipeline architecture
- space based architecture
- redis sorted set
- 서비스 기반 아키텍처
- java userThread와 DaemonThread
- @ControllerAdvice
- java ThreadLocal
- redis 대기열 구현
- 레이어드 아키텍처란
- spring boot excel download oom
- spring boot excel download paging
- spring boot 엑셀 다운로드
- spring boot redisson 분산락 구현
- service based architecture
- 트랜잭셔널 아웃박스 패턴 스프링부트
- 자바 백엔드 개발자 추천 도서
- spring boot redisson sorted set
- 람다 표현식
- transactional outbox pattern
- microkernel architecture
- spring boot poi excel download
- polling publisher spring boot
- redis sorted set으로 대기열 구현
- pipe and filter architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot redis 대기열 구현
- transactional outbox pattern spring boot
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- spring boot redisson destributed lock
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함