FireDrago
[Servlet] Servlet 사용법 (Request, Response) 본문
이전 포스팅에서 서블릿의 역할과 기능에 대해서 살펴봤다. 이제 구체적인 사용방법을 알아보자
스프링 부트에서 Servlet 기능을위한 애너테이션을 지원한다.
먼저 실행 클래스에 @ServletComponent 애너테이션을 사용하자, 자동으로 @WebServlet 클래스를 스캔한다.
각 서블릿 클래스에서는 @WebServlet 애너테이션을 이용해 이름과, URL을 맵핑한다.


HttpServletRequest
HttpServletRequest 객체는 클라이언트로부터 Http 요청 메시지가 올때마다 생성된다.
URL 맵핑된 서블릿이 실행될때, 서블릿 컨테이너 (Was)는 HttpServletRequest 객체에 요청정보를 담아서 전달한다.
HttpServletRequest 객체는 요청메시지의 정보를 쉽게 꺼내올 수 있는 메서드를 지원한다.
1. StartLine 정보
| 메서드 | 기능 |
| getMethod( ) | Http 메소드를 반환한다. GET, POST 등등 |
| getProtocol( ) | 프로토콜 정보를 반환한다. HTTP/1.1 |
| getScheme( ) | http, https (보안연결) 사용하는지 확인한다. |
| getRequestURL( ) | 전체 URL 정보를 가져온다. ( 주소 전체를 가져온다) - URL : 리소스의 위치정보를 나타낸다. - 프로토콜, 호스트 이름, 경로, 쿼리스트링으로 구성된다. |
| getRequestURI( ) | URI 식별자를 가져온다. (리소스 식별자만 가져온다) - URI 는 URL 과 URN을 포괄하는 개념 - 리소스의 위치정보를 나타내지 않을 수 도 있음 - 여기서는 단순 식별자를 가져온다고만 이해하자 |

이런 식으로 Http 요청 메시지의 가장 첫 줄인 StarLine에 표기되는 정보를 쉽게 가져올 수 있다.
2. Http 헤더 정보
HttpRequest 객체는 HTTP 요청 헤더의 정보도 쉽게 가져올 수 있도록 메서드를 제공한다.
| 메서드 | 반환타입 | 설명 |
| getServerName( ) | String | 서버이름을 가져온다. |
| getServerPort( ) | int | 서버 포트 번호를 가져온다. - 서버가 아파트라면 포트는 동 호수 - 포트를 통해 같은 ip 내에서 다른 프로세스를 구분한다. (롤 하면서, 유튜브볼때 각각 다른 포트 사용) |
| getLocales( ) | Enumeration <Locale> |
선호하는 언어 설정들을 가져온다. |
| getLocale( ) | Locale | 가장 선호하는 언어 설정 하나를 가져온다. |
| getCookies( ) | Cookie[ ] | 쿠키정보를 가져온다. - 쿠키는 HTTP 연결의 무상태성을 보완하기 위한기술 - 쿠키를 통해 로그인 여부등을 알 수 있다. |
| getContentType( ) | String | 요청 메시지의 컨텐츠 타입을 가져온다. ex) html, json, 일반 문자열 |
| getCharacterEncoding( ) | String | 컨텐츠가 어떤 방식으로 인코딩 했는지를 알려준다. - 텍스트는대부분 utf-8 사용한다. - 텍스트가 아닌 데이터를 '바이너리 데이터' 라고한다. (음악, 영상 등) - 바이너리 데이터는 각각의 파일형식마다 인코딩 방식이 다양한다. |

3. Http Body 정보 가져오기
- HTML Form 으로 전송된 데이터 가져오기
html 형식으로 데이터를 전송할 경우, POST 메서드로 파라미터가 전달된다.
| 메서드 | 반환타입 | 설명 |
| getParameter(String name) | String | name 으로 전달된 value 값을 문자열로 받아온다. |
| getParameterNames( ) | Enumeration <String> |
전달된 모든 파라미터의 name값을 가져온다. |
| getParameterValues ( String name ) |
String [ ] | 같은 name으로 전달된 value 값이 여러개일 경우 String [ ] 로 가져온다. |

- JSON 데이터 가져오기
Json 데이터는 가장 많이 사용되는 방식으로, 서버간, 프론트앤드 개발자와 데이터 교환등 광범위하게 사용된다.
json 데이터는 문자열 데이터지만, 객체를 이용하여 파싱해서 데이터를 가져온다.
이를 위해 ObjectMapper 클래스를 사용한다. JSON 데이터를 가져올때는 ServletInputStream 으로 가져온다음
맵핑할 클래스와 인코딩 방식을 파라미터로 전달한 StreamUtils.copyToString 메서드로 문자열로 변환한다.
마지막으로 문자열 정보를 ObjectMapper 클래스의 readValue 메서드를 사용하여 원하는 객체로 파싱한다.
| 메서드 | 반환타입 | 설명 |
| getInputStream( ) | ServletInputStream | HTTP body 내용을 스트림으로 가져온다. |
| StreamUtils .copyToString (InputStream, Charset) |
String | Input스트림과 인코딩 방식을 파라미터로 전달하여, 문자열로 변경한다. |
| ObjectMapper .readValue (String, Class<T>) |
<T> | 문자열데이터를 <T>타입 클래스로 변환해준다. |

HttpServletResponse
Request 객체가 요청 정보를 '가져오는' 역할을 했다면, HttpServletResponse 객체는 HTTP 응답 메시지를 생성한다.
역시 요청이 있을때마다 생성되며, 응답메시지를 전송하면 사라진다.
HttpServletResponse 객체의 여러 생성기능들을 알아보자
1. Http 헤더 생성
| 메서드 | 반환타입 | 설명 |
| setContentType(String) | void | 응답 헤더의 컨텐츠 타입을 설정한다. |
| setCharacterEncoding(String) | void | 응답 헤더의 인코딩 방식을 설정한다. |
| addCookie (Cookie) | void | 쿠키 객체를 응답헤더에 추가한다. |
| Cookie.setMaxage(int) | void | 쿠키 객체에 유효시간을 설정한다. - 유효시간이 지나면 작동하지 않는다. (보안문제) |
| sendRedirect(String location) | void | location 경로로 redirect 보낸다. - 304 상태 리턴한다. |

2. HTML body 생성
- HTML 생성
HttpServletResponse 를 이용하여 HTTP 응답메세지 바디에 HTML 을 직접 작성하여 전달할 수 있다. 해보면 매우 귀찮다;;
이는 나중에 JSP의 등장으로 이어진다. HTML 태그 일일이 다 쓰는거 귀찮으니
그냥 HTML에 java 코드를 사용할수 있도록 하는 JSP가 등장한다. 그러나 JSP도 만만치 않게 코드가 복잡해진다.
HTML 생성을 위해 ContentType : "text/html" 로 설정해준다. 추가로 인코딩 정보도 utf-8로 설정한다.
getWriter( ).write( ) 메서드를 사용하여 HTML 태그를 일일이 직접 입력하면 HTML 을 전송할 수 있다.
| 메서드 | 반환타입 | 설명 |
| getWriter( ) | PrintWriter | PrinterWriter 객체를 생성한다. PrinterWriter 객체를 통해 직접 바디 내용을 입력한다. |
| PrintWriter .println (String ) |
void | 직접 바디에 들어갈 문자열을 작성한다. |

- JSON 생성
JSON 형식으로 데이터를 전송 할 수도 있다. 이때는 ContentType: "application/json" 으로 설정한다.
파싱 객체에 값을 넣은 뒤 ObjectMapper 의 writeValuesString 메서드를 사용하여 문자열로 변환한다.
HTML 전송때와 똑같이 PrinterWriter 객체를 통해 문자열을 입력한다.
| 메서드 | 반환타입 | 설명 |
| ObjectMapper .writeValueAsString (Class <T>) |
String | 파싱할 객체를 문자열로 변경한다. |

'프로그래밍 > Servlet' 카테고리의 다른 글
| [Servlet] MVC 패턴 업그레이드 하기 (0) | 2024.01.25 |
|---|---|
| [Servlet] MVC 패턴의 출현 (0) | 2024.01.24 |
| [Servlet] 서블릿이란 (0) | 2024.01.19 |
| [Servlet] 세션(Session) (0) | 2023.07.07 |
| [Servlet] 포워드, 바인딩 (0) | 2023.07.04 |
