@ResponseStatus
`@ResponseStatus`는 스프링에서 제공하는 어노테이션으로, HTTP 상태 코드와 예외 클래스를 연결시켜 줍니다. 이 어노테이션을 이용하면 예외 발생 시 원하는 HTTP 상태 코드와 메시지를 클라이언트에게 반환할 수 있습니다.
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource Not Found")
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
위 예제에서 `ResourceNotFoundException` 은 제가 정의한 커스텀 예외 클래스 입니다. `@ResponseStatus` 어노테이션을 이용하여 HTTP 상태 코드 404와 "Resource Not Found"라는 메시지를 지정하였습니다.
아래는 HTTP의 상태코드들을 정리해둔 표입니다. 개발자는 상황에 맞는 적절한 상태코드를 부여해야합니다.
HttpStatus | 상태코드 | 설명 |
OK |
200 | 정상 처리됨 |
CREATED |
201 | 리소스 생성됨 |
NO_CONTENT |
204 | 컨텐츠 없음 |
BAD_REQUEST |
400 | 잘못된 요청 |
UNAUTHORIZED |
401 | 인증 필요 |
FORBIDDEN |
403 | 접근 금지, 권한 없음 |
NOT_FOUND |
404 | 알 수 없는 URL |
METHOD_NOT_ALLOWED |
405 | 메서드 허용되지 않음 |
NOT_ACCEPTABLE |
406 | 요청 형식 불가 |
CONFLICT |
409 | 리소스 충돌 |
INTERNAL_SERVER_ERROR |
500 | 내부 서버 오류 |
NOT_IMPLEMENTED |
501 | 아직 구현되지 않음 |
예외 발생시키기
@RestController
public class MyController {
private final ResourceService resourceService;
@GetMapping("/resource/{id}")
public String detail(Model model, @PathVariable String id) {
// 서비스 파일의 메서드를 이용하여 DB 조회를 함
Resource resource = resourceService.getResource(id);
// 만약 id값에 따른 DB 데이터가 없을 경우, 만들어둔 커스텀 예외를 던짐
// 여기서는 컨트롤러에서 예외를 던졌지만 서비스에서 해주는 편이 좋음
if (resource == null) {
throw new ResourceNotFoundException("Resource with id " + id + " not found");
}
// 모델을 이용하여 자바 객체를 뷰에 전달함
model.addAttribute("resource", resource);
return "resource_detail";
}
}
`ResourceNotFoundException` 예외가 발생하면 클라이언트에게는 404 상태 코드와 "Resource Not Found" 메시지가 반환됩니다.
예외 클래스에서 메시지 설정하기
상태 코드 외에도 예외 메시지도 동적으로 설정할 수 있습니다. 이를 위해 `@ResponseStatus`에서 `reason` 필드를 생략하면 됩니다.
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
이제 예외를 생성할 때 전달된 message가 HTTP 응답에 포함됩니다.
throw new ResourceNotFoundException("Resource with id " + id + " not found");
'웹개발' 카테고리의 다른 글
TDD (0) | 2023.09.26 |
---|---|
사용자 인증 (0) | 2023.09.22 |
타임리프를 통한 템플릿 상속 (0) | 2023.08.12 |
서비스(Service) (0) | 2023.08.08 |
리다이렉트, 포워드 (0) | 2023.08.08 |