설명
API 서버를 만들 때 일반적으로 클라이언트한테 JSON 형식으로 데이터를 넘겨주어야 합니다.
하지만 아래처럼 JSON 데이터를 일일이 조립하면 생산성도 떨어질뿐더러 오류가 날 확률이 높습니다.
String json = "{\"name\" : \"" + name + "\"}";
return json;
Spring에서는 @ResponseBody Annotation을 통해 객체를 직접 JSON으로 변환시켜 줄 수 있습니다.
JSON 형태로 Response 를 보내는 방법에 대하여 설명하겠습니다.
JSON 형태로 반환하기
우선 JSON 으로 변환시킬 객체를 만들어야 합니다.
여기서는 Lombok 라이브러리를 사용하였기 때문에 감안하셔서 보시는 것을 권장드립니다.
package hello.core.common;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Player {
private String name;
private int age;
}
이렇게 만든 객체를 사용하는 Controller를 만들어야 합니다.
@Controller
public class PlayerApp {
@GetMapping("/player")
@ResponseBody
public Player getOnePlayer() {
return new Player("chan", 28);
}
}
상단에 @Controller로 빈을 등록하고 @GetMapping으로 경로를 지정해 준 뒤에
@ResponseBody annotation을 추가해 줍니다.
그러고 서버를 실행해 보면 위와 같이 객체가 JSON 형태로 반환되는 것을 보실 수 있습니다.
만약 여기서 여러 개의 JSON 객체를 리스트로 만들어서 내보내고 싶다면
아래와 같이 List를 이용해서 만들어 주시면 됩니다.
@GetMapping("/players")
@ResponseBody
public List<Player> getAllPlayer() {
Player player1 = new Player("chan", 28);
Player player2 = new Player("kim", 27);
Player player3 = new Player("young", 26);
ArrayList<Player> list = new ArrayList<>();
list.add(player1);
list.add(player2);
list.add(player3);
return list;
}
더 간단한 방법
위와 같이 @ResponseBody를 선언해줘야 하는 번거로움을 덜어내기 위해
스프링에서는 @RestController를 지원해 줍니다.
@RestController는 @Controller와 @ResponseBody를 합쳐놓은 annotation입니다.
따라서 @Controller 가 아닌 @RestController을 적용하면 아래와 같이 코드가 변경이 됩니다.
@RestController
public class PlayerApp {
@GetMapping("/player")
public Player getOnePlayer() {
return new Player("chan", 28);
}
@GetMapping("/players")
public List<Player> getAllPlayer() {
Player player1 = new Player("chan", 28);
Player player2 = new Player("kim", 27);
Player player3 = new Player("young", 26);
ArrayList<Player> list = new ArrayList<>();
list.add(player1);
list.add(player2);
list.add(player3);
return list;
}
}
@Controller VS @RestController
여기서 문득 궁금하실 수 있습니다.
왜 굳이 @Controller , @RestController 을 분리했을까? 입니다.
@Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송합니다. 물론 @Controller와 @ResponseBody를 사용하여 만들 수 있지만 이러한 방식은 RESTful 웹서비스의 기본 동작이기 때문에 Spring은 @Controller와 @ResponseBody의 동작을 조합한 @RestController을 도입했습니다.
다음 두 코드는 Spring MVC에서 동일한 동작을 합니다.
@Controller
@ResponseBody
public class MVCController{
logic...
}
@RestController
public class ReftFulController{
logic...
}
일반적인 Spring MVC 처리과정은 아래와 같습니다.
'Spring' 카테고리의 다른 글
@Controller 와 @RestController (2) | 2025.01.22 |
---|---|
ResponseEntity (0) | 2025.01.16 |
빈 생명주기 콜백 (1) | 2025.01.09 |
스프링에서 조회 대상 빈이 2개 이상일 때 해결 방법 (0) | 2025.01.08 |
다양한 의존관계 주입 방법 (1) | 2025.01.07 |