스프링/3. 스프링 MVC

47. HTTP API

sdafdq 2023. 8. 13. 14:24

 

package hello.springmvc.basic.response;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.springmvc.basic.HelloData;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.io.IOException;

@Controller
public class ResponseBodyController {
    ObjectMapper objMapper = new ObjectMapper();

    @GetMapping("/response-body-string-v1")
    public void responseBodyV1(HttpServletResponse response) throws IOException {
        response.getWriter().write("ok");
    }

    @GetMapping("/response-body-string-v2")
    public ResponseEntity<String> responseBodyV2(HttpServletResponse response)  {
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }

    @ResponseBody
    @GetMapping("/response-body-string-v3")
    public String responseBodyV3() {
        return "ok";
    }

    @ResponseBody
    @GetMapping("/response-body-json-v1")
    public String responseBodyJsonV1() throws JsonProcessingException {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);
        String jsonBody = objMapper.writeValueAsString(helloData);

        return jsonBody;
    }


    @GetMapping("/response-body-json-v2")
    public ResponseEntity<HelloData> responseBodyJsonV2() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return new ResponseEntity<>(helloData, HttpStatus.OK);
    }

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json-v3")
    public HelloData responseBodyJsonV3() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return helloData;
    }
}

String(text)의 경우

response의 writer에 쓰거나

 

응답컨버터, HttpEntity를 이용해서 return하거나,

 

@ResponseBody를 쓰면 아예 자동으로 return값에다가 HttpEntity를 사용해 준다.

 

 

Json의 경우

ObjectMapper를 이용해서 객체 to String으로 해서 그 문자열을 반환하거나(이 경우 그냥 @ResponseBody로 직접 바디에 String을 넣어줬음)

 

이것도 HttpEntity를 이용하거나

    @GetMapping("/response-body-json-v2")
    public ResponseEntity<HelloData> responseBodyJsonV2() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return new ResponseEntity<>(helloData, HttpStatus.OK);
    }

반환타입 보이듯이 ResponseEntity<HelloData>를 반환해 준다. 

이것도 자동으로 ObjectMapper를 사용해 준다. Json 형태로 바꿔준다.

 

 

 

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @GetMapping("/response-body-json-v3")
    public HelloData responseBodyJsonV3() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return helloData;
    }

아예 @ResponseBody를 사용하면

HttpEntity(ResponseEntity, 그 HttpEntity는 또 ObjectMapper를 사용해주고. )에다 자동으로 넣어서 사용해준다.

ResponseEntity<>(helloData) 이거와 같다. 근데 상태코드는 이렇게 못 넣으므로 에노테이션이 제공된다.

단, 동적으로 응답코드를 바꿀 순 없으므로, 그러고 싶을 땐 HttpEntity를 사용하면 된다.

 

 

 

 

@RestController
public class ResponseBodyController {
    ObjectMapper objMapper = new ObjectMapper();

    @GetMapping("/response-body-string-v1")
    public void responseBodyV1(HttpServletResponse response) throws IOException {
        response.getWriter().write("ok");
    }

    @GetMapping("/response-body-string-v2")
    public ResponseEntity<String> responseBodyV2(HttpServletResponse response)  {
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }

    @GetMapping("/response-body-string-v3")
    public String responseBodyV3() {
        return "ok";
    }

    @GetMapping("/response-body-json-v1")
    public String responseBodyJsonV1() throws JsonProcessingException {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);
        String jsonBody = objMapper.writeValueAsString(helloData);

        return jsonBody;
    }


    @GetMapping("/response-body-json-v2")
    public ResponseEntity<HelloData> responseBodyJsonV2() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return new ResponseEntity<>(helloData, HttpStatus.OK);
    }

    @ResponseStatus(HttpStatus.OK)
    @GetMapping("/response-body-json-v3")
    public HelloData responseBodyJsonV3() {
        HelloData helloData = new HelloData();
        helloData.setUsername("userA");
        helloData.setAge(20);

        return helloData;
    }
}

@RestController는

@Contoller + @ResponseBody 이다.

 

그래서 저거 하나만 쓰면 된다.

 

'스프링 > 3. 스프링 MVC' 카테고리의 다른 글

49. 컨버터가 실행되는 위치, ArgumentResolver  (0) 2023.08.13
48. HTTP 메시지 컨버터  (0) 2023.08.13
46. 정적 리소스, 뷰 템플릿  (0) 2023.08.13
45. HTTP API JSON  (0) 2023.08.12
44. HTTP API  (0) 2023.08.12