작성
·
114
0
@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
response.getWriter().write("ok");
}
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
왜 requestParamV1 메소드는 Controller와 을 사용하고 @RestController을 사용해도 작동되는데 requestParamV2은 Controller 사용시 @ResponseBody를 붙여야 하잖아요.
인터넷에 찾아보니 메소드가 데이터(예: 문자열 "ok")를 반환하는 경우 ResponseBody를 작성해야 한다고 하는데요.
근데 둘다. response.getWriter().write("ok");/ return "ok"; 데이터 반환 아닌가요?
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
zzzzz님의 질문은 @Controller
와 @RestController
의 차이점과 각 어노테이션 사용 시 @ResponseBody
의 역할에 대한 이해와 관련이 있습니다.
@Controller
는 스프링 MVC에서 컨트롤러의 역할을 정의할 때 사용하는 어노테이션입니다. 이를 사용하는 메서드에서 데이터를 HTTP 응답 본문으로 직접 반환하려면 @ResponseBody
어노테이션을 사용해야 합니다. @ResponseBody
를 사용하면 반환하는 데이터를 HttpMessageConverter
를 통해 HTTP 응답 바디로 직접 쓸 수 있습니다. 즉, @Controller
어노테이션과 함께 @ResponseBody
를 사용하는 경우는 메서드의 반환값을 뷰 리졸버(view resolver)로 보내지 않고, HTTP 응답 본문으로 직접 전송하고 싶을 때 사용합니다.
반면, @RestController
는 @Controller
와 @ResponseBody
를 합친 기능을 합니다. 즉, @RestController
를 사용하는 컨트롤러에서는 모든 메서드의 반환 데이터가 기본적으로 HTTP 응답 본문에 바인딩됩니다. 따라서 별도의 @ResponseBody
어노테이션을 추가할 필요가 없습니다.
zzzzz님의 경우, requestParamV1
메소드에서는 HttpServletResponse
의 getWriter().write("ok");
를 통해 직접 응답 본문을 구성하고 있습니다. 이 경우 @ResponseBody
어노테이션 없이도 HTTP 응답에 직접 데이터를 쓸 수 있지만, 스프링의 데이터 바인딩 기능은 사용되지 않습니다.
requestParamV2
메소드에서는 스프링의 @ResponseBody
또는 @RestController
어노테이션을 통해 반환 값 “ok”를 직접 HTTP 응답 본문으로 반환하도록 설정합니다. 이렇게 설정하면 스프링은 메서드의 반환값을 HTTP 응답 본문에 직접 기록할 수 있도록 해주는 데, 이 과정에서 HttpMessageConverter
를 사용하여 반환 타입을 HTTP 응답으로 변환합니다.
질문에 제시된 두 상황 모두 데이터를 반환하는 것은 맞지만, 처리 방식에 차이가 있습니다. 첫 번째 방식은 스프링의 데이터 바인딩 기능 없이 HttpServletResponse
를 통해 직접 응답을 구성하는 반면, 두 번째 방식은 스프링의 @ResponseBody
를 통해 데이터 바인딩 기능을 사용하여 응답 본문을 구성합니다.
이해를 돕기 위해 유사한 주제에 대한 질문 링크를 추천해드리겠습니다:
@RequestMapping
과 @ResponseBody
에 대한 설명이 있으며, 스프링에서의 데이터 바인딩과 HTTP 메시지 컨버터의 역할에 대해 추가적인 정보를 제공합니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.