본문 바로가기

Spring Study

[스프링 MVC] #2

반응형

김영한님의 스프링 MVC 1편 강의를 듣고 복습 겸 정리하는 포스팅입니다!!

아직 공부하는 중인 학생이라 부족한 부분이 있을 수 있습니다. 

혹시라도 틀린 부분이 있다면 언제든지 댓글로 남겨주세요. 감사합니다 🙇‍♂️ 


서블릿(Servlet)

  • 서블릿은 HTTP 요청 메시지를 파싱하고 쉽게 사용할 수 있도록 도와주는 자바 웹 기술
  • 개발자가 직접 복잡한 HTTP 메시지를 파싱하지 않아도, 서블릿이 HttpServletRequestHttpServletResponse 객체를 제공하여 손쉽게 요청/응답을 처리할 수 있게 해줌

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);
    }
}

 

 

728x90

'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