
ResponseBody와 JSON 응답
웹 애플리케이션에서 서버와 클라이언트는 주로 JSON 형태의 데이터를 주고받는다. 이 글에서는 Spring MVC에서 JSON 응답을 반환하는 방법과 @ResponseBody, @RestController의 역할을 정리한다.
JSON 응답을 반환해야 하는 이유
클라이언트(브라우저)는 서버에 요청을 보내고, 서버는 그 결과를 응답으로 반환한다.
최근 웹 개발에서는 화면(View)을 서버에서 직접 내려주기보다는, 데이터만 JSON 형태로 전달하고 클라이언트에서 이를 가공하여 화면을 그리는 방식이 일반적이다.
JSON은 JavaScript에서 쉽게 다룰 수 있는 데이터 형식이며, key-value 구조를 가진다.
{
"name": "Robbie",
"age": 95
}
ResponseBody의 역할
Spring에서 Controller 메서드의 반환값은 기본적으로 View 이름으로 해석된다.
하지만 HTML이 아닌 **데이터 자체(JSON, 문자열 등)**를 응답으로 반환하고 싶을 때는 @ResponseBody를 사용해야 한다.
@ResponseBody를 사용하면 반환값이 View로 해석되지 않고, HTTP Response Body에 그대로 담겨 클라이언트로 전달된다.
문자열(JSON 형태) 직접 반환하기
@Controller
@RequestMapping("/response")
public class ResponseController {
// [Response header]
// Content-Type: text/html
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/string")
@ResponseBody
public String helloStringJson() {
return "{\"name\":\"Robbie\",\"age\":95}";
}
}
이 방식은 JSON처럼 보이지만, 실제로는 단순 문자열(String) 이다.
- Content-Type: text/html
- JSON 형식의 문자열을 직접 만들어 반환
간단한 테스트에는 사용할 수 있지만, 유지보수와 확장성 측면에서는 권장되지 않는다.
Java 객체를 JSON으로 반환하기
먼저 응답으로 사용할 클래스(DTO)를 정의한다.
@Getter
public class Star {
private String name;
private int age;
public Star(String name, int age) {
this.name = name;
this.age = age;
}
public Star() {}
}
이제 Controller에서 객체를 그대로 반환한다.
@Controller
@RequestMapping("/response")
public class ResponseController {
// [Response header]
// Content-Type: application/json
// [Response body]
// {"name":"Robbie","age":95}
@GetMapping("/json/class")
@ResponseBody
public Star helloClassJson() {
return new Star("Robbie", 95);
}
}
Spring 내부에서 HttpMessageConverter(Jackson) 가 동작하여
- Java 객체의 필드명 → JSON Key
- 필드값 → JSON Value
형태로 자동 변환해 준다.
이때 Response Header의 Content-Type은 application/json으로 설정된다.
@RestController 사용하기
@RestController는 다음 두 어노테이션을 합친 것이다.
@Controller + @ResponseBody
즉, 클래스에 @RestController를 사용하면 모든 메서드에 자동으로 @ResponseBody가 적용된다.
@RestController
@RequestMapping("/response/rest")
public class ResponseRestController {
@GetMapping("/json/string")
public String helloStringJson() {
return "{\"name\":\"Robbie\",\"age\":95}";
}
@GetMapping("/json/class")
public Star helloClassJson() {
return new Star("Robbie", 95);
}
}
어노테이션을 반복해서 작성할 필요가 없어 코드가 훨씬 간결해진다.
Controller vs RestController 정리
@Controller
- 기본 반환값은 View 이름
- HTML 페이지를 반환해야 할 때 사용
- JSON 응답 시 메서드마다 @ResponseBody 필요
@RestController
- 모든 메서드가 ResponseBody로 동작
- View를 반환하지 않음
- JSON 기반 API 서버에 적합
실무 관점에서의 사용 방식
최근에는 Client와 Server를 분리하여 개발하는 경우가 대부분이다.
- 프론트엔드: React, Vue, Next.js 등
- 백엔드: 데이터 가공 및 API 제공
이런 구조에서는 백엔드에서 HTML을 직접 관리할 일이 거의 없기 때문에,
대부분의 경우 @RestController를 사용하여 JSON 데이터를 반환하는 API 서버를 구성한다.
정리
- JSON 응답을 반환하려면 @ResponseBody 또는 @RestController가 필요하다.
- Java 객체를 그대로 반환하면 Spring이 자동으로 JSON으로 변환한다.
- View가 필요하면 @Controller, 데이터만 반환하면 @RestController를 사용한다.
Spring이 제공하는 이러한 추상화 덕분에 개발자는 데이터 구조와 비즈니스 로직에만 집중할 수 있다.
'BackEnd > 내일배움캠프' 카테고리의 다른 글
| 11. Path Variable과 Request Param (0) | 2026.02.10 |
|---|---|
| 10. Jackson이란 무엇일까? (0) | 2026.02.10 |
| 8. 정적 페이지와 동적 페이지 (0) | 2026.02.10 |
| 7. Controller란? (0) | 2026.02.10 |
| 6. MVC 디자인 패턴이란? (0) | 2026.02.09 |