인프런 커뮤니티 질문&답변

jd님의 프로필 이미지
jd

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

35강. 책 대출/반납 기능 리팩토링과 지연 로딩

컨트롤러 반환 타입 질문입니다.

해결된 질문

작성

·

628

1

안녕하세요, 강사님. 컨트롤러 코드 관련 질문입니다.

작성한 코드는 컨트롤러의 메소드 반환 타입을 void로 해서 아무것도 반환하지 않는데요, 만약 postmapping 관련 메소드 작성 시, 작성한 게시글의 id값을 반환해주는 코드와 큰 차이가 있을까요?

그리고 찾아보던 중, ResponseEntity를 사용해서 반환해주는 메소드를 보았는데, 메소드의 반환 타입에 따라 기능에 큰 차이가 있는지, 아니면 API 명세의 차이만 있고 기능에는 크게 차이가 없는지 궁금합니다!

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, b_lion님!! 좋은 질문 감사드립니다! 😊 하나씩 답변 드려 보겠습니다!!!

 

  1. 작성한 코드는 컨트롤러의 메소드 반환 타입을 void로 해서 아무것도 반환하지 않는데요, 만약 postmapping 관련 메소드 작성 시, 작성한 게시글의 id값을 반환해주는 코드와 큰 차이가 있을까요?

큰 차이가 있지 않습니다!! POST API 라고 해서 반환 값이 꼭 없어야 할 이유가 있지는 않습니다! 게시글의 id를 다시 반환할 수도 있고 아니면 게시글과 관련된 DTO 전체를 새로 반환해줄 수도 있습니다. 클라이언트와 API 스펙만 맞추면 됩니다 ㅎㅎㅎ

 

  1. ResponseEntity를 사용해서 반환해주는 메소드를 보았는데, 메소드의 반환 타입에 따라 기능에 큰 차이가 있는지, 아니면 API 명세의 차이만 있고 기능에는 크게 차이가 없는지 궁금합니다!

결론부터 말쓰드리자면 단순히 ResponseEntity로 우리가 반환하고 싶은 DTO를 감싼거라면 메소드 반환 타입에 따른 기능 차이는 없습니다! 다만 ResponseEntity 를 활용하면 추가적인 기능을 구현할 수가 있어요!

예를 들어, 저희가 DTO를 그냥 반환 (return) 하게 되면 HTTP 응답 코드가 200 OK 로 전송된다고 말씀드렸습니다. 그런데 200 OK 대신 201 CREATED를 보내고 싶다고 해볼게요! (201 에 대한 설명입니다 ㅎㅎ https://developer.mozilla.org/ko/docs/Web/HTTP/Status/201)

 

이럴 때 바로 ResponseEntity를 사용해 특정한 상태를 지정할 수 있습니다. 코드로 느낌만 보여드리면 아래와 같이 생겼습니다!!!

public ResponseEntity<MyDto> returnDtoWithCreated() {
  MyDto dto = myService.getDto();
  return new ResponseEntity<MyDto>(dto, HttpStatus.CREATED);
}

ResponseEntity 객체를 만들 때 우리가 HTTP body에 보내고 싶은 dto 와 직접 지정해주고 싶은 응답 상태 HttpStatus.CREATED 를 만들어 넣어주는거죠!! 실제 body는 ResponseEntity를 사용할 때나, 사용하지 않을 때 똑같이 전송됩니다.

HTTP 상태를 변경할 수 있는 것 뿐만 아니라, ResponseEntity의 다른 생성자를 보시면 (IntelliJ에서 커서를 생성자 호출 ( ) 사이에 놓으시고, command + P Windows/LInux는 ctrl + P 를 누르시면 이렇게 생성자 종류에 따른 파라미터를 확인하실 수 있습니다 ㅎㅎㅎ)

image

HttpStatus 뿐만 아니라, MultiValueMap<String, String>을 갖고 있는 headers도 확인하실 수 있는데요! 우리가 적절한 생성자만 골라주면, 응답 HTTP 헤더에도 추가적인 정보를 담을 수 있다는 의미입니다. 👍

 

결론적으로 정리드려보자면 다음과 같습니다.

  • POST, PUT, DELETE 도 응답 객체를 가질 수 있다!

  • ResponseEntity 를 사용하는 것과 사용하지 않는 것은 응답 JSON 포맷은 동일하다.

  • 다만, ResponseEntity 를 쓰면 HTTP 응답 상태 코드를 변경하거나 HTTP 응답 헤더를 추가할 수 있다.

 

궁금증이 해결되셨으면 좋겠네요~ ㅎㅎㅎㅎ

또 궁금한 점이 있으시다면 편하게 질문 남겨주세요! 감사합니다!!! 🙇🙇

jd님의 프로필 이미지
jd
질문자

언제나 친절한 답변 감사드립니다!

@PostMapping("/book")
public ResponseEntity<BookCreateRequest> saveBook(@RequestBody BookCreateRequest request) {
    bookService.saveBook(request);
    return new ResponseEntity<BookCreateRequest>(request, HttpStatus.CREATED);
}

위와 같이 ResponseEntity 사용해서 변경해보았더니 잘 작동하네요ㅎㅎ 감사합니다!

jd님의 프로필 이미지
jd

작성한 질문수

질문하기