๐Ÿ“—Spring MVC Study [ HTTP REQUEST (GET, POST, API) ]

Caruhยท2025๋…„ 3์›” 17์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
6/17
post-thumbnail

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

  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” 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"); //๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ

  • username=hello&username=kim&username=dong์ผ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์กฐํšŒ๋ฅผ ํ•ด์•ผํ• ๊นŒ?
  • request.getParameter๋Š” ํ•˜๋‚˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์— ๋Œ€ํ•ด์„œ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์ค‘๋ณต์ผ ๊ฒฝ์šฐ request.getParameter()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด request.getParameterValues()์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

ํŠน์ง•

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

์ •๋ฆฌ

  • request.getParameter()๋Š” GET URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹๋„ ์ง€์›, POST HTML Form ํ˜•์‹๋„ ์ง€์›ํ•œ๋‹ค.

์ฐธ๊ณ 

  • content-type์€ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •
  • GET URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— content-type์ด ์—†๋‹ค.
  • POST HTML Form ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€ content-type์„ ๊ผญ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํผ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ˜•์‹์„ application/x-www-form-urlencoded๋ผ๊ณ  ํ•œ๋‹ค.

API ๋ฉ”์‹œ์ง€ ๋ฐ”๋””

๋‹จ์ˆœ ํ…์ŠคํŠธ๋ฅผ JSON ํ˜•ํƒœ๋กœ request ์š”์ฒญ

  • HTTP message body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์š”์ฒญ
    • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ, JSON, XML, TEXT
    • ๋ฐ์ดํ„ฐ ํ˜•์‹์€ ์ฃผ๋กœ JSON์‚ฌ์šฉ
    • POST, PUT, PATCH ํ˜•ํƒœ๋กœ ์š”์ฒญ
  • HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ๋ฅผ InputStream์„ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์ฐธ๊ณ 

    • inputStream์€ byte ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. byte ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž(String)๋กœ ๋ณด๋ ค๋ฉด ๋ฌธ์žํ‘œ (Charset)๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • ์š”์ฆ˜์€ euc-kr ๋ณด๋‹ค utf-8 ํ˜•ํƒœ๋กœ ์ธ์ฝ”๋”ฉ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ utf-8์„ ์‚ฌ์šฉํ•˜์ž.

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 ํ˜•์‹ ํŒŒ์‹ฑ ์ถ”๊ฐ€

  • Json ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑ
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
	private String username;
	private int age;
}

Json ํ˜•ํƒœ๋กœ ์š”์ฒญ์ด ์˜จ๊ฒƒ์„ ํ™•์ธํ•˜๋ ค๋ฉด inputStream์„ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

request๋ฅผ inputStream์œผ๋กœ ๋ฐ›์œผ๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ์˜ค๊ฒŒ๋œ๋‹ค.
{messageBody = {"username" : "hello", "age" : 20}}

Jsonํ˜•์‹์˜ ์š”์ฒญ์„ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ๋ฐ›์œผ๋ ค๋ฉด?

์ฐธ๊ณ 

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

HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

System.out.println("helloData.username: " + helloData.getUsername());
System.out.println("helloData.age: " + helloData.getAge());

//๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ›„ ์ฐ์–ด๋ณธ ๊ฒฐ๊ณผ
helloData.username: hello
helloData.age: 20

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€