본문 바로가기
Spring/Spring Boot

Spring Boot / @ResponseBody와 @RequestBody

by LWM 2020. 7. 16.
반응형

오늘 포스팅 내용은 @ResponseBody와 @RequestBody 2가지를 다룬다.

이 두가지 어노테이션은 어떠한 상황에 사용될까? 지금부터 알아보자.

 

1. @ResponseBody 

클라이언트와 서버간의 통신에 있어서 주고받는 것은 크게 2가지가 있다. 바로 파일과 데이터이다. 

서버가 클라이언트에게 파일을 리턴해줄 때는 @Controller 어노테이션을 사용하고, 데이터를 리턴해줄 때는 @RestController어노테이션을 사용한다. 그런데 만약 @Controller가 작성된 자바파일에서 데이터를 클라이언트에게 리턴해주고 싶을 땐 어떻게 해야할까? 이때 지금 다루는 @ResponseBody 어노테이션을 사용한다.

 

@ResponseBody는 간단히 말해 @Controller 어노테이션이 달린 자바파일에서 클라이언트에게 데이터를 리턴해줄 때 사용하는 어노테이션이다. 아래 예시를 보자. 

필자는 현재 viewresolver가 작성되어있지 않으며 템플릿 또한 존재하지 않는다. 현상황에서 위 URL을 타면 다음과 같은 결과가 나타난다.

그럼 @ResposeBody를 제거하면 어떤 결과가 나올까? @ResponseBody가 없으면 파일을 리턴해주기 때문에 템플릿이 존재하지 않으므로 당연히 페이지를 찾을 수 없는 404에러가 뜰것이다. 결과는 다음과 같다.

간단히 정리하면 @ResponseBody가 없으면 return값이 파일(requsetDispatcher)인데 있으면 return값이 데이터(printWriter)가 되므로 @Controller 어노테이션이 작성된 자바파일에서 데이터를 리턴하고자 할때는 @ResponseBody를 사용하면된다.

 

 

 

2. @RequsetBody

@RequestBody를 살펴보기전에 클라이언트와 서버가 데이터를 주고 받을 때 중요시 되는 마임타입이란 개념을 알아야한다. 마임타입에 대해 잘 모른다면 아래 링크 참고.

developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 

MIME 타입

MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다: 웹에서 파일의 확장자는 별  의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도�

developer.mozilla.org

 

 

클라이언트는 서버에게 다양한 형태의 데이터를 전송할 수 있다. 이때 @RequestBody는 다양한 형태의 데이터 중 하나인, JSON데이터를 클라이언트로부터 서버가 받을 때 사용된다. 그럼 그냥 @RequestBody만 작성해주면 JSON데이터를 받을 수 있는건가? 그건 아니다. 서버가 JSON데이터를 받을때는 JACKSON 라이브러리의 잭슨 바인더가 필요하고 JACKSON 라이브러리의 잭슨 바인더는 매개값에 @RequestBody를 주면 함수 시작 직전에 발동한다.

예시는 다음과 같다. 

 

그럼 여기서 한가지 더 짚어보자. 

HTTP메서드 맵핑함수의 매개값에 어떠한 어노테이션도 작성되지않고 순수 데이터타입과 변수가 담길 때는 어떤 마임타입으로 담겨질까?

마임타입 중 'x-www-form-urlencoded' 라는 타입이 있다. 이 마임타입은 데이터가 텍스트 형식일 때 적용되며, 클라이언트로부터 서버가 텍스트형식의 데이터를 받으면 아래 예시처럼 매개값으로 넣을 수 있고 데이터를 받을 수 있다.

'x-www-form-urlencoded'의 데이터 형태는 key=value임을 알아야 한다.

스프링은 기본적으로 요청이 들어오면 Get방식이 아니면 모두 바디를 들고있다고 생각하고 Key=value형태로 된 바디를 파싱한다는 점도 알아두자.

반응형