[Spring] 동적으로 HTTP 상태 코드 설정

 

HTTP 상태 코드란?

HTTP 상태 코드는 특정 HTTP 요청이 어떻게 처리되었는지 알려준다.

기본적으로 응답은 5개의 그룹으로 나누어진다.

  • 1XX: 정보 제공
  • 2XX: 성공
  • 3XX: 리다이렉트
  • 4XX: 클라이언트 에러
  • 5XX: 서버 에러

상태 코드에 대해 더 자세한 내용은 여기로

 

 

그런데 이런 기본적인 상황말고 개발자가 더 많은 상황에 대한 응답을 하고 싶을 수도 있지않을까?

그리고 성공이나 에러와 함께 값도 전달하고 싶다면?

그럴때 사용하는 것이 ResponseEntity이다.

 

ResponseEntity란?

ResponseEntity는 HTTP 응답을 나타내는 Spring Framework의 클래스.

이 클래스는 요청에 대한 응답의 HttpHeader, HttpBody 및 Status Code를 포함하여 클라이언트에게 전달할 수 있는 다양한 기능을 제공한다.

 

ResponseEntity를 사용하여 동적으로 응답하기

 

ResponseEntity를 사용하면 동적으로 HTTP 상태 코드에 body를 설정할 수 있다.

@GetMapping("/custom-response")
public ResponseEntity<String> customResponse() {
    return ResponseEntity.status(HttpStatus.ACCEPTED) // 202 Accepted 반환
                         .body("요청이 접수되었습니다!");
}

 

위 코드에서는 202 Accepted 응답과 함께 메시지가 반환된다.

 

JSON 응답을 반환하는 경우

@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.findUserById(id);
    if (user == null) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); // 404 반환
    }
    return ResponseEntity.ok(user); // 200 OK 반환
}

 

ResponseEntity.ok(user)는 200 OK 응답과 함께 user 데이터를 JSON으로 반환한다.

 

로그인 실패 시 커스텀 응답 코드 반환

 

@PostMapping("/login")
public ResponseEntity<Map<String, Object>> login(@RequestBody LoginRequest request) {
    if (!authService.isValidUser(request)) {
        Map<String, Object> response = new HashMap<>();
        response.put("status", 3001);
        response.put("message", "로그인 실패: 아이디 또는 비밀번호가 잘못되었습니다.");
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response);
    }

    // 로그인 성공
    Map<String, Object> successResponse = new HashMap<>();
    successResponse.put("status", 200);
    successResponse.put("message", "로그인 성공");
    successResponse.put("token", "eyJhbGciOiJIUzI1..."); // JWT 토큰 예시
    return ResponseEntity.ok(successResponse);
}

 

로그인 실패 시 HTTP 200 OK 대신, 401 Unauthorized를 사용하고 응답 바디에 3001이라는 커스텀 코드를 포함한다.

 

사용하는 이유

 

1. HTTP 상태 코드 제어: ResponseEntity를 사용하면 응답에 대한 HTTP 상태 코드를 명시적으로 지정 가능

  • 클라이언트에게 정확한 상태 정보를 제공하는데 도움이 됨

2. 응답 본문 및 헤더 제어: ResponseEntity를 통해 응답 본문과 헤더를 세밀하게 제어할 수 있다.

 

3. 유연성: 일반적인 객체 또는 커스텀 클래스를 응답으로 반환할 수 있으며, Spring은 자동으로 해당 객체를 적절한 형식으로 변환하한다.

 

유연한 응답 처리를 위해서 사용되는 ResponseEntity!

'Spring' 카테고리의 다른 글

[Spring] 관계 매핑 어노테이션  (2) 2025.02.06
[Spring] 스프링 부트 구조 정리  (0) 2025.02.04
[Spring] Bean  (0) 2025.02.04
[Spring] JPA(Java Persistence API)  (0) 2025.02.04
[Spring] IoC, DI, AOP  (0) 2025.02.04