Spring Boot에서 값을 return해줄 때 ResponseEntity를 활용하는데, 이에 대해 조금 더 자세하게 공부하고, 더 편하게 사용하기 위해 공부해보았다.
Response Entity
는 HttpEntity
를 상속받아 구현한 클래스이다.
public class ResponseEntity<T> extends HttpEntity<T>
HttpEntity
는 HTTP 요청 혹은 응답에 해당하는 HttpHeader
와 HttpBody
를 포함하는 클래스이다.
ResponseEnitity
는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.
Response Entity의 생성자를 보면, status를 넣고 Response Entity를 만들면 결국 매개변수가 3개인 생성자를 호출해낸다.
public ResponseEntity(HttpStatus status) {
this(null, null, status);
}
public ResponseEntity(@Nullable T body, HttpStatus status) {
this(body, null, status);
}
예를 들어서 다음과 같이 코드를 생성하면 상태코드가 200으로 돌아오는 것을 확인할 수 있다.
@GetMapping("/test")
public ResponseEntity test(){
return new ResponseEntity(HttpStatus.OK);
}
위의 예시에선 Body를 지정해주지 않았기 때문에 돌아오는 Response Body는 없고, status만 200으로 돌아오는 것을 볼 수 있다.
만약 생성자에 데이터를 넣어주면 값이 Body에 담겨 status와 함께 잘 돌아온다.
이를 통해 Body에 적절한 값을 넣어주면 Client측에 응답 값을 잘 전달해 줄 수 있다는 것을 알 수 있다.
이렇게 Reponse Entity를 직접 new로 생성하는 방법도 있지만, ok메소드를 통해 생성할 수도 있다.
ResponseEntity에는 다음과 같은 함수가 있다.
public static <T> ResponseEntity<T> ok(@Nullable T body) {
return ok().body(body);
}
그래서 컨트롤러에서 다음과 같이 값을 설정하면
return ResponseEntity.ok("Message")
body에 “Message”라는 값이 담겨서 보내지게 된다.
이를 활용해서 응답을 보내보자!
ResultDto 클래스를 만들어 상태코드, 메세지, 데이터를 담을 수 있도록 했다.
@Data
@AllArgsConstructor
@Builder
public class ResultDto<T> {
private HttpStatus statusCode;
private String resultMsg;
private T resultData;
public ResultDto(final HttpStatus statusCode, final String resultMsg) {
this.statusCode = statusCode;
this.resultMsg = resultMsg;
this.resultData = null;
}
public static<T> ResultDto<T> res(final HttpStatus statusCode, final String resultMsg) {
return res(statusCode, resultMsg, null);
}
public static<T> ResultDto<T> res(final HttpStatus statusCode, final String resultMsg, final T t) {
return ResultDto.<T>builder()
.resultData(t)
.statusCode(statusCode)
.resultMsg(resultMsg)
.build();
}
}
그리고 result dto가
두 경우 모두 잘 만들어질 수 있도록 method overloading을 했다.
이렇게 하면 이후 컨트롤러에서 간단하게 result를 전달해 줄 수 있다.
@DeleteMapping(value="wallets")
public ResponseEntity<ResultDto<String>> deleteUserWallet(@AuthenticationPrincipal UserAdapter userAdapter, @RequestParam("userWalletIndex") Long userWalletIndex){
Long userIndex = userAdapter.getUser().getId();;
walletService.deleteUserWallet(userIndex, userWalletIndex);
return ResponseEntity.ok(ResultDto.res(HttpStatus.OK, HttpStatus.OK.toString(), "Delete User Wallet SuccessFully"));
}
이렇게 설정하면 다음과 같이 결과값이 온다.