오늘 포스팅 내용은 @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
클라이언트는 서버에게 다양한 형태의 데이터를 전송할 수 있다. 이때 @RequestBody는 다양한 형태의 데이터 중 하나인, JSON데이터를 클라이언트로부터 서버가 받을 때 사용된다. 그럼 그냥 @RequestBody만 작성해주면 JSON데이터를 받을 수 있는건가? 그건 아니다. 서버가 JSON데이터를 받을때는 JACKSON 라이브러리의 잭슨 바인더가 필요하고 JACKSON 라이브러리의 잭슨 바인더는 매개값에 @RequestBody를 주면 함수 시작 직전에 발동한다.
예시는 다음과 같다.
그럼 여기서 한가지 더 짚어보자.
HTTP메서드 맵핑함수의 매개값에 어떠한 어노테이션도 작성되지않고 순수 데이터타입과 변수가 담길 때는 어떤 마임타입으로 담겨질까?
마임타입 중 'x-www-form-urlencoded' 라는 타입이 있다. 이 마임타입은 데이터가 텍스트 형식일 때 적용되며, 클라이언트로부터 서버가 텍스트형식의 데이터를 받으면 아래 예시처럼 매개값으로 넣을 수 있고 데이터를 받을 수 있다.
'x-www-form-urlencoded'의 데이터 형태는 key=value임을 알아야 한다.
스프링은 기본적으로 요청이 들어오면 Get방식이 아니면 모두 바디를 들고있다고 생각하고 Key=value형태로 된 바디를 파싱한다는 점도 알아두자.
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot / JSP 사용시 필요한 시큐리티 라이브러리 및 태그 (0) | 2020.08.11 |
---|---|
Spring Boot / 트랜잭션 롤백하기 (0) | 2020.08.03 |
Spring Boot / @ComponentScan과 @Controller, @Service, @Repository, @Configuration, @Component (0) | 2020.07.16 |
Spring Boot / pom.xml (0) | 2020.07.15 |
Spring Boot / 프로젝트 생성하기 (0) | 2020.07.13 |