[Spring] 데이터반환

박원준·2026년 3월 17일

Spring 입문

목록 보기
2/3

📘 데이터를 Client에 반환하는 방법


1️⃣ Response 트렌드의 변화

서버는 요청을 받아 html/css/js 파일을 반환해주는게 주 업무일까?

정답은 없지만, 최근의 경향으로는 그렇지 않다!
웹 생태계가 고도화 되는 과정 중에 프론트엔드와 백엔드가 각각 따로 발전하게 되면서, 느슨하게 결합하는 방식을 더 많이 채택하게 되었다. 최근에는 서버가 직접 뷰(html/css/js)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 더 선호한다. 그래서 요즘에는 주로 서버에서 데이터 교환 포맷중 JSON 형태로 데이터를 반환한다.

{
  "users": [
    {
      "id": 1,
      "name": "홍길동"
    },
    {
      "id": 2,
      "name": "김철수"
    }
  ]
}
{
  "success": true,
  "data": {
    "orderId": 123,
    "status": "READY",
    "price": 15000
  },
  "message": "주문 조회 성공"
}

따라서 서버는 더 이상 HTML을 직접 반환하는 역할에만 머무르지 않고, 클라이언트가 필요로 하는 데이터를 JSON 형태로 제공하는 역할을 수행한다. 이를 통해 프론트엔드와 백엔드가 분리된 구조에서 유연하게 통신할 수 있다.


2️⃣ Json 데이터 반환하는 방법

  • 템플릿 엔진이 적용된 SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의 .html 파일을 찾아서 반환해준다.
  • 따라서 html 파일이 아닌 JSON 데이터를 브라우저에 반환하고 싶다면 해당 메서드에 @ResponseBody 애너테이션을 추가해줘야한다.

예시) @ResponseBody의 차이

/*
* "hello" → 뷰 이름으로 인식
* thymeleaf dependency가 있으면 templates 경로를 먼저 찾음
* /templates/hello.html 찾음
*/
@GetMapping("/hello")
public String hello() {
    return "hello";
}

/*
* [Response header] Content-Type: text/html
* "hello" → 그대로 응답
*/
@GetMapping("/json/string")
@ResponseBody
public String hello() {
    return "hello";
}

/*
* 객체 반환하면? -> Spring에서 자동으로 JSON으로 변환함
* [Response header] Content-Type: application/json
{
  "id": 1,
  "name": "홍길동"
}
*/
@GetMapping("/json/class")
@ResponseBody
public User getUser() {
    return new User(1, "홍길동");
}

3️⃣ @RestController

  • @RestController = @Controller + @ResponseBody

  • @RestController를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가되는 효과를 부여할 수 있다.

@RestController
@RequestMapping("/response/rest")
public class ResponseRestController {
    // [Response header]
    //   Content-Type: text/html
    // [Response body]
    //   {"name":"Robbie","age":95}
    @GetMapping("/json/string")
    public String helloStringJson() {
        return "{\"name\":\"Robbie\",\"age\":95}";
    }

    // [Response header]
    //   Content-Type: application/json
    // [Response body]
    //   {"name":"Robbie","age":95}
    @GetMapping("/json/class")
    public Star helloClassJson() {
        return new Star("Robbie", 95);
    }
}

0개의 댓글