정리/Spring Boot

Spring Boot에서 HTTP API사용하기(json)

알렉스 페레이라 2023. 5. 16. 20:16

웹개발을 하다보면 정말 많이 하게 되는 HTTP API개발. 물론 이전직장에서도 많이 개발해봤지만

 

Boot를 사용해서 개발을 하지는 않았기 때문에, Spring Boot환경에서의 API 관련 기능을 정리하려 한다.

 

@RestController

  • class위에 @RestController Annotation이 존재한다면, 해당클래스의 모든 메소드는 @ResponseBody가 포함된다.

@RestControll의 모습. @ResponseBody가 포함되어 있다.

@ResponseBody

  • 해당 Annotation이 있다면, HttpServletResponse에 VO(Value Object)객체를 json으로 변환하여 담는다.
  • 특정 객체를 return하면 자동으로 json타입으로 변환하여 responseBody에 담는다.
  • 이전직장에서는 response에 일일이 key/value로 담고 Buffer를 이용해 write해줬었는데,, Boot가 좋긴 좋다.
  • @RestController를 사용하지않고 @Controller를 사용하는 class라면, 메소드위에 필히 @ResponseBody Annotation을 작성해 주어야한다.

예제

package hello.exception.api;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class APITestController {

    @GetMapping("/api-test/{id}/{name}")
    public TestVO getTest(@PathVariable("id") String id, @PathVariable("name") String name) {
        TestVO testVO = new TestVO(id, name);
        return testVO;
    }

    //json형태로 return하고자하는 VO
    @Data
    @AllArgsConstructor
    static class TestVO {
        private String id;
        private String name;
    }
}

 

PostMan을 사용하여 해당 API를 호출해본다.

성공!

 

하지만,, 이런식으로 사용자의 데이터가 포함하는 요청과 응답에는 GET방식은 좋지않다. POST방식으로 변경해보자.

 

@RequestBody

  • 해당 Annotation이 있다면, HttpServletReqeust에서 요청된 데이터(주로 json데이터를 받을 때)을 쉽게 받기위해 사용
  • 특정 객체를 return하면 자동으로 json타입으로 변환하여 responseBody에 담는다.
  • 이전직장에서는 request에 넘어온 값을 일일이 getParameter로 받아서,, null check 한뒤에 사용했는데 (POST방식으로 넘어오면 InputStreamReader로 parsing해서 사용했다.)
  • 하지만 Boot는 json으로 넘어오는 property와 @RequestBody의 객체의 property가 같다면 알아서 mapping해준다.
  • 자매품으로는 @RequestParam이 있다.

@RequestParam

  • @RequestBody와 동작은 비슷하다. 둘의 가장 큰 차이점이 있다면 객체하나를 1:1로 Mapping한다는 것이다.

 

예제

package hello.exception.api;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RestController
public class APITestController {

    @PostMapping("/api-test")
    public TestVO getTest(@RequestBody TestVO testVO) {
        TestVO ret = new TestVO();
        ret.setId(testVO.getId() + "POST!");
        ret.setName(testVO.getName() + "POST!");
        return ret;
    }

    //json형태로 return하고자하는 VO
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class TestVO {
        private String id;
        private String name;
    }
}

 

 

성공!

'정리 > Spring Boot' 카테고리의 다른 글

Spring Boot @Annotation종류와 쓰임새  (0) 2023.06.14