response.getWriter().write() vs return "ok"

Spring MVC를 처음 접하거나, 직접 서블릿 API를 다뤄본 개발자라면 한 번쯤은 다음 두 코드의 차이에 대해 궁금했던 적이 있을 것입니다:

// 방식 1: HttpServletResponse 사용
response.getWriter().write("ok");

// 방식 2: @ResponseBody와 return
@ResponseBody
public String hello() {
    return "ok";
}

이 두 방식은 모두 클라이언트에게 HTTP 응답을 반환하지만, 사용 방식과 처리 흐름에 큰 차이가 있습니다.

이번 글에서는 이 차이를 정리하고, 어떤 상황에서 어떤 방식을 사용하는 것이 좋은지 알아보겠습니다.


1. response.getWriter().write("ok"): 서블릿 API 직접 사용

이 방식은 HttpServletResponse 객체를 통해 직접 응답 본문에 값을 써넣는 저수준 방식입니다.

@Controller
public class ResponseController {

    @RequestMapping("/manual-response")
    public void manualResponse(HttpServletResponse response) throws IOException {
        response.getWriter().write("ok");
    }
}

특징

  • HttpServletResponse의 getWriter()를 통해 PrintWriter를 얻고, 직접 문자열을 씁니다.
  • Spring의 뷰 리졸버(ViewResolver)나 HttpMessageConverter를 거치지 않습니다.
  • 스프링의 생태계를 우회하고 직접 응답을 제어해야 할 때 사용합니다.
  • 예: 파일 다운로드, 이미지 응답, 바이너리 응답 등.

2. return "ok" + @ResponseBody: 스프링 방식의 간결한 처리

반면, 스프링 MVC에서는 메소드 반환값을 HTTP 응답으로 보내고 싶을 때 @RestController 또는 @ResponseBody를 활용할 수 있습니다.

@RestController
public class RestApiController {

    @GetMapping("/spring-response")
    public String springResponse() {
        return "ok";
    }
}

 

※ 또는 @Controller에 @ResponseBody를 붙이면 동일한 효과입니다.

@Controller
public class RestApiController {

    @ResponseBody
    @GetMapping("/spring-response")
    public String springResponse() {
        return "ok";
    }
}

특징

  • @ResponseBody가 붙으면 반환값은 뷰 이름으로 인식되지 않고, HTTP 응답 본문으로 전송됩니다.
  • 내부적으로 HttpMessageConverter가 동작하여 문자열, JSON 등으로 자동 변환됩니다.
  • RESTful API나 간단한 문자열 응답을 만들 때 매우 유용합니다.

3. 어떤 방식을 써야 할까?

기준 response.getWriter().write() @ResponseBody + return
처리 수준 저수준 (서블릿 직접 제어) 고수준 (스프링에서 처리)
코드 간결성 비교적 복잡 매우 간결
뷰/메시지 변환기 사용 여부 사용하지 않음 HttpMessageConverter 사용
사용 사례 파일 다운로드, 이미지 응답 등 문자열, JSON 응답 등 일반적인 API 응답
추천 여부 특별한 제어가 필요한 경우만 추천 대부분의 경우 적극 추천

4. 정리

  • 직접 제어가 필요한 특별한 상황(파일 처리, 비동기 스트림 등)이 아니라면, 스프링이 제공하는 @ResponseBody 방식이 훨씬 간편하고 유지보수에 유리합니다.
  • REST API 개발 시에는 @RestController를 사용하면 @ResponseBody가 자동 적용되므로 더욱 편리합니다.
  • 스프링은 단순히 편리함을 넘어, 개발자의 생산성과 유지보수성을 높여주는 강력한 추상화 도구임을 기억하면 좋습니다.

 

참고 링크

+ Recent posts