본문 바로가기
코딩 공부/web & Java

[Spring] ResponseEntity

by 현장 2023. 11. 7.

ResponseEntity

Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재합니다. 이것은 HTTP 요청(Request) 또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스입니다. 

 

public class HttpEntity<T> {
    public static final HttpEntity<?> EMPTY = new HttpEntity();
    
    private final HttpHeaders headers;
    @Nullable
    private final T body;
    
    // ...
}

 

Response header 에는 웹서버가 웹브라우저에 응답하는 메시지가 들어있고, Reponse body에 데이터 값이 
들어가 있습니다.

 

HttpEntity 클래스를 상속받아 구현한 클래스가 RequestEntityResponseEntity 클래스입니다. ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이므로 HttpStatus, HttpHeaders, HttpBody를 포함합니다. 

public class ResponseEntity<T> extends HttpEntity<T> {
    private final Object status;

    public ResponseEntity(HttpStatusCode status) {
        this((Object)null, (MultiValueMap)null, (HttpStatusCode)status);
    }

    public ResponseEntity(@Nullable T body, HttpStatusCode status) {
        this(body, (MultiValueMap)null, (HttpStatusCode)status);
    }

    public ResponseEntity(MultiValueMap<String, String> headers, HttpStatusCode status) {
        this((Object)null, headers, (HttpStatusCode)status);
    }

    public ResponseEntity(
    @Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatusCode status) {
        this(body, headers, (Object)status);
    }
    
    //...
}

구현된 클래스를 살펴보면, 이런 식으로 <바디, 헤더, 상태코드> 순의 생성자가 만들어지는 걸 확인할 수 있습니다.

 

예시 코드

@RestController
public class UserResource {
    @GetMapping("user")
    public ResponseEntity<Object> testUser() {
        return ResponseEntity.ok().build();
    }
}

위 코드를 사용하여 Talend API Tester를 사용하연 아래 사진과 같이 200코드가 나오게 됩니다.

 

@PostMapping("/users")
    public ResponseEntity<Object> createUser(@Valid @RequestBody User user) {
        User saveUser = service.save(user);

        // 새로 만들어진 유저(ex. /users/{id} (user.getId())) 반환 -> location 헤더를 통해서 가능
        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(saveUser.getId())
                .toUri();

        return ResponseEntity.created(location).build();
    }

이와 같이 create를 사용하면 

201코드도 띄울 수 있습니다.

 

응답 상태코드
- 100 - 109
- 200 - 206
- 300 - 305
- 400 - 415
- 500 - 505

API 개발 시 올바른 상태코드를 응답하는 것은 매우 중요합니다. 예를 들어, 사용자가 요청 파라미터를 잘못 입력한 경우에  잘못된 파라미터로 인해 비즈니스 로직에서 에러가 발생했다고 해서 500 코드를 반환하면 안 됩니다. 사용자가 잘못 입력한 경우이므로 403 코드를 반환해야 합니다.

 

결론

ResponseEntity 클래스를 사용하면, 결과값, 상태코드, 헤더값을 모두 프론트에 넘겨줄 수 있고, 에러코드 또한 섬세하게 설정해서 보내줄 수 있다는 장점이 있습니다.

 

Reference

'코딩 공부 > web & Java' 카테고리의 다른 글

[Docker] Docker  (0) 2023.11.08
[Spring] RequestParam과 PathVariable  (0) 2023.11.07
[Spring] 전역 예외 처리  (0) 2023.11.04
[Spring] @Controller와 @RestController  (0) 2023.11.04
[Spring] Spring Security  (0) 2023.10.26