[Spring Boot] Response Entity 사용해서 결과값 return 해주기

zooju·2023년 3월 16일
2

Spring Boot에서 값을 return해줄 때 ResponseEntity를 활용하는데, 이에 대해 조금 더 자세하게 공부하고, 더 편하게 사용하기 위해 공부해보았다.

1. Response Entity란?

Response EntityHttpEntity를 상속받아 구현한 클래스이다.

public class ResponseEntity<T> extends HttpEntity<T>

HttpEntity는 HTTP 요청 혹은 응답에 해당하는 HttpHeaderHttpBody를 포함하는 클래스이다.

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”라는 값이 담겨서 보내지게 된다.

이를 활용해서 응답을 보내보자!

2. ResponseEntity를 사용해서 클라이언트에게 응답 보내기

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가

  • 상태코드와 result msg
  • 상태코드와 result msg와 result data

두 경우 모두 잘 만들어질 수 있도록 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"));
    }

이렇게 설정하면 다음과 같이 결과값이 온다.

Reference.

https://devlog-wjdrbs96.tistory.com/182

profile
이것 저것 새로운 분야에 관심이 많은 서버 개발자

0개의 댓글