๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์ธํ”„๋Ÿฐ - ์Šคํ”„๋ง MVC 1ํŽธ] HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ

by YeonBu 2024. 5. 15.
728x90

 

 

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  | ๊น€์˜ํ•œ - ์ธํ”„๋Ÿฐ

๊น€์˜ํ•œ | ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต

www.inflearn.com

 

 

 

 

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

 

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

 

1) GET - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

 - /url?username=kim&age=20

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

   ์˜ˆ) ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง• ๋“ฑ

 

2) POST - HTML Form

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

 - ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ username=kim&age=20

   ์˜ˆ) ํšŒ์›๊ฐ€์ž…, ์ƒํ’ˆ์ฃผ๋ฌธ, HTML Form ์‚ฌ์šฉ

 

3) HTTP message Body์— ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ

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

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

 - POST, PUT, PATCH

 

 

 

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

 

๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ์—†์ด, URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†กํ•ด๋ณด์ž

์ „๋‹ฌ ๋ฐ์ดํ„ฐ
- username = kim
- age = 20

 

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” URL์— ?๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” &์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

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

 

 

์„œ๋ฒ„์—์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ(์ „์ฒด ์ฝ”๋“œ)

/**
 * 1. ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก
 * http://localhost:8080/request-param?username=kim&age=20
 *
 * 2. ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก
 * http://localhost:8080/request-param?username=kim&age=20&username=park&age=25
 */
@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("[๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - START");
        String username = request.getParameter("username");
        String age = request.getParameter("age");
        System.out.println("username = " + username + ", age = " + age);
        System.out.println("[๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - END");
        System.out.println();

        System.out.println("[์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - START");
        String[] usernames = request.getParameterValues("username");
        String[] ages = request.getParameterValues("age");
        for (String s : usernames) {
            System.out.println("username = " + s);
        }
        Arrays.stream(ages).forEach(ag -> System.out.println("age = " + ag));
        System.out.println("[์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - END");
        System.out.println();

    }
}

 

 

1) ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ (getParameterNames)

System.out.println("[์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - START");
request.getParameterNames().asIterator()
        .forEachRemaining(paramName -> System.out.println(paramName + " = " + request.getParameter(paramName)));
System.out.println("[์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - END");
System.out.println();

 

๋”๋ณด๊ธฐ

๐Ÿ’ก Iterator๋ž€?

: ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค 

 

๊ด€๋ จ ๋ฉ”์†Œ๋“œ

- forEachRemaining() : ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜ ์ž‘์—…์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ง€์ •๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ๋ฉ”์†Œ๋“œ

- hasNext() : ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜

- next() : ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ hasNext()๋กœ ๋‹ค์Œ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•จ

- remove() : ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์—์„œ ์ œ๊ฑฐ

 

 

2) ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ(getParameter)

System.out.println("[๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - START");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("username = " + username + ", age = " + age);
System.out.println("[๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - END");
System.out.println();

 

 

 

3) ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ(getParameterVlues)

System.out.println("[์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - START");
String[] usernames = request.getParameterValues("username");
String[] ages = request.getParameterValues("age");
for (String s : usernames) {
    System.out.println("username = " + s);
}
Arrays.stream(ages).forEach(ag -> System.out.println("age = " + ag));
System.out.println("[์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ] - END");
System.out.println();

 

- ์ด๋ฆ„์ด ์ค‘๋ณต์ผ ๋•Œ request.getParameter()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

 

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

 

์ด๋ฒˆ์—๋Š” HTML์˜ Form์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด๋ณด์ž

content-type : application/x-www-form-urlencoded
๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ

 

 

HTML Form ์ƒ์„ฑ(๊ท€์ฐฎ์œผ๋ฉด ํฌ์ŠคํŠธ๋งจ ์‚ฌ์šฉ)

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

 

๋ฐ์ดํ„ฐ ์ „์†ก ํ›„ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ๋กœ ํ™•์ธํ•˜๋ฉด

๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

 

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

 

๋จผ์ € ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋‹ด์•„์„œ ์ „์†กํ•˜๊ณ  ์ฝ์–ด๋ณด์ž

 

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

 

ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ์ „์†ก ํ›„ ์ฝ˜์†” ์ฐฝ

 

- HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋ฅผ InputStream์„ ํ†ตํ•ด ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค

 

 

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

 

 

JSON ํŒŒ์‹ฑ์„ ์œ„ํ•ด ๊ฐ์ฒด ์ƒ์„ฑ

@Getter @Setter
public class HelloData {

    private String username;
    private int age;

}

 

 

@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("username = " + helloData.getUsername());
        System.out.println("age = " + helloData.getAge());

    }
}

 

- JSON ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด Jackson, Gson ๊ฐ™์€ JSON ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ

์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

- ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ Spring MVC๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ObjectMapper)๋ฅผ ์ œ๊ณตํ•œ๋‹ค

๋ฐ˜์‘ํ˜•