ResponseEntity

ryudjae
|2021. 8. 25. 02:29
728x90

➡️ResponseEntity란?

SpringFrameword에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. 이것은 HTTP 요청(request) 또는 응답(response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다.

1
2
3
4
5
6
7
public class HttpEntity<T> {
 
    private final HttpHeaders headers;
 
    @Nullable
    private final T body;
}
cs

 

1
2
3
public class RequestEntity<T> extends HttpEntity<T>
 
public class ResponseEntity<T> extends HttpEntity<T>
cs

ResponseEntity와 RequestEntity는 HttpEntity를 상속 받는다. 따라서 RepsonseEntity는 사용자의 HttpRequest에 대한 Response데이터를 포함하는 클래스이다. 그러므로 HttpStaus,HttpHeader,HttpBody를 포함한다.

ResponseEntity의 생성자를 보면 this()를 통해서 매게변수가 3개인 생성자를 호출해 결국인 아래에 보이는 매게변수가 3개인 성성자로 가게된다.

1
2
3
4
5
6
7
8
public ResponseEntity(HttpStatus status) {
    this(nullnull, status);
}
 
public ResponseEntity(@Nullable T body, HttpStatus status) {
    this(body, null, status);
}
 
cs

 

지금부터 간단한 예제로 보자

 

1
2
3
4
5
6
7
8
9
10
@RestController
public class BasicController {
 
    @GetMapping("/test")
    public ResponseEntity getUser(){
        return new ResponseEntity(HttpStatus.OK);
    }
}
 
 
cs

위처럼 컨트롤러를 작성한 뒤 포스트맨으로 요청을 해보면 상태코드가 200으로 나온다.

 

그리고 상태코드(status),헤더(header) ,응답데이터(ResponseData)를 담는 생성자도 존재한다.

1
2
3
4
5
6
7
8
9
10
public class ResponseEntity<T> extends HttpEntity<T> {
    
    public ResponseEntity(@Nullable T body, 
@Nullable MultiValueMap<StringString> headers,
  HttpStatus status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.status = status;
    }
}
cs
     

위 생성자처럼 ResponseEntity를 이용해서 클라이언트에게 응답을 보내는 예제를 한번 해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
public class Message {
    private Status status;
    private String message;
    private Object data;
 
    public Message() {
        this.status = Status.BAD_REQUEST;
        this.data = null;
        this.message = null;
    }
}
 
cs

상태코드,메시지,데이터를 담을 필드를 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public enum Status {
 
    OK(200"OK"),
    BAD_REQUEST(400"BAD_REQUEST"),
    NOT_FOUND(404"NOT_FOUND"),
    INTERNAL_SERER_ERROR(500"INTERNAL_SERVER_ERROR");
 
    int statusCode;
    String code;
 
    Status(int statusCode, String code) {
        this.statusCode = statusCode;
        this.code = code;
    }
}
 
cs

상태코드를 몇가지만 enum클래스로 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RestController
public class BasicController {
 
    @GetMapping("/test/{id}")
    public ResponseEntity<Message> getUser(@PathVariable Long id){
        User user = User.builder()
                .email("r213213@Test.com")
                .nickname("aa")
                .phone("00011111111")
                .build();
        Message message = new Message();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(new MediaType("application","json", Charset.forName("UTF-8")));
 
        message.setStatus(Status.OK);
        message.setMessage("성공ㅋ");
        message.setData(user);
        return new ResponseEntity<>(message,httpHeaders,HttpStatus.OK);
    }
}
 
cs

그리고 위와 같이 Controller를 하나 만든 후에, id를 통해서 User를 가져오고 Message 클래스를 통해서 StatusCode, ResponseMessage, ResponseData를 담아서 클라이언트에게 응답을 보내는 코드이다.

아래는 컨트롤러를 작성한대로 포스트맨으로 실행해본 결과이다.

data부분은 내가 따로 만든 User클래스이고, 값도 다 안넣어서 null이 나온다. 그래서 컨트롤러에서 따로 넣은 부분만 확인이 가능하다.이런식으로 상태,메시지,데이터가 잘 응답하는것을 볼 수 있다.

 

일단 이렇게 ResponseEntity에서 기본적인 내용만 알아봤는데 이 내용을 이해할려면 RestApi를 공부를 조금이라도 한 상태에서 보면 더 이해가 잘될것이다.

아직 저도 RestApi에 대해 공부하는 중이라 잘못된 내용이 있을수도 있습니다.과감하게 피드백 주시면 감사하겠습니다.

 

 


REFERENCE

RestAPI

728x90

'Dev > Spring' 카테고리의 다른 글

[Spring] 어노테이션으로 로그인 여부 확인(Interceptor)  (0) 2021.09.21
[Spring] AOP(Aspect Oriented Programming)  (0) 2021.09.10
@Transactional  (1) 2021.08.24
Spring REST Docs  (0) 2021.08.23
DAO,DTO,Entity Class  (0) 2021.08.13