컨트롤러 반환 타입 질문입니다.
안녕하세요, 강사님. 컨트롤러 코드 관련 질문입니다.
작성한 코드는 컨트롤러의 메소드 반환 타입을 void로 해서 아무것도 반환하지 않는데요, 만약 postmapping 관련 메소드 작성 시, 작성한 게시글의 id값을 반환해주는 코드와 큰 차이가 있을까요?
그리고 찾아보던 중, ResponseEntity를 사용해서 반환해주는 메소드를 보았는데, 메소드의 반환 타입에 따라 기능에 큰 차이가 있는지, 아니면 API 명세의 차이만 있고 기능에는 크게 차이가 없는지 궁금합니다!
답변 1
0
안녕하세요, b_lion님!! 좋은 질문 감사드립니다! 😊 하나씩 답변 드려 보겠습니다!!!
작성한 코드는 컨트롤러의 메소드 반환 타입을 void로 해서 아무것도 반환하지 않는데요, 만약 postmapping 관련 메소드 작성 시, 작성한 게시글의 id값을 반환해주는 코드와 큰 차이가 있을까요?
큰 차이가 있지 않습니다!! POST API 라고 해서 반환 값이 꼭 없어야 할 이유가 있지는 않습니다! 게시글의 id를 다시 반환할 수도 있고 아니면 게시글과 관련된 DTO 전체를 새로 반환해줄 수도 있습니다. 클라이언트와 API 스펙만 맞추면 됩니다 ㅎㅎㅎ
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 를 누르시면 이렇게 생성자 종류에 따른 파라미터를 확인하실 수 있습니다 ㅎㅎㅎ)

HttpStatus 뿐만 아니라, MultiValueMap<String, String>을 갖고 있는 headers도 확인하실 수 있는데요! 우리가 적절한 생성자만 골라주면, 응답 HTTP 헤더에도 추가적인 정보를 담을 수 있다는 의미입니다. 👍
결론적으로 정리드려보자면 다음과 같습니다.
POST, PUT, DELETE 도 응답 객체를 가질 수 있다!
ResponseEntity를 사용하는 것과 사용하지 않는 것은 응답 JSON 포맷은 동일하다.다만,
ResponseEntity를 쓰면 HTTP 응답 상태 코드를 변경하거나 HTTP 응답 헤더를 추가할 수 있다.
궁금증이 해결되셨으면 좋겠네요~ ㅎㅎㅎㅎ
또 궁금한 점이 있으시다면 편하게 질문 남겨주세요! 감사합니다!!! 🙇🙇
2
언제나 친절한 답변 감사드립니다!
@PostMapping("/book")
public ResponseEntity<BookCreateRequest> saveBook(@RequestBody BookCreateRequest request) {
bookService.saveBook(request);
return new ResponseEntity<BookCreateRequest>(request, HttpStatus.CREATED);
}위와 같이 ResponseEntity 사용해서 변경해보았더니 잘 작동하네요ㅎㅎ 감사합니다!
패키지 구분에 대해 궁금한게 있습니다
0
17
2
리액트 관련 질문이 있습니다.
0
63
2
스프링부트 버전
0
72
2
7강 강의를 들으려고 했는데 오류가 나서 서버가 안 켜지는거 같아요.
0
58
2
33강. UserLoanHistory의 관계성에 대한 질문
1
55
2
Java JDK 버전 문의의 건
0
132
2
ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.
0
86
3
h2 console 접속했을 테이블 질문
1
64
1
ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨
0
74
2
15강. updateUser() 질문
0
55
2
깃허브 질
0
81
2
여기까지 다 끝냈다고 하셨는데
0
78
2
왜안될까요
0
69
2
MySQL 창이안ㄴ뜹니다
0
58
2
포스트맨
0
49
1
spring 개념적인 질문
0
71
2
인텔리제이 샘플코드 실행 안됨 오류
0
140
2
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
0
83
1
마이그레이션 오류입니다.
0
171
3
Whitelabel Error Page 오류가 났습니다.
0
163
2
안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ
1
91
3
궁금한게 있습니다.
0
58
2
DTO 관련
0
69
2
궁금한게 있습니다!
0
66
2





