SpringBoot/Spring 김영한님

김영한 Spring MVC (2) - GET, POST, QueryParameter, JSP

함형우 2023. 3. 23. 17:14
728x90

HTTP 요청 데이터 - 개요

  • “GET-쿼리 파라미터”
    • /url=?username=hello&age=20
    • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함하여 전달
    • 검색 혹은 필터, 페이징에서 많이 사용된다.
  • “POST - HTML FORM”
    • content-type:application/
    • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
  • “HTTP message body”에 데이터를 직접 담아 요청
    • HTTP AI에서 주로 사용 : JSON, XML, TEXT

HTTP 요청 데이터 - GET 쿼리 파라미터

전달해야하는 데이터

  • username=hello
  • age=20

메시지 바디 없이 URL의 “쿼리 파라미터”를 사용하여 데이터를 전달하려고 한다.

/**
 * 1. 파라미터 전송 기능
 * <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 req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("[전체 파라미터 조회] - start");
        req.getParameterNames().asIterator()
                        .forEachRemaining(paramName -> System.out.println(paramName + "=" + req.getParameter(paramName)));

        System.out.println("[단일 파라미터 조회]");
        String username = req.getParameter("username");
        String age = req.getParameter("age");

        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println();

        System.out.println("[이름이 같은 복수 파라미터 조회]");
        String[] usernames = req.getParameterValues("username");
        for ( String name : usernames ) {
            System.out.println("username = " + name);
        }
    }
}

복수 파라미터에서 단일 파라미터 조회

username=hello&username=kim과 같이 파라미터 이름은 하나인데, 값이 중복이면 어떻게 될까

request.getParamaeter()는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을때 사용한다. 중복일때 request.getParameter() 를 사용하게 되면 첫 번째 값만 반환한다.

중복으로 보내는 경우는 보통 존재하지 않는다.


HTTP 요청 데이터 - POST HTML FORM

HTML의 FORM 태그를 사용하여 클라이언트에서 서버로 데이터를 전송해보자

<form action="/request-param" method="post">
 username: <input type="text" name="username" />
 age: <input type="text" name="age" />
 <button type="submit">전송</button>

HTTP 요청 데이터 - API 메시지 바디 - 단순 텍스트

  • “HTTP message body”에 데이터를 직접 담아 요청
  • 가당 먼저 단순한 텍스트 메시지를 HTTP 메시지 바디에 담아서 전송, 읽어보자
  • InputStream을 사용해서 직접 읽을 수 있

HTTP 요청 데이터 - API 메시지 바디 - JSON

참고 JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson,Gson 같은 변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트 Spring MVC를 선택하면 기본으로 라이브러리를 함께 제공한다.

HttpServletResponse - 기본 사용법

“HTTP 응답 메시지 생성”

  • HTTP 응답 코드 지정
  • 헤더생성
  • 바디생성

“편의 기능 제공”

  • Content-Type, 쿠키, Redirect

템플릿 엔진으로 (JSP)

지금까지 Servlet과 자바 코드만으로 HTML을 만들어보았다. 서블릿 덕분에 동적으로 원하는 HTML을 마음껏 만들 수 있다. 정적인 HTML 문서라면 화면이 계속 달라지는 정적 결과나 동적 HTML 코드를 만드는 일은 불가능 할 것이다.

그런데, 코드에서 보듯이 이것은 매우 복잡하고 비효율 적이다. 자바 코드로 HTML을 만들어 내는 것 보다차라리 HTML 문서에 동적으로 변경해야 하는 부분만 자바 코드를 넣을 수 있다면 더 편리할 것이다.이것이 바로 템플릿 엔진이 나온 이유이다.

템플릿 엔진을 사용하면 HTML 문서에서 필요한 곳만 코드를적용해서 동적으로 변경할 수 있다.

템플릿 엔진에는 JSP, Thymeleaf, Freemarker, Velocity등이 있다.

참고

JSP는 성능과 기능면에서 다른 템플릿 엔진과의 경쟁에서 밀리면서, 점점 사장되어 가는 추세이다. 템플릿 엔진들은 각각 장단점이 있는데, 강의에서는 JSP는 앞부분에서 잠깐 다루고, 스프링과 잘 통합되는 Thymeleaf를 사용한다.

서블릿과 JSP의 한계

서블릿으로 개발할 경우, View 화면을 위한 HTML을 만드는 작업이 너무 지저분하고 복잡했다. JSP를 사용한 덕분에 뷰를 생성하는 HTML 작업을 깔끔하게 가져가고, 중간중간 동적으로 변경하여 필요한 부분만 자바 코드를 적용했다.

그러나 코드의 절만은 비즈니스 로직이고, 하위 절반은 HTML을 위한 뷰 영역이다. JSP가 너무 많은 역할을 한다. 유지보수를 고려하면 너무나도 어렵고, 힘들다.

MVC 패턴의 등장

비즈니스 로직은 서블릿처럼 다른곳에서 처리하고, JSP는 목적에 맞게 HTML 화면을 그리는 일에 집중시키기 위해 MVC 패턴이 등장했다.

728x90