# HTTP ๋ฐ์ดํฐ ์ ์ก/์๋ต
by JiwonDevํ๋ ์์ํฌ ์์ด ์์ ์๋ฐ ์๋ธ๋ฆฟ์ WAS์ ๋ฑ๋กํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ ์ก ๋ฐ์๋ณด์.
์ฐธ๊ณ ๋ก ์ง์ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ ํ๋ํ๋ ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋ณดํต API ํ ์คํธ๋ฅผ ์ฝ๊ฒํ๋ ํด์ธ Postman์ ๋ง์ด ์ฌ์ฉํ๋ค. ๊ฐ๋จํ ๊ฐ์ ํ๊ณ Workspace๋ฅผ ๋ง๋ค์ด ์ง์ HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
# HTTP ์์ฒญ ๋ฐ์ดํฐ ์ ์ก
HTTP์ ํตํด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์๋์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ณดํต ์ฌ์ฉํ๋ค.
- GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
jiwondev.tistory.com/?username=JIWON&age=25
๋ฉ์์ง body์์ด URL์ ํ๋ผ๋ฉํ๋ก ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ - POST - HTML Form ์ผ๋ก ์ ์ก, message body ์ ํ๋ผ๋ฉํ๋ฅผ ์ ๋ฌ
content-type: application/x-www.form-urlencoded
body: username=hello&age=20
- HTTP API - message body์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์์ ์์ฒญ
json, xml, text ํ์. ์ํ๋ค๋ฉด ์ด์ง๋ฐ์ดํฐ(Java ๊ฐ์ฒด ์ง๋ ฌํ)๋ ๋ณด๋ผ ์ ์์ผ๋ ๋ณดํต json์ผ๋ก ์ฌ์ฉ
๋ณดํต POST, PUT, PATCH๋ฅผ ์ฌ์ฉํ์ฌ ์ ์กํจ.
@1. HTTP GET
๋ฐ์ดํฐ๋ฅผ URL์ ์ ๋๋ค. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ ? ๋ฅผ ์ด์ฉํ์ฌ ๋ณด๋ผ ์ ์๋ค. ๋๊ฐ์ ์ด๋ฆ์ ํ๋ผ๋ฉํ๋ฅผ ์ฌ๋ฌ๋ฒ ๋ณด๋ผ ์ ์๋ค.
http://my.tistory.com/?username=hello&age=30&age=20
์ด๋ ๊ฒ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ request ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฒ์์ ๋ฐ์ ์ฌ ์ ์๋ค.
//๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ (์ฌ๋ฌ ๊ฐ๊ฐ ์๋ค๋ฉด ์ฒซ๋ฒ์งธ ๊ฐ)
String username = request.getParameter("username");
//ํ๋ผ๋ฏธํฐ ์ด๋ฆ๋ค ๋ชจ๋ ์กฐํ
Enumeration<String> parameterNames = request.getParameterNames();
//ํ๋ผ๋ฏธํฐ๋ฅผ Map์ผ๋ก ์กฐํ
Map<String, String[]> parameterMap = request.getParameterMap();
//๋ณต์ ํ๋ผ๋ฏธํฐ ์กฐํ
String[] usernames = request.getParameterValues("username");
@2. HTTP Form (POST) ๋ฐฉ์
๋ค์๊ณผ ๊ฐ์ HTML ํผ์ ์ด์ฉํ์ฌ ๋ฉ์์ง ๋ฐ๋์ ํ๋ผ๋ฉํ๋ฅผ ํฌํจํ์ฌ ์ ์กํ๋ค.
http://my.tistory.com/hello-form.html
* content-type์ด ๋ญ์ฃ
content-type์ HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ ํ์์ ์ง์ ํ๋ค.
GET URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ content-type์ด ์๋ค.
POST HTML Form ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด HTTP ๋ฉ์์ง ๋ฐ๋์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํฌํจ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ์์ธ์ง content-type์ ๊ผญ ์ง์ ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ํ์์ application/x-www-form-urlencoded ๋ผ ํ๋ค.
<-- hello-form.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
username: <input name="username" type="text"/>
age: <input name="age" type="text"/>
<button type="submit">์ ์ก</button>
</form>
</body>
</html>
์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ๋ฐ์ ํ๋ผ๋ฉํ๋ฅผ ๊บผ๋ด๋ ๋ฐฉ๋ฒ์ @1. HTTP GET๊ณผ ๋ค๋ฅด์ง ์๋ค. ๋ณด๋ด๋ ๋ฐฉ์์ด ๋ค๋ฅผ ๋ฟ์ด๋ค. ๊ทธ๋์ ์๋ธ๋ฆฟ์์๋ doGet() ๊ณผ doPost()๊ฐ์ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์ฌ, Service() ์์ ์ฒ๋ฆฌํ ํ ์ ์ ํ ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๊ตฌ๋ถํ๋ค. (doGet()๋ฑ์ ํธ์ถํ๋ ๊ฑด HTTPServlet ํด๋์ค์ ์ ์๋์ด ์๋ค.)
@3. HTTP API (json, xml, text)
POST, PUT, PATCH๋ฑ์ ์ด์ฉํด์ ๋ฉ์์ง ๋ฐ๋์ ์ง๋ ฌํ ๋ฐ์ดํฐ(Json, XML, Text)๋ฅผ ์ง์ ๋ด์์ ๋ณด๋ธ๋ค.
requset์์ ํ๋ผ๋ฉํ๋ฅผ ๊บผ๋ด๋ ๋ฐฉ์์ด ์๋, JSON์ ๊บผ๋ด ํ์ฑํ์ฌ ์ฌ์ฉํ๋ค. ์๋ฐ ๊ฐ์ฒด๋ฅผ Json์ผ๋ก ์์ฝ๊ฒ ์ ํํ ์ ์๋ ObjectMapper๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค. ๋ํ์ ์ผ๋ก Jackson, Gson ๋ฑ์ด ์๋ค.
์ฐธ๊ณ ๋ก HTML form ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์ด ์ง์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ฐ๊ฒฐํด ์ฝ์ ์ ์์ผ๋ request.getParameter(...)๋ก ์์ฝ๊ฒ ๊บผ๋ด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ฟ์ด๋ค.
... ์๋ธ๋ฆฟ ๊ฐ์ฒด
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// request์์ data๋ฅผ ๊บผ๋ด์จ๋ค.
ServletInputStream inputStream = req.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
// objectMapper๋ฅผ ์ฌ์ฉํ๋ฉด json <-> Object ๋ณํ์ ๊ฐ๋จํ๊ฒ ๊ฐ๋ฅํ๋ค.
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
// response ์์ ํ ๋ฐํ
resp.getWriter().write("ok");
}
... ์๋ต
# HTTP ์๋ฒ ์๋ต
์์ฒญ์ ๋ฐ์ ์๋ฒ๋ [HTTP ์๋ต์ฝ๋]์ ํจ๊ป ํค๋, ๋ฐ๋๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
- 1xx(์ ๋ณด) : ์์ฒญ์ ๋ฐ์์ผ๋ฉฐ ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์งํํฉ๋๋ค.
- 2xx(์ฑ๊ณต) : ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์ผ๋ฉฐ ์ธ์ํ๊ณ ์์ฉํ์์ต๋๋ค.
- 3xx(๋ฆฌ๋ค์ด๋ ์ ) : ์์ฒญ ์๋ฃ๋ฅผ ์ํด ์ถ๊ฐ ์์ ์กฐ์น๊ฐ ํ์ํฉ๋๋ค.
- 4xx(ํด๋ผ์ด์ธํธ ์ค๋ฅ) : ์์ฒญ์ ๋ฌธ๋ฒ์ด ์๋ชป๋์๊ฑฐ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- 5xx(์๋ฒ ์ค๋ฅ) : ์๋ฒ ์๋ต์ด ์๊ฑฐ๋ ์๋ฒ๊ฐ ๋ช ๋ฐฑํ ์ ํจํ ์์ฒญ์ ๋ํ ์ถฉ์กฑ์ ์คํจํ์ต๋๋ค.
์๋ธ๋ฆฟ ์คํ์์๋ response ๋ฉ์๋๋ฅผ ํตํด ์๋ต์ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
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, mustrevalidate");
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");
private void content(HttpServletResponse response) {
//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) {
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600")์ ๋์ผ
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600์ด
response.addCookie(cookie);
}
private void redirect(HttpServletResponse response) throws IOException {
// ์๋ ๋ ์ฝ๋์ ๋์ผํ ๋์.
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
@ ์๋ต์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ - HTML
์ฌ์ค ์ผ๋ฐ text๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์ (write.println)๊ณผ ํฌ๊ฒ ๋ค๋ฅผ๊ฑด ์๋ค. ๋ค๋ง content-type์ text/html๋ก ์ง์ ํ๊ณ ํ๊ทธ๋ฅผ ๋ณด๋ธ๋ค๋ ์ ์ด ๋ค๋ฅผ ๋ฟ์ด๋ค. ์ด๋ ๊ฒ ์๋ฐ์ฝ๋๋ก HTML๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์ ๋ฑ์ฅํ ๊ฐ๋ ์ด View ํ ํ๋ฆฟ, ๋ฐ๋ก JSP์ด๋ค.
//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>")
@ ์๋ต์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ - Json
Json๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์คํธ๋ก ์ง์ ํ์ฑํ ์ ์์ง๋ง, Object Mapper ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Jackson)์ ์ฌ์ฉํ๋ฉด ๊ฐํธํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8"); // Json์ UTF-8๋ง ์ฌ์ฉํ๋ค. ์๋ฏธ์๋ ํ๋ผ๋ฉํ
HelloData data = new HelloData(); // ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ์ฒด(DTO)
data.setUsername("kim");
data.setAge(20);
//{"username":"kim","age":20}
// ObjectMapper๋ก JSONํํ๋ก ์ ํ
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
'๐ฑ Spring Framework > Spring MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thymeleaf#2 Spring๊ณผ HTML Form ์ฒ๋ฆฌ (0) | 2021.08.28 |
---|---|
Thymeleaf#1 ๊ธฐ๋ณธ๊ธฐ๋ฅ (0) | 2021.08.28 |
#2 HTTP API ์์ฒญ ๋งคํ, ํค๋ ์กฐํ (0) | 2021.08.11 |
#1 HTTP ์์ฒญ ๋งคํ๊ณผ ๊ธฐ๋ณธ ๋ก๊น (0) | 2021.08.11 |
# Spring MVC๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ (0) | 2021.08.11 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev