HTTP ์์ฒญ ๋ฐ์ดํฐ
HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
์ฃผ๋ก ๋ค์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
/url?username=hello&age=20
๋ฉ์์ง ๋ฐ๋ ์์ด, URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ์ ๋ฌ ์) ๊ฒ์, ํํฐ, ํ์ด์ง๋ฑ์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์
POST - HTML Form
content-type: application/x-www-form-urlencoded
๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ฆฌ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌ username=hello&age=20 ์) ํ์ ๊ฐ์
, ์ํ ์ฃผ๋ฌธ, HTML Form ์ฌ์ฉ
HTTP message body์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์์ ์์ฒญ
HTTP API์์ ์ฃผ๋ก ์ฌ์ฉ, JSON, XML, TEXT
๋ฐ์ดํฐ ํ์์ ์ฃผ๋ก JSON ์ฌ์ฉ POST, PUT, PATCH
HTTP ์์ฒญ ๋ฐ์ดํฐ - GET ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ
์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ URL์ ๋ค์๊ณผ ๊ฐ์ด ?๋ฅผ ์์์ผ๋ก ๋ณด๋ผ ์ ์๋ค. ์ถ๊ฐํ๋ผ๋ฏธํฐ๋ &๋ก ๊ตฌ๋ถํ๋ฉด ๋๋ค.
http://localhost:8080/request-param?username=hello&age=20
URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
[์ ์ฒด ํ๋ผ๋ฏธํฐ ์กฐํ] - getParameterNames()
asIterator() : ์ํ ํ๋ Iterator ๋ฅผ ๋ฆฌํด
forEachRemaining() : ๋ชจ๋ ์์๊ฐ ์ฒ๋ฆฌ๋๊ฑฐ๋ ์ ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๋จ์ ๊ฐ ์์์ ๋ํด ์ง์ ๋ ์์ ์ ์ํ
์ดํฐ๋ ์ดํฐ(Iterator) ๋?
์ปฌ๋ ์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋๋ฐ ์ฌ์ฉ
์ปฌ๋ ์ ์ ์ ์ฅ๋ ์์๋ค์ ์ฝ์ด์ค๋ ๋ฐฉ๋ฒ์ ํ์คํํ ๊ฒ.
asIterator() ๋ฉ์๋
์ด ์ด๊ฑฐ์ ํฌํจ ๋ ์์๋ค์ ์ํ ํ๋ Iterator๋ฅผ ๋ฆฌํดํฉ๋๋ค.
Iterator ๋ฉ์๋
boolean hasNex() | ์ฝ์ด ์ฌ ์์๊ฐ ๋จ์์๋์ง ํ์ธํ๋ค. ์์ผ๋ฉด true, ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค. |
Object next() | ๋ค์ ์์๋ฅผ ์ฝ์ด ์จ๋ค. next()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ hasNext()๋ฅผ ํธ์ถํด์ ์ฝ์ด ์ฌ ์์๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์์ ํ๋ค. |
Iterator ์ด๋ Enumeration ์ ๊ฑฐ์ ๊ฐ๋ค.
Iterator ์ด ์ต์ ๋ฒ์ ์ด๊ณ , Enumeration ๊ตฌ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Iterator ์ฐ๋ ๋ฐฉ๋ฒ.
- ์ปฌ๋ ์ ์ iterator()๋ฅผ ํธ์ถํด์ iterator ๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์ป์ด์ ์ฌ์ฉํ๋ค.
List list = new ArrayList(); // ๋ค๋ฅธ ์ปฌ๋ ์
์ผ๋ก ๋ณ๊ฒฝํ ๋๋ ์ด ๋ถ๋ถ๋ง ๊ณ ์น๋ฉด ๋๋ค.
Iterator it = list.iterator(); // Iterator ๊ฐ์ฒด๋ฅผ ๋ฐํ.
while(it.hasNext()) { // ์ฝ์ด์ฌ ์์๊ฐ ์๋์ง ํ์ธ
System.out.println(it.next()); // ๋ค์ ์์๋ฅผ ์ฝ์ด์ด
}
System.out.println("[๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ]");
String username = request.getParameter("username");
System.out.println("username = " + username);
[๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ] - request.getParameter
System.out.println("[์ด๋ฆ์ด ๊ฐ์ ๋ณต์ ํ๋ผ๋ฏธํฐ ์กฐํ]");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("name = " + name);
}
๋ณต์ ํ๋ผ๋ฏธํฐ์์ ๋จ์ผ ํ๋ผ๋ฏธํฐ ์กฐํ - request.getParameterValues
http://localhost:8080/request-param?username=hello&age=20&username=kim
request.getParameter() ๋ ํ๋์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๋ํด์ ๋จ ํ๋์ ๊ฐ๋ง ์์ ๋ ์ฌ์ฉํด์ผ ํ๋ค.
์ง๊ธ์ฒ๋ผ ์ค๋ณต์ผ ๋๋ request.getParameterValues() ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ์ค๋ณต์ผ ๋ request.getParameter() ๋ฅผ ์ฌ์ฉํ๋ฉด request.getParameterValues() ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฐํํ๋ค.
HTTP ์์ฒญ ๋ฐ์ดํฐ - POST HTML Form
<form action="/request-param" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">์ ์ก</button>
</form>
HTML์ Form์ ์ฌ์ฉํด์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ก
content-type์ HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ ํ์์ ์ง์ ํ๋ค.
content-type: application/x-www-form-urlencoded
ํผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ํ์์ application/x-www-form-urlencoded
message body: username=hello&age=20
> GET URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋
HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ content-type์ด ์๋ค.
> POST HTML Form ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด
HTTP ๋ฉ์์ง ๋ฐ๋์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํฌํจ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ์์ธ์ง content-type์ ๊ผญ ์ง์ ํด์ผ ํ๋ค.
์ด๋ ๊ฒ ํผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ํ์์ application/x-www-form-urlencoded ๋ผ ํ๋ค.
HTTP ์์ฒญ ๋ฐ์ดํฐ - API ๋ฉ์์ง ๋ฐ๋ - ๋จ์ ํ ์คํธ
HTTP message body์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์์ ์์ฒญ
HTTP ์์ฒญ ๋ฐ์ดํฐ์ ๋ฉ์์ง ๋ฐ๋์ ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ค์ด์ ์๋ฒ์ ์ ์ก
๋จผ์ ๊ฐ์ฅ ๋จ์ํ ํ ์คํธ ๋ฉ์์ง๋ฅผ HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ด์์ ์ ์กํ๊ณ , ์ฝ์ด๋ณด์.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ๋ฅผ InputStream์ ์ฌ์ฉํด์ ์ง์ ์ฝ์ ์ ์๋ค.
getInputStream() : byte ์ฝ๋๋ฅผ ๋ฐํ
StreamUtils.copyToString() : ๋ฌธ์์ด๋ก ๋ฐํ
์ฝ๋๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ์ ์๋ ๋ฌธ์(String)๋ก ๋ณด๋ ค๋ฉด ๋ฌธ์ํ (Charset)๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
์ฌ๊ธฐ์๋ UTF_8 Charset์ ์ง์ ํด์ฃผ์๋ค.
Postman ์ผ๋ก ํ ์คํธ
content-type: text/plain
message body: hello
๊ฒฐ๊ณผ: messageBody = hello
HTTP ์์ฒญ ๋ฐ์ดํฐ - API ๋ฉ์์ง ๋ฐ๋ - JSON
์ด๋ฒ์๋ HTTP API์์ ์ฃผ๋ก ์ฌ์ฉํ๋ JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด๋ณด์.
public class HelloData {
private String username;
private int age;
JSON ํ์์ผ๋ก ํ์ฑํ ์ ์๊ฒ ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑ
JSON ๊ฒฐ๊ณผ๋ฅผ ํ์ฑํด์ ์ฌ์ฉํ ์ ์๋ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ ค๋ฉด
Jackson, Gson ๊ฐ์ JSON ๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉํด์ผ ํ๋ค.
private ObjectMapper objectMapper = new ObjectMapper();
์คํ๋ง ๋ถํธ๋ก Spring MVC๋ฅผ ์ ํํ๋ฉด ๊ธฐ๋ณธ์ผ๋ก Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ( ObjectMapper )๋ฅผ ํจ๊ป ์ ๊ณตํ๋ค.
# ์ฐธ๊ณ : ObjectMapper (JSON ํ์ฑ)
ObjectMapper
ObjectMapper๋ฅผ ์ด์ฉํ๋ฉด JSON์ Java ๊ฐ์ฒด๋ก ๋ณํ
๋ฐ๋๋ก Java ๊ฐ์ฒด๋ฅผ JSON ๊ฐ์ฒด๋ก serialization ํ ์ ์๋ค.
Java Object → JSON
Java ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก serialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ writeValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
// Java Object -> JSON
Person person = new Person("zooneon", 25, "seoul");
try {
objectMapper.writeValue(new File("src/person.json"), person);
} catch (IOException e) {
e.printStackTrace();
}
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ก JSON์ ์ ์ฅํ ํ์ผ๊ณผ ์ง๋ ฌํ์ํฌ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
JSON → Java Object
JSON ํ์ผ์ Java ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
// JSON -> Java Object
String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";
try {
Person deserializedPerson = objectMapper.readValue(json, Person.class);
System.out.println(deserializedPerson);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ก JSON ํํ์ ๋ฌธ์์ด or ๊ฐ์ฒด์ ์ญ์ง๋ ฌํ ์ํฌ ํด๋์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("helloData.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
JSON ํ์ผ์ Java ๊ฐ์ฒด๋ก deserialization ํ๊ธฐ ์ํด์๋ ObjectMapper์ readValue() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > Spring MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง MVC] - 6. MVC ํจํด - ์ ์ฉ , ํ๊ณ (0) | 2023.02.13 |
---|---|
[์คํ๋ง MVC] - 5. ์๋ธ๋ฆฟ๊ณผ JSP์ ํ๊ณ / MVC ํจํด์ ๋ฑ์ฅ (0) | 2023.02.13 |
[์คํ๋ง MVC] - 4. HTTP ์๋ต ๋ฐ์ดํฐ ( ํ ์คํธ / HTML / API ) (0) | 2023.02.12 |
[์คํ๋ง MVC] - 2. ์๋ธ๋ฆฟ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ๊ธฐ (0) | 2023.02.11 |
[์คํ๋ง MVC] - 1. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ดํด (0) | 2023.02.11 |