0. 개요
- WAS에 요청이 들어오면 HttpServletReqeust와 HttpServletResponse 객체를 생성하고, 서블릿 객체의 service 메서드에 파라미터로 전달되면서 실행된다.
우리는 http 요청과 응답에 대해 하나하나 메시지를 파싱 하고, 읽고, 다시 응답 메시지를 생성하는 등의 일을 매번 할 수 없기 때문에 servlet에서 제공하는 Request객체와 Response 객체를 이용하면 편리하게 통신할 수 있다.
1. HttpServletRequest의 역할
- HTTP 요청 메시지 파싱(StartLine, 헤더, 바디)
- 임시 저장소 기능(해당 HTTP 요청이 시작부터 끝날 때까지 유지된다)
- 세션 관리 기능(request.getSession())
2. 클라이언트에서 서버로 데이터를 전달하는 방법
- request는 클라이언트가 요청 시 전달한 정보를 담고 있는 객체로, 웹 브라우저에서의 요청이 크게 3가지로 나눠지기 때문에 상황에 맞춰서 어떻게 메시지를 받는지 알아보겠다.
1. GET - URl에 포함된 쿼리 파라미터 (? username=kim & age=25)
- 메시지 바디 없이, URL에 포함된 쿼리 파라미터에 데이터를 포함해서 전달.
- get은 getParameter("쿼리 파라미터 key 값")을 통해 사용할 수 있다.
2. POST - HTML form 형식
- 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달.
- content-type : application/x-www-form-urlencoded
- POST도 역시 http 바디에 쿼리 파라미터 형식으로 전달되기 때문에 편리하게 getParameter(key)을 이용해서 사용할 수 있다.
- 서버 입장에서는 GET이나 POST나 모두 쿼리 파라미터 형식으로 전달된 것이므로 동일하게 사용하는 것이다.
+ 추가적으로 content-type은 메시지 바디의 형식을 지정하는 것이다.
따라서 get은 메시지 바디가 없기 때문에 지정이 필요가 없지만 post는 메시지 바디에 데이터를 담아서 전송하므로 content-type : application/x-www-form-urlencoded를 설정해줘야 한다.
3. 메시지 바디에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, 보통 JSON, XML, text
3-1) 단순 텍스트 메시지 전송
- content-type : text/plain
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF-8);
messageBody가 클라이언트가 서버로 보낸 텍스트 데이터이다.
3-2) JSON 형식 데이터 전송
- content-type : application/json
1. JSON 데이터를 매핑할 클래스 생성
@Getter
@Setter // 롬복 이용
public class ExampleData {
private String userName;
private int age;
}
2. 데이터를 받아서 객체에 매핑
ObjectMapper objectMapper = new ObjectMapper();
ServletInputStream inputStream = request.getInputStream(); // request객체에서 바이트코드로 받는다.
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF-8); // 문자열로 변환
ExampleData exampleData = objectMapper.readValue(messageBody, ExampleData.class); // 객체에 매핑
System.out.println(exampleData.userName);
System.out.println(exampleData.age);
- JSON 객체를 파싱 해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 등의 JSON 변환 라이브러리를 사용하면 된다. 미리 만들어놓은 자바 객체에 매핑이 가능하다.
- 스프링 부트로 Spring MVC를 이용하면 잭슨 라이브러리 ObjectMapper를 사용할 수 있다.
'개발 공부 > 스프링' 카테고리의 다른 글
스프링 - 의존 관계 주입 방법 4가지 (0) | 2021.09.17 |
---|---|
스프링 - @Component와 컴포넌트 스캔 (0) | 2021.09.17 |
스프링 - 스프링 컨테이너, 싱글톤 (0) | 2021.09.17 |
스프링 - 의존 관계와 DI, Ioc 컨테이너 (0) | 2021.09.16 |
스프링 MVC - 웹 구조, 서블릿 (0) | 2021.09.04 |