[Spring] 2.์„œ๋ธ”๋ฆฟ

 

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

๋ฉ”๋‰ด์–ผ ๋ณด๊ณ  ๋”ฐ๋ผํ•˜๊ธฐ


2. Hello ์„œ๋ธ”๋ฆฟ

[ServletApplication.class]

ใ„ด hello.servlet

 

@ServletComponentScan

@ServletComponentScan //์„œ๋ธ”๋ฆฟ ์ž๋™ ๋“ฑ๋ก @SpringBootApplication
public class ServletApplication {
  public static void main(String[] args) {
    SpringApplication.run(ServletApplication.class, args);
  }
}

- ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ๋‚ด ํŒจํ‚ค์ง€ ํฌํ•จ ํ•˜์œ„ ํŒจํ‚ค์ง€ ์„œ๋ธ”๋ฆฟ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์ฐพ์•„์„œ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•ด์คŒ

 

[HelloServlet.class]

ใ„ด hello.servlet.basic

 

@WebServlet

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    System.out.println("HelloServlet.service");
    System.out.println("request = " + request);
    System.out.println("response = " + response);
    
    String username = request.getParameter("username");
    System.out.println("username = " + username);
    
    response.setContentType("text/plain");
    response.setCharacterEncoding("utf-8");
    response.getWriter().write("hello " + username);
      
  }
}

 

- HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋งตํ•‘๋œ URL์ด ํ˜ธ์ถœ๋˜๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

protected void service(HttpServletRequest request, HttpServletResponse response)

 

- ์„œ๋ธ”๋ฆฟ์€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‰ก๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

-> request.getParameter

 

- http ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ

-> reponse.getWriter().write("hello" + username);

 

* ํŽธ๋ฆฌํ•˜๊ฒŒ http ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋‹ค ๋ณด๋Š”๋ฒ•

-> src - main - resources - application.properties  => ์—ฌ๊ธฐ์— 

logging.level.org.apache.coyote.http11=debug

์ถ”๊ฐ€

 

* ์šด์˜์„œ๋ฒ„์—๋Š” ๋ชจ๋“  ์š”์ฒญ ์ •๋ณด ๋‹ค ๋‚จ๊ธฐ๋ฉด ์„ฑ๋Šฅ์ €ํ•˜

* ๊ฐœ๋ฐœํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

 

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋™์ž‘ ๋ฐฉ์‹ ์„ค๋ช…

- ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„ ๋„์›Œ์คŒ

  ํ†ฐ์บฃ ์„œ๋ฒ„๋Š” ๋‚ด๋ถ€์— ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ ๊ฐ€์ง€๊ณ ์žˆ์Œ

- ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ํ†ตํ•ด ์„œ๋ธ”๋ฆฟ ์ƒ์„ฑ (helloServlet)

 

HTTP์š”์ฒญ, HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€

- ์›น๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„์— ๋˜์ ธ์คŒ

 

๊ทธ๋Ÿฌ๋ฉด

-> request, response ๊ฐ์ฒด ๋งŒ๋“ค๊ณ 

-> ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋– ์žˆ๋Š” ํ—ฌ๋กœ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ

-> ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

-> request, response ๋„˜๊ฒจ์คŒ

-> ํ•„์š”ํ•œ ์ž‘์—…ํ•˜๊ณ  response์— ๋ฐ์ดํ„ฐ ๋„ฃ์–ด์คŒ

-> ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜๊ฐ€๋ฉด์„œ WAS ์„œ๋ฒ„๊ฐ€ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•ด์คŒ

-> ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธ๊ฐ€๋Šฅ

 

* ์ฐธ๊ณ ) HTTP ์‘๋‹ต์—์„œ Content-Length๋Š” ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์คŒ

 

 

welcome ํŽ˜์ด์ง€ ์ถ”๊ฐ€

ใ„ดmain - webapp - index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  
  <body> 
    <ul>
      <li><a href="basic.html">์„œ๋ธ”๋ฆฟ basic</a></li> 
    </ul>
  </body>
</html>

 

basic ํŽ˜์ด์ง€ ์ถ”๊ฐ€

ใ„ด main - webapp - basic.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body> 
    <ul>
      <li>hello ์„œ๋ธ”๋ฆฟ
        <ul>
          <li><a href="/hello?username=servlet">hello ์„œ๋ธ”๋ฆฟ ํ˜ธ์ถœ</a></li>
        </ul> 
      </li>
      <li>HttpServletRequest
        <ul>
          <li>
            <a href="/request-header">๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•, Header ์กฐํšŒ</a>
          </li> 
          <li>HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ
            <ul>
              <li><a href="/request-param?username=hello&age=20">GET -์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ</a>
            </li> li>
<li><a href="/basic/hello-form.html">POST - HTML Form</a></
<li>HTTP API - MessageBody -> Postman ํ…Œ์ŠคํŠธ</li> </ul>
</li> </ul>
      </li>
      <li>HttpServletResponse
<ul>
<li><a href="/response-header">๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•, Header ์กฐํšŒ</a></li> <li>HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์กฐํšŒ
<ul>
<li><a href="/response-html">HTML ์‘๋‹ต</a></li>
<li><a href="/response-json">HTTP API JSON ์‘๋‹ต</a></li>
</ul> </li>
</ul> </li>
  </ul>
  </body>
  </html>

3. HttpServletRequest ๊ฐœ์š”

HttpServletRequest ์—ญํ• - ์„œ๋ธ”๋ฆฟ์ด ๊ฐœ๋ฐœ์ž ๋Œ€์‹ ์— ์š”์ฒญ๋ฉ”์‹œ์ง€ ํŒŒ์‹ฑ- ๊ทธ ๊ฒฐ๊ณผ๋ฅผ HSR ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ œ๊ณต

- ์ž„์‹œ ์ €์žฅ์†Œ ๊ธฐ๋Šฅ

  > ์ €์žฅ : request.setAttribute(name, value)

  > ์กฐํšŒ : request.getAttribute(name)

 

์„ธ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

  > request.getSession(create: true)

 

์ค‘์š”)

HttpServletRequest, HttpServletResponse๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ์ด ๊ฐ์ฒด๋“ค์ด HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€, HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ์ฒด๋ผ๋Š” ์ ์ด๋‹ค.
๋”ฐ๋ผ์„œ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ๊นŠ์ด์žˆ๋Š” ์ดํ•ด๋ฅผ ํ•˜๋ ค๋ฉด HTTP ์ŠคํŽ™์ด ์ œ๊ณตํ•˜๋Š” ์š”์ฒญ, ์‘๋‹ต ๋ฉ”์‹œ์ง€
์ž์ฒด๋ฅผ ์ดํ•ด
ํ•ด์•ผ ํ•œ๋‹ค.

 

* ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— JSON์ด ๋“ค์–ด๊ฐ€๊ณ  / JSON ํŒŒ์‹ฑํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•ด์•ผํ•จ


4. HttpServletRequest ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

HttpServletRequest๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋“ค

 

 

RequestHeaderServlet.class

ใ„ดhello.servlet.basic.request

//http://localhost:8080/request-header?username=hello
@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    printStartLine(request);
    printHeaders(request);
    printHeaderUtils(request);
    printEtc(request);
    response.getWriter().write("ok");
  }
}

 

   //start line ์ •๋ณด
private void printStartLine(HttpServletRequest request) {
      System.out.println("--- REQUEST-LINE - start ---");
      System.out.println("request.getMethod() = " + request.getMethod()); //GET
      System.out.println("request.getProtocol() = " + request.getProtocol()); //
  HTTP/1.1
      System.out.println("request.getScheme() = " + request.getScheme()); //http
      // http://localhost:8080/request-header
      System.out.println("request.getRequestURL() = " + request.getRequestURL());
       // /request-header
      System.out.println("request.getRequestURI() = " + request.getRequestURI());
      //username=hi
      System.out.println("request.getQueryString() = " +
  request.getQueryString());
      System.out.println("request.isSecure() = " + request.isSecure()); //https
์‚ฌ์šฉ ์œ ๋ฌด
      System.out.println("--- REQUEST-LINE - end ---");
      System.out.println();
  }
 //Header ๋ชจ๋“  ์ •๋ณด
private void printHeaders(HttpServletRequest request) {
      System.out.println("--- Headers - start ---");
  /*
      Enumeration<String> headerNames = request.getHeaderNames();
      while (headerNames.hasMoreElements()) {
          String headerName = headerNames.nextElement();
          System.out.println(headerName + ": " + request.getHeader(headerName));
      }
*/
request.getHeaderNames().asIterator()
        .forEachRemaining(headerName -> System.out.println(headerName + ":
  " + request.getHeader(headerName)));
      System.out.println("--- Headers - end ---");
      System.out.println();
}

 

Header ํŽธ๋ฆฌํ•œ ์กฐํšŒ

//Header ํŽธ๋ฆฌํ•œ ์กฐํšŒ
private void printHeaderUtils(HttpServletRequest request) { System.out.println("--- Header ํŽธ์˜ ์กฐํšŒ start ---"); System.out.println("[Host ํŽธ์˜ ์กฐํšŒ]"); System.out.println("request.getServerName() = " +
request.getServerName()); //Host ํ—ค๋” System.out.println("request.getServerPort() = " +
request.getServerPort()); //Host ํ—ค๋” System.out.println();
System.out.println("[Accept-Language ํŽธ์˜ ์กฐํšŒ]"); request.getLocales().asIterator()
         .forEachRemaining(locale -> System.out.println("locale = " +
System.out.println("request.getLocale() = " + request.getLocale());
locale));
    System.out.println();
System.out.println("[cookie ํŽธ์˜ ์กฐํšŒ]"); if (request.getCookies() != null) {
        for (Cookie cookie : request.getCookies()) {
            System.out.println(cookie.getName() + ": " + cookie.getValue());
} }
    System.out.println();
System.out.println("[Content ํŽธ์˜ ์กฐํšŒ]");
    System.out.println("request.getContentType() = " +
request.getContentType());
System.out.println("request.getContentLength() = " +
   request.getContentLength());
      System.out.println("request.getCharacterEncoding() = " +
  request.getCharacterEncoding());
System.out.println("--- Header ํŽธ์˜ ์กฐํšŒ end ---");
      System.out.println();
  }

locale (์–ธ์–ด)


5. HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - ๊ฐœ์š”

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

3๊ฐ€์ง€

1) GET (์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ)
/url?username=hello&age=20
- ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌ
- ex) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•


2) POST (HTML Form)
content-type : application/x-www-form-urlencoded
- ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ
   username = hello&age = 20
- ex) ํšŒ์›๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, HTML Form ์‚ฌ์šฉ


3) HTTP message body (๋ฐ”๋””์— ๋ฐ์ดํ„ฐ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ)
- HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ, JSON, XML, TEXT
- ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON ์‚ฌ์šฉ
- POST, PUT, PATCH

6. HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - GET ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†ก

- ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด URL์˜ [์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ]๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

  ex) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

- ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” URL์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด '?'๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ณด๋ƒ„

- ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” '&'๋กœ ๊ตฌ๋ถ„

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

 

์„œ๋ฒ„์—์„œ๋Š” 'HttpServletRequest'๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ ๊ฐ€๋Šฅ

 

[์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ]

String username = request.getParameter("username"); //๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ 
Enumeration<String> parameterNames = request.getParameterNames(); //ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋“ค ๋ชจ๋‘ ์กฐํšŒ
Map<String, String[]> parameterMap = request.getParameterMap(); //ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map ์œผ๋กœ ์กฐํšŒ
String[] usernames = request.getParameterValues("username"); //๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

[RequestParamServlet]

/**
* 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 resp) throws ServletException, IOException {
    System.out.println("[์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - start");
    /*
    Enumeration<String> parameterNames = request.getParameterNames();
    while (parameterNames.hasMoreElements()) {
      String paramName = parameterNames.nextElement();
      System.out.println(paramName + "=" + request.getParameter(paramName));
    } 
    */
    
    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"); System.out.println("request.getParameter(username) = " + username);
    String age = request.getParameter("age");
    System.out.println("request.getParameter(age) = " + age);
    System.out.println();
    System.out.println("[์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ]"); 
    System.out.println("request.getParameterValues(username)"); 
    String[] usernames = request.getParameterValues("username"); 
    
    for (String name : usernames) {
      System.out.println("username=" + name);
    }
    
    resp.getWriter().write("ok");
    }
}

* ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’ ์ค‘๋ณตํ•ด์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ

* ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ํ™œ์šฉ


7. HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - POST  HTML Form

HTML Form ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

์ฃผ๋กœ ํšŒ์›๊ฐ€์ž… / ์ƒํ’ˆ ์ฃผ๋ฌธ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

 

[ํŠน์ง•]

- content-type : 'application/x-www-form-urlencoded' 

  HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ

- ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

   username=hello&age=20

<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>

- ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ๋‘˜์˜ ํ˜•์‹์ด ๋™์ผํ•˜๋ฏ€๋กœ 'request.getParameter()'๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ๋ถ„์—†์ด ์กฐํšŒ๊ฐ€๋Šฅ

 

* GET URL ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•  ๋• HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— content-type์ด ์—†๋‹ค.

* POST HTML Form ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๋ฉด HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋””์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€ content-type์„ ๊ผญ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค -> ํผ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก ํ˜•์‹์ด 'application/x-www-form-urlencoded'


8. HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - API ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” - ๋‹จ์ˆœ ํ…์ŠคํŠธ

HTTP message body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ

- HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ (JSON, XML, TEXT)

- ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON

- POST, PUT, PATCH

@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");
  }
}
inputStream์€ byte ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. byte ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž(String)๋กœ ๋ณด๋ ค๋ฉด ๋ฌธ์žํ‘œ
(Charset)๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” UTF_8 Charset์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

9. HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ - API ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” - JSON

HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

 

[JSON ํ˜•์‹ ์ „์†ก]- POST ( http://localhost:8080/request-body-json )- content-type : 'application/json'- message body : { "username" : "hello", "age" : 20 }- ๊ฒฐ๊ณผ : 'messageBody = { "username" : "hello", "age" : 20 }'

 

JSON ํ˜•์‹ ํŒŒ์‹ฑ ์ถ”๊ฐ€

 

lombok.Getter; lombok.Setter;ใ„ด importํ•ด์„œ getter setter ์ž๋™ ์ƒ์„ฑ

@Getter @Setter
public class HelloData {
  private String username;
  private int age;
}

์„œ๋ธ”๋ฆฟ

/**
* http://localhost:8080/request-body-json
*
* JSON ํ˜•์‹ ์ „์†ก
* content-type: application/json
* message body: {"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 {
    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
    System.out.println("messageBody = " + messageBody);
    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");
  }
}

์ฐธ๊ณ )

JSON ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด Jackson, Gson ๊ฐ™์€ JSON ๋ณ€ํ™˜
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ Spring MVC๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ Jackson
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ( ObjectMapper )๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•œ๋‹ค.

์ฐธ๊ณ )

HTML form ๋ฐ์ดํ„ฐ๋„ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋ฏ€๋กœ ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํŽธ๋ฆฌํ•œ ํŒŒ๋ฆฌ๋ฏธํ„ฐ ์กฐํšŒ
๊ธฐ๋Šฅ( request.getParameter(...) )์„ ์ด๋ฏธ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

10. HttpServletResponse - ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

HttpServletResponse ์—ญํ• 

 

HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ

- HTTP ์‘๋‹ต์ฝ”๋“œ ์ง€์ •

- ํ—ค๋” ์ƒ์„ฑ

- ๋ฐ”๋”” ์ƒ์„ฑ

 

ํŽธ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต

- Content-Type, ์ฟ ํ‚ค, Redirect

 

HttpServletResponse - ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
  
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
    //[status-line]
    response.setStatus(HttpServletResponse.SC_OK); //200
    //[response-headers]
    response.setHeader("Content-Type", "text/plain;charset=utf-8");
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("my-header","hello");
  
    //[Header ํŽธ์˜ ๋ฉ”์„œ๋“œ] 
    content(response); 
    cookie(response); 
    redirect(response);
    
    //[message body]
    PrintWriter writer = response.getWriter();
    writer.println("ok");
  }
}

Content ํŽธ์˜ ๋ฉ”์„œ๋“œ

private void content(HttpServletResponse response) {
  //Content-Type: text/plain;charset=utf-8 
  //Content-Length: 2
  //response.setHeader("Content-Type", "text/plain;charset=utf-8"); 
  response.setContentType("text/plain"); 
  response.setCharacterEncoding("utf-8"); 
  //response.setContentLength(2); 
  //(์ƒ๋žต์‹œ ์ž๋™ ์ƒ์„ฑ)
}

์ฟ ํ‚ค ํŽธ์˜ ๋ฉ”์„œ๋“œ

private void cookie(HttpServletResponse response) {
  //Set-Cookie: myCookie=good; Max-Age=600; 
  //response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600"); 
  Cookie cookie = new Cookie("myCookie", "good"); 
  cookie.setMaxAge(600); //600์ดˆ
  response.addCookie(cookie);
}

redirect ํŽธ์˜ ๋ฉ”์„œ๋“œ

private void redirect(HttpServletResponse response) throws IOException {
  //Status Code 302
  //Location: /basic/hello-form.html
  //response.setStatus(HttpServletResponse.SC_FOUND); //302
  //response.setHeader("Location", "/basic/hello-form.html");
  response.sendRedirect("/basic/hello-form.html");
}

11. HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ  - ๋‹จ์ˆœ ํ…์ŠคํŠธ, HTML

HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” ์ฃผ๋กœ ๋‹ค์Œ ๋‚ด์šฉ์„ ๋‹ด์•„์„œ ์ „๋‹ฌ

- ๋‹จ์ˆœ ํ…์ŠคํŠธ ์‘๋‹ต

  'writer.println("ok");'

- HTML ์‘๋‹ต

- HTTP API - MessageBody JSON ์‘๋‹ต

 

HttpServletResponse - HTML ์‘๋‹ต

@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
  
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
    
    //Content-Type: text/html;charset=utf-8
    response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");
    
    PrintWriter writer = response.getWriter(); writer.println("<html>"); 
    writer.println("<body>");
    writer.println(" <div>์•ˆ๋…•?</div>"); 
    writer.println("</body>"); 
    writer.println("</html>");
  }
}

- HTTP ์‘๋‹ต์œผ๋กœ HTML ๋ฐ˜ํ™˜ํ•  ๋• content-type์„ text/html๋กœ ์ง€์ •ํ•ด์•ผํ•จ

 

์‹คํ–‰

- http://localhost:8080/response-html


12. HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ  - API JSON

/**
* http://localhost:8080/response-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.setHeader("content-type", "application/json");
    response.setCharacterEncoding("utf-8");
    HelloData data = new HelloData();
    data.setUsername("kim");
    data.setAge(20);
    
    //{"username":"kim","age":20}
    String result = objectMapper.writeValueAsString(data);
    response.getWriter().write(result);
  } 
}
HTTP ์‘๋‹ต์œผ๋กœ JSON์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” content-type์„ application/json ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
Jackson
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” objectMapper.writeValueAsString() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ )

application/json ์€ ์ŠคํŽ™์ƒ utf-8 ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ •์˜๋˜์–ด ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ŠคํŽ™์—์„œ charset=utf-8
๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋”ฐ๋ผ์„œ application/json ์ด๋ผ๊ณ ๋งŒ ์‚ฌ์šฉํ•ด์•ผ์ง€
> application/json;charset=utf-8 ์ด๋ผ๊ณ  ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ ์—†๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ๋œ๋‹ค.
> response.getWriter()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด๋ฒ„๋ฆฐ๋‹ค.
์ด๋•Œ๋Š”
response.getOutputStream()์œผ๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ