일기장

@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
profile

일기장

@공군급양

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!