김영한님의 스프링 MVC 1편 강의를 듣고 복습 겸 정리하는 포스팅입니다!!
아직 공부하는 중인 학생이라 부족한 부분이 있을 수 있습니다.
혹시라도 틀린 부분이 있다면 언제든지 댓글로 남겨주세요. 감사합니다 🙇♂️
서블릿(Servlet)
- 서블릿은 HTTP 요청 메시지를 파싱하고 쉽게 사용할 수 있도록 도와주는 자바 웹 기술
- 개발자가 직접 복잡한 HTTP 메시지를 파싱하지 않아도, 서블릿이 HttpServletRequest와 HttpServletResponse 객체를 제공하여 손쉽게 요청/응답을 처리할 수 있게 해줌
HttpServletRequest - 요청 객체
클라이언트 → 서버로 전송된 HTTP 요청 메시지를 다룰 수 있게 해주는 객체
임시 저장소 기능
- 요청 동안 데이터를 저장하고 공유할 수 있다.
- HTTP 요청이 살아있는 동안만 유지
request.setAttribute(name, value); // 저장
request.getAttribute(name); // 조회
HttpServletResponse - 응답 객체
서버 → 클라이언트로 전송된 HTTP 요청 메시지를 만들 때 사용하는 객체
GET 방식 - 쿼리 파라미터 전송
GET 요청은 URL에 데이터를 포함해서 서버로 전달
→ 메시지 바디 없이 ? 를 사용해 파라미터를 전송하며, 여러 파라미터는 & 로 구분
GET /url?username=hello&age=20
http://localhost:8080/request-param?username=hello&age=20
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 전체 파라미터 조회
System.out.println("[전체 파라미터 조회] - start");
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
System.out.println("[전체 파라미터 조회] - end");
System.out.println();
// 2. 단일 파라미터 조회
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();
// 3. 이름이 같은 복수 파라미터 조회
System.out.println("[이름이 같은 복수 파라미터 조회]");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
}
}

전체 파라미터를 조회
request.getParameterNames().asIterator()
.forEachRemaining(paramName ->
System.out.println(paramName + "=" + request.getParameter(paramName)));
- getParameterNames()는 모든 키를 조회 가능
- 각 키에 대해 getParameter(키)를 호출하면 해당 값을 가져올 수 있음
이름이 같은 복수 파라미터를 조회
http://localhost:8080/request-param?username=hello&age=20&username=hello2
- username이라는 이름의 파라미터가 두 번 등장
- 이 경우, getParameter("username")은 가장 먼저 등장한 값(hello)을 반환
- 모든 값을 조회하려면 getParameterValues("username") 사용
POST - HTML Form 방식의 데이터 전송
- content-type은 application/x-www-form-urlencoded형식을 사용
- 메시지 바디에 데이터가 포함
POST /submit
Content-Type: application/x-www-form-urlencoded
username=hello&age=20

HTML Form을 이용한 POST 요청 시, 브라우저는 다음과 같은 형식의 HTTP 메시지를 생성한다.
- 요청 URL: http://localhost:8080/request-param
- content-type: application/x-www-form-urlencoded
- message body: username=hello&age=20
GET 방식: URL 뒤에 파라미터 포함 → ?username=hello&age=20
POST 방식: 메시지 바디에 파라미터 포함 → username=hello&age=20
형식 자체는 동일 → key=value&key=value 형식 ➡️ 서버에서는 둘 다 동일하게 처리 가능
String username = request.getParameter("username");
String age = request.getParameter("age");
request.getParameter()
- GET URL 쿼리 파라미터 형식도 지원
- POST HTML Form 형식도 지원
HTTP 요청 데이터 - API 메시지 바디
- HTTP 메시지 바디에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용 (JOSN, XML, TEXT)
- POST, PUT, PATCH
POST /api/users
Content-Type: application/json
{
"username": "hello",
"age": 20
}
@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 {
// 1. HTTP 메시지 바디를 직접 읽는다.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
// 2. JSON 데이터를 Java 객체로 변환한다.
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
response.getWriter().write("ok");
}
}
ObjectMapper는 Jackson 라이브러리의 클래스이며, 복잡한 JSON도 손쉽게 Java 객체로 변환할 수 있다.
HttpServletResponse
서버가 클라이언트에게 HTTP 응답 메시지를 보낼 때 사용하는 객체
- HTTP 응답코드 지정
- 헤더 생성
- 응답 바디(본문) 생성
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//[status-line]
response.setStatus(HttpServletResponse.SC_OK); //응답코드
//[response-headers]
//response.setHeader("Content-Type","text/plain; charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // 캐시를 완전히 무효화
response.setHeader("Progma", "no-cache");
response.setHeader("my-header","hello");
PrintWriter writer = response.getWriter();
writer.print("ok");
}
JSON 으로 값을 반환하는 방법
@WebServlet(name="responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type : application/json
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
HelloData helloData = new HelloData();
helloData.setUsername("jin");
helloData.setAge(20);
// {"username" : "jin", "age" : 20};
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
}
}
'Spring Study' 카테고리의 다른 글
[스프링 MVC] #3 (1) | 2025.04.27 |
---|---|
[스프링 MVC] #1 (0) | 2025.04.10 |
[스프링 핵심 원리] - 기본편 #9 (1) | 2025.04.10 |
[스프링 핵심 원리] - 기본편 #8 (0) | 2025.04.03 |
[스프링 핵심 원리] - 기본편 #7 (0) | 2025.04.02 |