• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

/request-param-v1 질문있습니다.

24.04.26 16:28 작성 조회수 42

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

y2gcoder님의 프로필

y2gcoder

2024.04.26

안녕하세요. zzzzz님, 공식 서포터즈 y2gcoder입니다.

@Controller에서
메서드의 반환타입이 String 이면 스프링 MVC는 뷰네임을 반환한 것이라고 이해합니다

그래서 뷰 리졸버로 가서 해당 논리적 뷰 이름을 가진 뷰 파일을 찾아 반환해주려고 하게 됩니다!

반면에 @ResponseBody를 해주면 메서드 반환값을 뷰 리졸버로 보내지 않고 바로 HTTP 응답 본문에 써주기 때문에 그냥 "ok"라는 텍스트를 바로 응답으로 반환해주게 됩니다.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.26

안녕하세요, 인프런 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 메소드에서는 HttpServletResponsegetWriter().write("ok");를 통해 직접 응답 본문을 구성하고 있습니다. 이 경우 @ResponseBody 어노테이션 없이도 HTTP 응답에 직접 데이터를 쓸 수 있지만, 스프링의 데이터 바인딩 기능은 사용되지 않습니다.

requestParamV2 메소드에서는 스프링의 @ResponseBody 또는 @RestController 어노테이션을 통해 반환 값 “ok”를 직접 HTTP 응답 본문으로 반환하도록 설정합니다. 이렇게 설정하면 스프링은 메서드의 반환값을 HTTP 응답 본문에 직접 기록할 수 있도록 해주는 데, 이 과정에서 HttpMessageConverter를 사용하여 반환 타입을 HTTP 응답으로 변환합니다.

질문에 제시된 두 상황 모두 데이터를 반환하는 것은 맞지만, 처리 방식에 차이가 있습니다. 첫 번째 방식은 스프링의 데이터 바인딩 기능 없이 HttpServletResponse를 통해 직접 응답을 구성하는 반면, 두 번째 방식은 스프링의 @ResponseBody를 통해 데이터 바인딩 기능을 사용하여 응답 본문을 구성합니다.

이해를 돕기 위해 유사한 주제에 대한 질문 링크를 추천해드리겠습니다:

  • RequestMethod와 ResponseBody 사용시 주의점: 이 질문에서도 @RequestMapping@ResponseBody에 대한 설명이 있으며, 스프링에서의 데이터 바인딩과 HTTP 메시지 컨버터의 역할에 대해 추가적인 정보를 제공합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.