요청에 대한 응답하기

nGyu·2022년 2월 4일
0
post-thumbnail

서버로 요청을 하면 다양한 응답을 보내준다.

그중 다양한 데이터를 담아서 보내는 JSON 형식을 많이 사용하는데, Spring에서는 어떻게 응답을 하는지 한번 알아보도록 하자.

JSON

우선, JSON 이 무엇인지 알아두는게 좋다.

  • JavaScript Object Notation 의 약어로 Key와 Value가 한 쌍을 이루는 Object이다.
  • 배열을 섞어서 사용하는 방법도 있다.
{
	"key":value,
	"key":value,
	"key":[
		{"key":value, "key":value, "key":value},
		{"key":value, "key":value, "key":value},
		{"key":value, "key":value, "key":value},
	],
}

Jackson

객체와 JSON 형식 문자열간 변환을 처리하는 라이브러리이다.

비슷한 라이브러리로 GSON과 SimpleJSON이 있다.

전부 ObjectMapper를 통해 따로 세팅을 해줘야하지만, 스프링에서 Jackson을 사용하는 이유는 관계의 장점이 있다.

이 Jackson에 대해서는 다른 글로 자세히 알아보도록 하겠다.

DTO

아래 예제들을 보기 전, DTO를 작성해보도록 하자.

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class MemberDTO{
	private String name;
	private String email;
	private int age;
}

@ResponseBody

Spring 4.x 에서는 @RestController라는 어노테이션이 존재하지 않아 일반적인 @Controller 어노테이션을 사용해 각 요청메서드마다 @ResponseBody를 추가하였지만, 버전업이 된 이후로 @RestController메서드가 추가되어 메서드에 따로 @ResponseBody 어노테이션을 붙혀주지 않아도 된다.

이 어노테이션은 요청에대한 응답을 본문의 객체로 변환하여 클라이언트에게 전송하기 위해 사용된다.

아래처럼 작성을 한다면 Spring에서 자동으로 Jackson을 통해 JSON형태로 변환하여 클라이언트에게 응답을 해준다.

@Controller
public class TestController{
	@RequestMapping(value="/test", method=RequestMethod.GET)
	@ResponseBody
	public MemberDTO getMember(){
		MemberDTO mem = MemberDTO.builder()
        						.name("홍길동")
                                .email("test@test.com")
                                .age(23)
                                .build();
		return mem;
	}
}

@RestController

MVC 중 V를 담당하는 View를 보여줄때는 ReponseBody가 필요없기에 RestConroller보다는 Controller를 많이 사용한다.
이 어노테이션은 Spring4이후에 생긴 어노테이션인데 이 어노테이션은 Controller와 ResponseBody 어노테이션을 포함하고있기에 RestApi를 구현할 때 많이 사용된다.

원리는 위 ResponseBody를 사용할때와 똑같다.

@RestController
public class TestController{
	@RequestMapping(value="/test", method=RequestMethod.GET)
	public MemberDTO getMember(){
		MemberDTO mem = MemberDTO.builder()
        						.name("홍길동")
                                .email("test@test.com")
                                .age(23)
                                .build();
		return mem;
	}
}
profile
지금보다 내일을, 모레를 준비하자

0개의 댓글