응답 데이터를 포함하는 ResponseEntity
ResponseEntity를 알아보기 이전에, 이것이 어디서부터 온 것인지를 먼저 알아볼 예정이다.
ResponseEntity는 어디서 왔을까?
ReponseEntity는 Spring Framework에서 제공하는 HttpEntity 클래스
(Http 요청과 응답에 해당하는 HttpHeader, HttpBody를 포함)를 상속받아 구현한 클래스가 바로
RequestEntity, ResponseEntity이다.
public class HttpEntity<T> {
private final HttpHeaders headers;
@Nullable
private final T body;
}
public class RequestEntity<T> extends HttpEntity<T>
public class ResponseEntity<T> extends HttpEntity<T>
ReponseEntity란?
ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스로
HttpStatus/HttpHeaders/HttpBody를 포함한다.
이는 HTTP 응답을 빠르게 만들어주기 위한 객체로 @ResponseBody와 달리
객체로 사용되어 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해준다.
* @ResponseBody의 경우에는 Header에 대해 유연하게 설정을 할 수 없지만,
@ResposeEntity에서는 필드 타입으로 HttpHeaders를 가지고 있어 Header 설정이 가능하다.
* 이는 HTTP에 대해 이해를 하고 있으면 좋다.
@RestController
public class AccountController {
@Autowired
private AccountService accountService;
@PostMapping("/makeAccount")
public ResponseEntity<String> makeAccount(@RequestBody Account account) {
try{
accountService.makeAccount(account);
return new ResponseEntity<String>("계좌가 개설되었습니다.", HttpStatus.CREATED);
}catch (Exception e){
e.printStackTrace();
return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
위와 같은 코드의 예시가 있다고 해보자. 위의 코드는 계좌를 개설하기 위한 코드이다.
여기서 ResponseEntity<String> 으로 클래스를 지정해주었고,
이에 대한 리턴으로 return new ResponseEntity ("계좌가 개설되었습니다.", HttpStatus.CREATED); 이 리턴된 것을 볼 수 있다.
ResponseEntity는 Status/Body/Header를 담아서 보낼 수 있고, 이 중 Status, Body를 담아서 보낸 것이다.
Status는 202 OK(생성), Body에는 String 타입의 문자열이 보내졌다.
이를 보았을 때 ResponseEntity에 리턴 Body에 대한 타입 지정이 가능하다는 것을 볼 수 있다.
그렇다면 왜 ResponseEntity를 사용해야 하는것일까?
이를 답하기 위해서는 Rest API를 만들어야 하는 이유를 알아야 하는데,
Rest API를 만드는 이유는 Client Side를 정형화된 플랫폼이 아닌 플랫폼에 제약을 두지 않는 것을 목표로 했기 때문에
Client에서 XML, JSON과 같은 객체로 치환 가능한 형태의 데이터 통신을 지향하게 되었다.
HTTP Response 규약을 지키면서(표준을 지키지 않을 경우 개발 속도가 저하되며, HTTP Status 코드 응답에 에러 발생)
Controller에서 결과를 반환할 때 ResponseEntity 객체를 이용해 규약에 맞는 HTTP Response를 반환해야 하는 것이다.
'공부 자료 > Spring' 카테고리의 다른 글
[Spring] Getter/Setter를 지양하자? (1) | 2023.11.21 |
---|---|
[Spring] CORS란? (CORS에 대해 알고 설정하기) (2) | 2023.11.20 |
[MyBatis/Spring] About @Mapper/@Repository (0) | 2023.11.13 |
[Springframework] Naver API를 이용한 회원가입 및 로그인 (1) | 2023.11.11 |
[Spring Boot] SpringBoot에서 JSP 사용하기 (0) | 2023.11.10 |