Spring 입문주차/1주차

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

note994 2024. 8. 13. 17:36

Response 트렌드의 변화

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

 

당연히 정답은 없지만, 최근의 경향으로는 그렇지는 않다. 예전에는 조금 더 그랬었던 편이지만, 웹 생태계가 고도화 되는 과정중에 상대적으로 프론트엔드와 백엔드가 각각 따로 발전하게 되면서, 느슨하게 결합하는 방식을 더 많이 채택하게 되었고, 최근에는 서버가 직접 뷰(html/css/js)를 반환하기 보다는 요청에 맞는 특정한 정보만 반환하는 것을 더 선호하기도 한다.

그래서 요즘에는 주로 서버에서는 데이터 교환 포맷 중 JSON 형태로 데이터를 반환하기도 하는데, 보통 이렇게 생겼다.

따라서 기본적인 html 파일 요청을 제외하고, JSON 데이터를 요청하는 API를 통해 브라우저에서 html을 조작하여 반영하는 식으로 진행될 예정이다.

JS와 html 파일은 전부 완성이 된 상태로 제공되기 때문에 우리는 서버 제작에만 집중하면 된다.


JSON 데이터 반환하는 방법

템플릿 엔진이 적용된 SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의 .html 파일을 찾아서 반환해준다.

따라서 html 파일이 아닌 JSON 데이터를 브라우저에 반환하고 싶다면 해당 메서드에 @ResponseBody 애너테이션을 추가해줘야 한다.
----
JSON 데이터 반환 방법

 

1. 반환값 : String

 

새로운 패키지를 만들고 그 패키지 안에 ResponseController 자바 파일을 만든다 그리고 아래의 코드를 작성한다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/response")
public class ResponseController {
    @GetMapping("/json/string")
    @ResponseBody
    public String helloStringJson() {
        return "{\"name\":\"Robbie\",\"age\":95}";
    }

}

Java는 JSON 타입을 지원하지 않기 때문에 JSON 형태를 String 타입으로 변환해서 사용해야 한다.

 

그 후 아래의 URL로 접속해보면 JSON 데이터가 출력되는것을 볼 수 있다.

 

http://localhost:8080/response/json/string


2. 반환값 : String 외 자바 클래스

@GetMapping("/response/json/class")
@ResponseBody
public Star helloClassJson() {
    return new Star("Robbie", 95);
}

Star는 java 클래스이며 같은 패키지에 Star.java 파일을 만든 후 아래의 코드를 작성한다.

package com.sparta.springmvc.response;

import lombok.Getter;

@Getter
public class Star {
    String name;
    int age;

    public Star(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Star() {}
}

http://localhost:8080/response/json/class


@RestController

@Controller + @ResponseBody

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

 

ResponseRestController.java

package com.sparta.springmvc.response;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@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);
    }
}