jiisoo
์ง€์ˆ˜๋กœ๊ทธ
jiisoo
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • home
  • Github
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ €์žฅ์†Œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (80)
    • Java (1)
    • Spring (30)
    • JPA (15)
    • cs (8)
      • ๋””์ž์ธํŒจํ„ด (1)
      • ๋„คํŠธ์›Œํฌ (5)
      • Database (1)
      • ์šด์˜์ฒด์ œ (1)
    • algorithm (18)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ & ์ž๋ฃŒ๊ตฌ์กฐ ์ด๋ก  (12)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด (6)
    • ๋ฉด์ ‘ ์ค€๋น„ (0)
    • ํšŒ๊ณ  (5)
      • ATDD (4)
      • ํ•™์Šตํ…Œ์ŠคํŠธ๋กœ ๋ฐฐ์šฐ๋Š” spring 2๊ธฐ (1)
      • ํ”„๋กœ์ ํŠธ (0)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํƒœ๊ทธ

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
jiisoo

์ง€์ˆ˜๋กœ๊ทธ

[spring] HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ
Spring

[spring] HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ

2023. 2. 22. 20:40

๐ŸŒณ HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ

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

1๏ธโƒฃ GET- ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

  • /url?username=hello&age=20
  • ๋ฉ”์„ธ์ง€ ๋ฐ”๋”” ์—†์ด, URL์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

2๏ธโƒฃ POST - HTML Form

  • content-type : application/x-www-form-urlencoded
  • ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ username=hello&age=20 ํ•œ๋‹ค.

3๏ธโƒฃ HTTP message body ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ

  • HTTP API ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , JSON, XML, TEXT ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON ์„ ์‚ฌ์šฉ
    • POST, PUT, PATCH

 

 

  • ์œ„์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

๐ŸŒฟ GET - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ 

  • ์ „๋‹ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ํ•ด๋ณด์ž.
    • username=hello 
    • age=20 
  • ๋ฉ”์„ธ์ง€ ๋ฐ”๋”” ์—†์ด URL ์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณดํ†ต ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง• ๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

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

์˜ˆ์‹œ ) localhost:8080/search/sale/price?low=10000&high=50000

 

  • ์„œ๋ฒ„๋Š” HttpServletRequest ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
String username = request.getParameter("username"); //๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ 
Enumeration<String> parameterNames = request.getParameterNames(); //ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋“ค ๋ชจ๋‘ ์กฐํšŒ
Map<String, String[]> parameterMap = request.getParameterMap(); //ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Map ์œผ๋กœ ์กฐํšŒ
String[] usernames = request.getParameterValues("username"); //๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ
  • ๋งŒ์•ฝ ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
String[] usernames = request.getParameterValues("userName");

โ“ username=hello&username=kim ๊ณผ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ํ•˜๋‚˜์ธ๋ฐ ๊ฐ’์ด ์ค‘๋ณต์ด๋ฉด ์–ด๋–ป๊ฒŒ ์กฐํšŒํ•ด ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?

  • request.getParameter()๋Š” ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์žˆ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ 
  • ์ง€๊ธˆ์ฒ˜๋Ÿผ ์ค‘๋ณต์ผ ๊ฒฝ์šฐ request.getParameterValues()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

 

๐ŸŒฟ POST - HTML  Form 

  • 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>
  • ์ฃผ๋กœ ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • POST์˜ HTML Form ์„ ์ „์†กํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์™ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด HTTP ๋ฉ”์„ธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ด๋•Œ Content-type ์ด application/x-www-form-urlencoded ํ˜•์‹์ธ๋ฐ 
  • ์ด ํ˜•์‹์€ GET์—์„œ ์‚ดํŽด๋ณธ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ ์ž…์žฅ์—์„œ๋Š” ๋‘ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ์„œ๋ฒ„์—์„œ๋Š” ๋‘˜์˜ ํ˜•์‹์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—
  • request.getParameter() ๋กœ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

cf. content-type ์€ HTTP ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •ํ•œ๋‹ค.

  • ๋•Œ๋ฌธ์— body๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฐ”๋””์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€ ๊ผญ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ํผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ˜•์‹์„ application/x-www-form-urlencoded ๋ผ๊ณ  ํ•œ๋‹ค.

 

 

๐ŸŒฟ API ๋ฉ”์„ธ์ง€ ๋ฐ”๋””

  • HTTP API ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ HTTP message body ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ์š”์ฒญํ•œ๋‹ค.
  • JSON, XML, TEXT๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ˜•์‹์ธ๋ฐ, ์ตœ๊ทผ์—๋Š” JSON์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ’ก ๋‹จ์ˆœ ํ…์ŠคํŠธ 

  • postman์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•ด๋ณด์ž.

 

content-type = text/plain , message body = row - text ๋กœ ์„ค์ •

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

 

 

๐Ÿ’ก JSON

  • postman ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•ด๋ณด์ž.

content-type = application/json

  • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ 
  • JSON ํ˜•์‹์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ๊ฐ์ฒดํ™” ์‹œ์ผœ์ค„ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
@Getter
@Setter
@ToString
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("helloData = " + helloData.getUsername());
        System.out.println("helloData = " + helloData.getAge());

        response.getWriter().write("ok");
    }
}

์‹คํ–‰๊ฒฐ๊ณผ

 

 

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

 

 

 

 

 

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

'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[spring] HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ  (0) 2023.02.27
[spring] HttpServletResponse  (0) 2023.02.23
[spring] HttpServletRequest  (0) 2023.02.21
[spring] ์„œ๋ธ”๋ฆฟ  (0) 2023.02.20
[spring] ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดํ•ด  (0) 2023.02.18
    'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [spring] HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ
    • [spring] HttpServletResponse
    • [spring] HttpServletRequest
    • [spring] ์„œ๋ธ”๋ฆฟ
    jiisoo
    jiisoo

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”