inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

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

171

zzzzz

작성한 질문수 192

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"; 데이터 반환 아닌가요?

spring mvc

답변 2

0

y2gcoder

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

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

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

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

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 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 메시지 컨버터의 역할에 대해 추가적인 정보를 제공합니다.

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

servlet과 container에 대한 질문입니다

0

21

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

62

1

jsp 의존성 수정 요청

0

75

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

142

1

save() 메서드 문의

0

65

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

99

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

94

1

RequestMapping을 이용한 핸들러, 어댑터

0

118

2

save 후 결과화면

0

86

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

175

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

98

3

파일 오픈 시

0

68

1

스프링 배치 관련

0

77

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

94

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

77

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

73

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

138

1

html 변경하는 부분 적용 문제

0

100

1

한글 깨짐

0

76

2