관리 메뉴

Rootable의 개발일기

서블릿(Servlet) 활용 본문

Spring

서블릿(Servlet) 활용

dev-rootable 2023. 7. 12. 20:45

 

WAS는 클라이언트의 요청 데이터를 서블릿에게 주면서 적절한 응답 데이터를 내려주는 임무를 맡긴다.

 

💡 HttpServletRequest와 HttpServletResponse의 주목적은?

HttpServletRequest는 요청을 읽는 것이 목적이고, HttpServletResponse는 응답을 어떻게 생성할지가 목적이다.

 

📌 HttpServletRequest

 

WAS가 서블릿이 활용할 수 있도록 전달하는 객체로, HTTP 요청 메시지를 파싱 한 결과를 담은 객체

 

이 객체는 주로 HTTP 요청 데이터를 단순히 읽거나 개발자가 만든 객체에 파싱 하는 데 사용된다.

 

🔎 기본 메서드

 

"requestHeaderServlet"이라는 서블릿은 "localhost:8080/request-header" 요청에 응답

 

✔ Start Line 요청 정보

 

 

 

✔ 모든 헤더 조회

 

 

✔ 헤더 편의 조회 기능

 

 

 

Postman으로 hello!라는 데이터 POST요청

 

 

📌 HTTP 요청 데이터 다루기

 

🔎 GET 쿼리 파라미터

 

URL의 쿼리 파라미터에 데이터를 포함해서 전달하는 방식으로 메시지 바디부가 없다.

 

✔ 전체 파라미터 조회

 

요청 URL: http://localhost:8080/request-param?username=hello&age=20

 

 

✔ 단일 파라미터 조회

 

요청 URL: http://localhost:8080/request-param?username=hello&age=20

 

 

✔ 이름이 같은 복수 파라미터 조회

 

쿼리 파라미터에 username이 2개 있는 상황

 

요청 URL: http://localhost:8080/request-param?username=hello&username=kim&age=20

 

 

🔎 POST HTML Form

 

HTML Form 데이터 전송

 

메시지 바디에 쿼리 파라미터 형식(username=kim&age=20)으로 데이터를 전달하는 방식으로, 주로 HTML Form 태그에 입력한 값을 전달하는 식이다.

 

✔ Postman 테스트

 

GET 쿼리 파라미터와 service 메서드 코드 동일

 

요청 헤더부 셋팅

 

요청 바디부 셋팅

 

 

파라미터 조회는 GET 쿼리 파라미터 형식과 동일하게 request.getParameter()로 편리하게 조회할 수 있다.

 

💡 Content-type

HTTP 메시지 바디의 데이터 형식을 지정한다.

GET URL 쿼리 파라미터 형식
메시지 바디를 사용하지 않으므로 Content-type이 없다.

POST HTML Form 형식
HTTP 메시지 바디에 해당 데이터를 포함해서 보내기 때문에 Content-type을 꼭 지정해야 한다. 이렇게 Form으로 데이터를 전송하는 형식을
application/x-www-form-urlencoded이라 한다.

 

💡 GET 요청에 content-type을 application/x-www-form-urlencoded로 하면 어떻게 될까

400 Error 발생

tomcat의 Request class에 있는 parseParameters()라는 메서드에서 넘어온 데이터를 parsing 하는데,
이때 http method가 post인지 확인하고 post가 아니라면 message-body의 데이터를 파싱 할 수 없게 되어 있다.

Reference:
https://jungguji.github.io/2021/11/21/content-type-application-x-www-form-urlencoded%EB%8A%94-POST%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C%EB%A7%8C/
 

content-type application/x-www-form-urlencoded는 POST방식으로만

서론오늘도 어김없이 영한님의 스프링 MVC 강의를 듣고 있었는데, html form 데이터를 body에 보낼 때는 post 방식 밖에 안된다는 말씀을 하시기에…‘그럼 GET 방식도 안된다는건가?’ 라는 궁금증이

jungguji.github.io

 

🔎 API - 단순 텍스트

 

HTTP API에서 주로 사용하며, HTTP 메시지 바디에 text 데이터를 직접 전송할 수 있다.

 

✔ Postman 테스트

 

요청 헤더부 셋팅

 

요청 바디부 셋팅

 

Stream으로 들어온 외부 데이터 -> String 변환하여 읽음

 

 

 

🔎 API - JSON

 

HTTP API에서 주로 사용하며, HTTP 메시지 바디에 JSON 데이터를 직접 전송할 수 있다.

 

✔ Postman 테스트

 

요청 헤더부 셋팅

 

요청 바디부 셋팅

 

JSON 데이터를 파싱할 HelloData 객체

 

 

 


💡 ObjectMapper


JSON 결과를 파싱 해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다.

SpringMVC를 사용하면 기본으로 Jackson 라이브러리인 ObjectMapper를 함께 제공한다.

1) ObjectMapper.readValue()
JSON -> Java Object (직렬화, Serialization)
데이터 흐름: 외부 -> 내부

2) ObjectMapper.writeValue()
Java Object -> JSON (역직렬화, Deserialization)
데이터 흐름: 내부 -> 외부

Reference:
https://velog.io/@zooneon/Java-ObjectMapper%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-JSON-%ED%8C%8C%EC%8B%B1%ED%95%98%EA%B8%B0#java-object-%E2%86%92-json
 

[Java] ObjectMapper를 이용하여 JSON 파싱하기

Jackson 라이브러리의 ObjectMapper 클래스를 이용하여 JSON을 파싱해봅시다.

velog.io

 

📌 HttpServletResponse

 

WAS가 서블릿이 활용할 수 있도록 전달하는 객체로, HTTP 응답 메시지에 접근하는 인터페이스를 제공하는 객체

 

🔎 기본 메서드

 

✔ setHeader 사용

 

응답 헤더 설정

 

 

✔ 상태 코드

 

상태 코드 설정(200 OK)

 

✔ 쿠키 관련 편의 메서드

 

 

 

✔ Contents 관련 편의 메서드

 

 

✔ Redirect 관련 편의 메서드

 

302 응답으로 해당 URL 접근 시 hello-form.html 화면으로 리다이렉트

 

 

📌 HTTP 응답 데이터 다루기

 

🔎 단순 텍스트

 

응답 메시지 바디부에 "ok"를 넣음

 

🔎 HTML

 

 

 

🔎 API - JSON

 

파싱용 HelloData의 세팅된 값을 JSON 형태로 브라우저로 내림(Java Object -> JSON)

 

JSON 생성 후 String 반환

 

 

Reference:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

 

'Spring' 카테고리의 다른 글

HTTP 요청 매핑  (0) 2023.07.15
@RequestParam vs @ModelAttribute vs @RequestBody  (0) 2023.07.14
서블릿(Servlet) 기본  (1) 2023.07.11
웹 서버와 웹 애플리케이션 서버(WAS)  (0) 2023.07.11
빈 스코프  (0) 2023.05.26