JSON 형태로 객체 반환하기

설명

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