728x90
Dependency
- Spring Web
- Lombok
지원형식도 jar이 아닌 war로 설정 (jsp 실행을 위해)
이 두개만 사용해서 gradle 환경설정을 마쳐준다.
@ServletComponentScan 애노테이션을 사용하여 서블릿을 자동 등록
package hello.servlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
서블릿 컨테이너
동작방식
- 웹 브라우저가 HTTP 요청을 보낸 후, 웹 애플리케이션 서버(WAS)로 전달된다.
- 웹 애플리케이션 서버(WAS)는 요청을 request 객체로 받으며, 이를 처리하기 위해 서블릿 컨테이너로 전달한다.
- 서블릿 컨테이너는 요청을 처리할 서블릿(helloServlet)을 실행한다.
- 서블릿은 요청을 처리하고, 응답 객체(response)를 생성하여 다시 웹 애플리케이션 서버(WAS)로 전달한다.
- 여기서 request와 response는 서블릿 API에서 사용되는 주요 객체로, 각각 클라이언트의 요청 정보와 서버의 응답 정보를 담는다.
- 웹 애플리케이션 서버(WAS)는 서블릿에서 생성한 응답 객체를 바탕으로 HTTP 응답 메시지를 생성한다.
- 이 응답은 다시 클라이언트(웹 브라우저)로 전송된다.
- 클라이언트는 최종적으로 hello world라는 응답 메시지를 받게 된다.
HttpServletRequest
- HTTP 요청 메시지를 편리하게 조회가 가능함
- 임시 저장소 기능
- 저장 : requset.setAttribute(name, value)
- 조회 : request.getAttribute(name) - 세션 관리 기능
request.getSession(create : true)
HTTP 요청 방식
Get - QueryParameter
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- cf) 검색, 필터, 페이징등에서 많이 사용하는 방식
쿼리 파라미터는 URL에 ?을 시작으로 보내며 추가 파라미터는 &로 구분한다
cf) /localhost8080/request-param?username=hello&age=20
코드
package hello.servlet.basic.request;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 1. 파라미터 전송 기능
* http://localhost:8080/request-param?username=hello&age=20
* <p>
* 2. 동일한 파라미터 전송 가능
* http://localhost:8080/request-param?username=hello&username=kim&age=20
*/
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[전체 파라미터 조회] - start");
request.getParameterNames().asIterator().forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
System.out.println("[전체 파라미터 조회] - end");
System.out.println();
System.out.println("[단일 파라미터 조회]");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("username = " + username);
System.out.println("age = " + age);
System.out.println();
System.out.println("[이름이 같은 복수 파라미터 조회]");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
response.getWriter().write("ok");
}
}
전체파라미터 조회 코드 동작 구성
- request.getParameterNames().asIterator()는 Iterator를 반환합니다. 이 Iterator는 username과 age를 포함합니다.
- forEachRemaining 메서드는 Iterator의 각 요소에 대해 작업을 수행합니다. 여기서는 각 파라미터 이름(paramName)을 반복합니다.
- 각 파라미터 이름에 대해, System.out.println을 사용하여 이름과 해당 값을 출력합니다.
- 첫 번째 반복에서, paramName은 username이고, request.getParameter("username")은 hello를 반환합니다.
- 두 번째 반복에서, paramName은 age이고, request.getParameter("age")은 20을 반환합니다.
Post - HTML Form
- content-type: application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
- cf) 회원 가입, 상품 주문, HTML Form 사용
html에서 form 생성 후 data를 보냄
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html
포스트 맨을 사용해서도 확인이 가능하다!
API 메시지 바디 - 단순 텍스트
HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT
- 데이터 형식은 주로 JSON 사용
- POST, PUT, PATCH
텍스트 형식으루 date 주고받기
package hello.servlet.basic.request;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
response.getWriter().write("ok");
}
}
JSON 형식으로 data 주고받기
package hello.servlet.basic.request;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("Request body: " + messageBody);
}
}
Json 형태 객체변환해서 받기
package hello.servlet.basic.request;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("Request body: " + messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getUsername());
response.getWriter().write("ok");
}
}
728x90
'Frameworks > Spring(개인)' 카테고리의 다른 글
[SpringBoot] ResponseBodyAdvice로 API 응답 통합시키기 (0) | 2025.02.19 |
---|---|
[Spring 개인] Web Server, Web Application Sever (1) | 2024.06.08 |
[Spring 개인] 스프링 컨테이너 / 스프링 빈 조회 (0) | 2024.06.07 |
[Spring 개인] Spring Security JWT (Access/Refresh Token) (1) | 2024.05.30 |
[Spring 개인] Spring Security OAuth2 + JWT (0) | 2024.05.29 |