본문 바로가기

카테고리 없음

ResponseEntity And ResponseStatus

데이터는 어떻게 주고 받을까 ?

1. 기본적으로 서버와 클라이언트는 API로 데이터를 주고 받는다.

2. 데이터 요청중 여러가지 경우가 발생한다.

     - 서버에 요청이 성공했을 경우.

     - 서버에 요청이 실패하여 에러가 나는 경우

3. 위와 같은 경우만 하더라도 성공, 실패에 따라 클라이언트는 그 요청이 성공했는지 실패했는지 여부를 판단해야 한다. 그래서 그 판단값을 서버에서 전달해주는데 그게 바로 HttpStatus이다.

( 상태코드란 의미로 사용하며, 200 ok, 400 not found 같은 용어를 들어본적이 있을 것이다 )

 

ResponseEntity ?

1. API는  HttpHeaders와 body(데이터를 담은 값)로 구성되어 있다.

2. 자바에서는 이러한 응답값을 다루기 위한 Class들을 제공한다.

크게 HttpHeaders, body값을 담고 있는 HttpEntity 그리고 이 HttpEntity를 상속하며 추가적으로 HttpStatus값을 가지고 있는 ResponseEntity로 구성되어 있다.

 

1) Httpheaders

HttpHeaders 일부 캡처

HttpHeaders의 실제 소스를 확인해보면, MultivalueMap interface를 구현함으로써 만들어진걸 볼수 있다.

쉽게 말해서, Map형태의 데이터 저장소이며, Key로 String Type, Value로 String Type을 가진다.

따라서, 실제로 데이터의 형태도 Map<"Accept", "Accept">와 같은 형태로 구성된다. 이 class는 API의 메타데이터 정보값을 담는다.

 

다음으로, 해당 Httpheaders를 변수로 가지는 HttpEntity를 확인해보자.

2) HttpEntity

HttpEntity 일부 캡처

HttpEntity는 final 변수인 HttpHeaders와 제네릭타입인 body를 가지고 있다.

보통 자바에서 제네릭이라 함은 특정 타입 (String, int...)등에 종속되지 않고 다양한 타입을 받기 위해 사용하는 경우가 많다. 이 경우도, 확장성을 위해서 다음과 같이 설계한걸로 보인다.

 

마지막으로, ResponseEntity이다.

ResponseEntity Class Diagram

ResponseEntity의 Class Diagram이다. 다음과 같이 HttpEntity를 상속함으로써 구현된걸 확인할수 있다.

( 화살표 방향이 해당 클래스를 구현하였다는 의미이다 )

 

이제 코드를 살펴보자.

ResponseEntity

주의해서 봐야할 부분은, private final 변수인 status를 가졌다는 점이다. 이 status가 위에서 말한, API의 성공, 실패를 가르는 판단값이다.

해당값에 Http상태값을 나타내는 코드를 넣어 그 값을 클라이언트에 보내 클라이언트단에서 해당값을 처리하게끔 하는 것이다.

 

Http상태값은 org.springframework:spring-web:버전 library에 정의되어 있다. 실제로 해당 enum 파일인 HttpStatus를 확인할수 있다.

어찌 됬든 지금까지, ResponseEntity를 구성하는 요소들과 특지 HttpStatus(상태값)에 대해서 알아보았다.

이제 실제로 ResponseEntity와 ResponseStatus Annotation의 차이에 대해 알아보자.

 

ResonseStatus Annotation

ResponseEntity는 HttpStatus와 HttpHeader, body로 구성되어 있다.

HttpStatus는 다른 방식으로 표현이 가능한데, ResponseStatus Annotation을 Method에 추가하는것이 그 방법이다.

 

보통, 응답값을 내려주는 class Method위에 추가 가능한데 이럴경우 반환하는 body를 감싸 해당 annotation에 정의된 HttpStatus값을 같이 매핑하여 응답값으로 전달한다.

( class Method단에서 반환하는 body에 더해, ResponseStatus에 정의된 HttpStatus를 추가할수 있다. )

 

ResponseEntity  vs ResonseStatus Annotation

ResponseEntity를 사용한 첫번째 예제
ResponseStatus를 사용한 두번째 예제

첫번째의 경우는, HttpStatus를 code단에서 생성하여 응답값으로 ResponseEntity class를 반환하고 있다.

두번째의 경우는, ResponseStatus Annotation에 HttpStatus를 전달하고 응답값으로는 body값인 Map값만 반환하고 있다.

물론, 첫번째와 두번째의 응답값은 당연히 같다.

 

ResonseStatus Annotation이 과연 어떻게 처리 되길래 같은 응답값을 반환할까 ?

AOP처리가 된다. 추후 작성.

 

어떤 상황에 사용해야 할까 ?

1. 일반적인 상황에서는 당연히 ResponseEntity를 사용해야 한다.

왜냐면, ResponseStatus Annotation은 Header값을 조작하고 수정할수 있는 기능이 존재하지 않는다. 당연히 Custom Annotation도 넣을수가 없다.

 

2. 하지만, Custom Header를 생성하지 않는다면 HttpsStatus Annotation을 사용하면 코드량을 줄일수 있고 명시적으로 가독성을 높일수는 있다.

따라서, 해당 상황에서는 사용하는게 더 나은 판단일수 있다.

 

HttpStatus Annotation은 실제로 어디서 사용될까  ?

 

 

 

따라서, 결론적으로 상황을 보고 각자 상황에 맞게 사용하는것이 맞을것 같다.

 

 

출처 : https://joojimin.tistory.com/54