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가 자동 적용되므로 더욱 편리합니다.
- 스프링은 단순히 편리함을 넘어, 개발자의 생산성과 유지보수성을 높여주는 강력한 추상화 도구임을 기억하면 좋습니다.
참고 링크
'백엔드 > Spring' 카테고리의 다른 글
@PostConstruct란? (0) | 2025.04.30 |
---|---|
@RequestBody, @ResponseBody vs HttpEntity(RequestEntity, ResponseEntity) (0) | 2025.04.11 |
StreamUtils.copyToString() - InputStream을 String으로 쉽게 변환하는 방법 (0) | 2025.04.07 |