[영상후기] [10분 테코톡] 제제의 ResponseBody vs ResponseEntity

박철현·2024년 8월 8일
0

영상후기

목록 보기
149/160

movie

@ResponseBody, ResponseEntity란 무엇인가?

Web Service

  • HTTP : 수 많은 정보를 요청하고 응답하는 형식
  • Spring에서는 응답값을 빠르게 생성할 수 있도록 도와줌

@ResponseBody

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
  • Body에 들어오는 값을 직렬화 하는 어노테이션
  • 직렬화 : 현재의 데이터를 네트워크에서 송/수신 가능하도록 변경하는 것

ResponseEntity

public class ResponseEntity<T> extends HttpEntity<T> {

	private final Object status;
  • headers와 body로 이뤄진 HttpEntity class를 상속받은 class이면서 상태 코드가 붙어있는 class
  • ResponseBody가 먼저 만들어진 기술

@ResponseBody, ResponseEntity는 어떻게 다르게 동작하는가?

Dispatcher Servlet

  • Handler Adapter에는 많은 종류가 있으나 이 중 RequestMappingHandlerAdapter를 설명
  • 동작 흐름
    1. POST 요청 -> HandlerAdapter로 요청 들어옴
    POST /reservations 1.1
    ...
    date : "2024-05-16"
    themeId: "3"
    timeId : "3"
    1. Argument Resolver가 컨트롤러에 맞는 파라미터값 생성 -> Handler로 넘겨줌
    • ReservationRequestDTO 를 만들어서 Handler로 넘겨줌
    1. Handler에서는 로직 처리 후 응답값이 있으면 ReturnValueHandler로 전달

ArgumentResolver

  • supportsParameter()
    • 조건 체크 - LoginMember 타입 체크
  • resolveArgument()
    • 수행 - LoginMember 반환

ReturnValueHandler

  • supportsReturnType()
    • 리턴타입이 맞는지 체크
  • handleReturnValue()
    • 응답값 처리

@ResponseBody, ResponseEntity의 차이점 발견

  • ReturnValueHandler의 서로 다른 구현체를 사용하고 있음
    • RequestResponseBodyMethodProcessor
    • HttpEntityMethodProcessor

HandlerMethodReturnValueHandlerComposite

	@Nullable
	private HandlerMethodReturnValueHandler selectHandler(@Nullable Object value, MethodParameter returnType) {
		boolean isAsyncValue = isAsyncReturnValue(value, returnType);
        // 여러 종류의 ReturnValueHandler 구현체
		for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
			if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
				continue;
			}
			if (handler.supportsReturnType(returnType)) {
				return handler;
			}
		}
		return null;
	}
  • handler를 선택하기 위한 메서드
    • for문 내부 여러 종류의 ReturnValueHandler 구현체(15개)
    • supportsReturnType이 성립하면 반환하는 형태

@ReponseBody 만 사용했을 때

  • RequestResponseBodyMethodProcessor 라는 구현체

ResponseEntity를 사용했을 때

  • HttpEntityMethodProcessor 라는 구현체

정리

  • ReturnValueHandler 구현체 차이가 있을뿐 동일한 메커니즘에 의해 HTTP 응답 생성
    • 반환할때 구현체를 찾는 for문은 둘 다 로직 수행
    • 둘 다 동일한 로직을 수행해서 반환하니 성능은 비슷할 것 같음

@ResponseBody, ResponseEntity 선택의 기준

@ResponseBody

  • (장점) 코드의 깔끔함
  • (단점) 상태코드와 헤더를 유연하게 변경하지 못함

ResponseEntity

  • (장점) 상태코드와 헤더를 유연하게 변경 가능
  • (단점) 작성할 코드 증가

발표자의 추천?

  • @ResponseBody
    • 상태코드와 헤더를 유연하게 변경하지 못한다는 단점
      • @ResponseStatus, HttpServletResponse 를 조작하여 단점을 충분히 대체할 수 있다고 생각
@RestController
@RequiredArgsConstructor
public class ReservationController {
	private final ReservationService reservationService;
    
    @GetMapping("/reservations")
    public ResponseEntity<List<ReservationResponse>> findAllReservations() {
    	return ResponseEntity.ok(reservationService.findAll());
    }
    
    @PostMapping("/reservations")
    public ResponseEntity<ReservationResponse> createReservation (@RequestBody reservationCreateMemberRequest memberReqeust, AuthInfo authInfo) {
    ReservationCreateRequest reservationCreateRequest = ReservationCreateRequst.from(memberRequest, authInfo.id());
    ReservationResponse reservationResponse = reservationService.save(reservationCreateRequest);
    return ResponseEntity.created(URI.create("admin/reservation")).body(reservationResponse);
    ...
  • Controller에서 상태코드와 헤더를 지정할 메서드가 하나뿐이 없음
    • 통일성을 위해서 나머지도 ResponseEntity를 붙이는 것은 낭비가 아닌가 싶음

@ReponseBody가 있는데 ResponseEntity는 왜 필요해?

  • 편의성 & 동적 응답 지정

  • @ResponseStatus 사용하면 정적인 특성을 가짐

    • 동적으로 응답 불가(어떨때 200번대, 400번대, 조건 불가)
    @GetMapping("/login/check")
    public ResponseEntity<MemberResponse> checkLogin(AutoInfo authInfo) {
    if(authInfo == null) {
    	return ResponseEntity.noContent().build();
    }
    
    MemberResponse memberResponse = MemberResponse.from(authInfo);
    return ResponseEntity.ok(memberResponse);
    }
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보