/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง 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๋?
: ์ปฌ๋ ์ ๋ด์ ์์๋ค์ ์ํํ๋๋ฐ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค
![](https://blog.kakaocdn.net/dn/AcZdK/btsHpOjUbO9/uFx7v8uCjqrjoiOGWai8R1/img.png)
๊ด๋ จ ๋ฉ์๋
- 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)๋ฅผ ์ ๊ณตํ๋ค