1. JSON ์ด๋ ๋ฌด์์ธ๊ฐ์? ๐ก
(1) ์ ์
JSON์ด๋ JavaScript Object Notation์ ์ฝ์๋ก Javascript ๊ฐ์ฒด ํํ๋ก ๋์ด์๋ ๋ฐ์ดํฐ ๊ตํ ์์์ด๋ค.
JS ๊ฐ์ฒด์ ํํ
: javascript ๊ฐ์ฒด๋ (key: value) ํํ์ ๊ฐ๋ค์ด ๋์ด๋ ๊ตฌ์กฐ์ด๋ค. java์์ HashMap๊ณผ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์๋ค. js์์๋ ๋ฐ๋ก ๋ณ์์ ๋ํ ํ์
์ ์ธ์ด ํ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ฌธ๋ฒ์ด ๋น๊ต์ ๊ฐํธํ๋ค.
(2) ํน์ง
a. ์ธ์ด ๋ ๋ฆฝ์ ์ธ ์์์ด๋ค.
๋ถ๋ช JS ๊ฐ์ฒด ํํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์์์ด์ง๋ง, javascript ๋ฟ๋ง ์๋๋ผ ๋๋ค์์ ์ธ์ด, ๊ทธ ์ธ์ด ๊ธฐ๋ฐ ํ๋ ์์ํฌ์์ ํ์ฉํ ์ ์๋ค.
b. ์ํ๋ฅผ ๊ตํํ๋ค.
JSON์ ํตํด ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๋ ํน์ ๊ฐ์ฒด ํน์ ๊ฐ๋ค์ ์ํ
์ด๋ค. ๊ธฐ๋ฅ
์ ์๋ฏธํ๋ Method๋ JSON์ ํตํด ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
c. JS ๊ฐ์ฒด์์ ์ฐจ์ด์
์๊น์๊ฐ ๊ฐ์์ JS ๊ฐ์ฒด์ JSON ์์ฒด๋ฅผ ๋์ผ์ ํ ์ ์์ง๋ง, ๋์ ๋ฏธ์ธํ ์ฐจ์ด๊ฐ ์๋ค. JSON์ ํ ์คํธ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ๊ตํ ์์์ด๋ผ JSON์ ๋ฐ์ดํฐ๋ key๊ฐ์ด String ํํ์ฌ์ผ ํ๋ค.
// javascript object
{
first: 'Bob',
last: 'Smith'
}
{
'first': 'Bob',
'last': 'Smith'
}
2. ์ ์ฐ๋ ๊ฑฐ์ฃ ? ๐คทโ๏ธ
๊ฒฐ๋ก
: ๋ค๋ฅธ ์ธ์ด ๊ธฐ๋ฐ์ client์ sever ๊ฐ์ ์ํต์ ์ํด, ๋ฒ์๋ฒ์ ์ธ ์ํต์ ์ํด ์จ์ผํจ
๋ฐ์ดํฐ ๊ตํ์ ์ํต์ผ๋ก ๋ณธ๋ค๋ฉด, JSON์ ์์ด
์ ์์น์ ์๋ค. JSON์ ์ธ์ด ๋
๋ฆฝ์ ์ธ ํน์ฑ ๋๋ฌธ์ ๋ค์ํ ํ๋ ์์ํฌ์์ ํ์ฉํ๊ธฐ ์ฌ์ ๊ณ , ๊ทธ ๋๋ฌธ์ ํ์ฌ ๋๋ค์์ ํ๋ ์์ํฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉํ๋ ํ์ค ๋ฐ์ดํฐ ๊ตํ ์์์ด ๋์๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด ๋น์ฐํ๊ฒ๋ client์ server์ ์ธ์ด๊ฐ ๋ค๋ฅผ ์ ์๋ค. ์ด๋ ๋ ๊ฐ์ ์ํต์ ์ํํ๊ฒ ํ๊ธฐ ์ํด์๋ JSON์ด ํ์์ด๋ค. ๋ํ ์๋น์ค๊ฐ ๋ฐฉ๋ํด์ ธ์ ์ฌ๋ฌ๊ฐ์ ์๋ฒ๋ฅผ ๋๊ณ ์๊ณ , ๊ทธ ์๋ฒ๊ฐ์ ๊ตฌํ ์ธ์ด๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, Open API ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฑ, ๋ค๋ฅธ ์ธ์ด๊ฐ์ ์ํต์ ์ํด์๋ JSON์ด ํ์์ ์ด๋ค. ๋ง์น ๋ชจ๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฐ์ง๋ง UN ํ์์ฅ์ ๊ฐ๋ฉด ๋ชจ๋๊ฐ ์์ด๋ฅผ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์น์ด๋ค.
3. JSON์ ์ด๋ป๊ฒ ์ฐ์ด๋ ๊ฑฐ์ฃ ? ๐
์๊น ๊ฐ๋ ๋ถ๋ถ์์ ์ดํด๋ดค๋ฏ์ด JSON์ JS object์๋ ๊ฐ์ ๊ตฌ์กฐ์ด์ง๋ง, ๋ด์ฉ๋ฌผ์๋ ๋ฏธ์ธํ ์ฐจ์ด๊ฐ ์์๋ค. ๋ฐ๋ผ์ JSON์ ๋ฐ๋ก ๋ฐ์์ JS object ์ฒ๋ผ ํ์ฉํ์ง ๋ชปํ๊ณ , JSON โ JS object ๋ก ๋ณํํด์ ํ๋ก์ ํธ ๋ด์์ ํ์ฉํด์ผ ํ๋ค. ๊ฐ์ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ธ JS ๊ธฐ๋ฐ ํ๋ ์์ํฌ์์๋ ์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋๋ฐ, ๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ์ค์ฃฝํ๊ฒ ๋๊ฐ. ๋ค์์ JSON์ ํ์ฉํ๋ ๊ตฌ์กฐ์ ๊ทธ ์๋ฆฌ์ ๋ํด ์ค๋ช ํ๊ฒ ๋ค.
(1) ๋๋ต์ ์ธ ์ํคํ ์ณ
ํ์๊ฐ ํ์ฉํ๋ ์ฃผ ํ๋ ์์ํฌ๊ฐ Spring boot๋ผ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช ํ๊ฒ ๋ค.
a. JSON์ ํ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ดํ๋ฆฌ์ผ์ด์ ์ธ๋ถ๋ก ์ ์ก
์ด๋ ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํ๋ ์์
์ ์ง๋ ฌํ
๋ผ๊ณ ํ๋ค.
b. ์ธ๋ถ์์ ๋ค์ด์จ JSON ๋ฐ์ดํฐ๋ฅผ Spring ๋ด๋ถ์์ ํ์ฉํ ์ ์๊ฒ ๋ณํ
์ด๋ JSON์ Java ๊ฐ์ฒด๋ก ๋ณํํ๋ ์์
์ ์ญ์ง๋ ฌํ
๋ผ๊ณ ํ๋ค.
(2) ์ง๋ ฌํ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
-. ๋ค์ด๊ฐ๊ธฐ ์์
Java์์ ์ง๋ ฌํ ํน์ ์ญ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ gson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด์ผ ํ๋ค. ์ฐ๋ฆฌ๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๋ถ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ก๋์ง ์์๋ณด๊ฒ ๋ค.
a. Reflection API ํ์ฉ
Reflection API๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์
์ ์ฌ์ ์ ์์ง ๋ชปํด๋, ํด๋น ํด๋์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ํ์ฉํด ์ญ์ผ๋ก ํด๋น ํด๋์ค ๋ด ๋ฉค๋ฒ ๋ณ์์ ๋งค์๋, ๊ฐ ๋ณ์๋ค์ ํ์
๋ฑ ๋ฐ์ดํฐ์ ๋ฉํ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ API์ด๋ค.
private, protected ์ ๊ฐ์ ์ ๊ทผ ์ ์ด์๊ฐ ๋ถ์ ๋ณ์๋ Reflection API๋ฅผ ํ์ฉํ๋ฉด ์ ๊ทผํ ์ ์๋ค.
์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ผ๋ก ๋์์ด ๋๋ ๊ฐ์ฒด์ Reflection API๋ฅผ ์ ์ฉ์์ผ ๊ฐ์ฒด ๋ด์ ํ๋์ ๊ฐ๋ค์ ํ์ ํ๋ค.
b. Key ์ด๋ฆ ์ถ์ถ, Key ๋ณ ๊ฐ ์ฝ๊ธฐ
Reflection API๋ฅผ ํ์ฉํด ๊ฐ์ฒด์ ๋ชจ์ฒด๊ฐ ๋๋ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ์ด๋ฆ์ ๋ชจ๋ ์ฝ๋๋ค.
๋ง์ฝ private String name
์ด๋ ๋ฉค๋ฒ ๋ณ์๊ฐ ์์ผ๋ฉด "name"
์ผ๋ก ๋ณํํ์ฌ ์ถ์ถํ๋ ๊ฒ์ด๋ค. ์ดํ ํด๋น key์ ๋์๋๋ ๊ฐ(value) ๋ํ ์ฝ๋๋ค.
c. Value์ ํ์ ์ฒ๋ฆฌ
JSON์ JS ๋ฌธ๋ฒ ๊ตฌ์กฐ๋ผ์ Java์ ํ์ ๊ณผ JSON์ ํ์ ์ ์๋ก ์ฐจ์ด๊ฐ ์๋ค. ์ด๋ jackson(ํน์ gson) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์กฐ์ฐํ๋ java ๊ฐ์ฒด์ ๋ฉค๋ฒ ๋ณ์ ํ์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ์ํจ๋ค.
Primitive Type ์ด๋ Wrapper Type
: (int,Integer,float,double, Double) โ Number,
ex) java์์int age = 30
์ด์์ผ๋ฉด JSON์์๋"age": 30
์ด ๋จ.String ํ์
: js์๋ string ํ์ ์ด ์๊ธฐ์ string ํ์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ.
ex)String name = "์ ์๋ฏผ"
โ"name": "์ ์๋ฏผ"
๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด
: ์ด๊ฒ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด, ๋ฐฐ์ด์ ๋ฐฐ์ด ๊ทธ๋๋ก ๊ฐ๋ค.
ex)List<String> hobbies = Arrays.asList("Reading", "Traveling")
โ"hobbies": ["Reading", "Traveling"]
- ์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ ์ง๋ ฌํ๊ฐ ๋๋ค.
d. ์ง๋ ฌํ ์ฝ๋
๋๋ต์ ์ธ ์ง๋ ฌํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
์์ ๊ฐ์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์ง๋ ฌํ ์ํค๋ ์๋ฅผ ๋ณด์.
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonSerializeExample {
public static void main(String[] args) {
// Java ๊ฐ์ฒด ์์ฑ
Person person = new Person("Alice", 30);
// ObjectMapper ๊ฐ์ฒด ์์ฑ
ObjectMapper objectMapper = new ObjectMapper();
try {
// ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ์ง๋ ฌํ
String jsonString = objectMapper.writeValueAsString(person);
System.out.println("JSON String: " + jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(3) ์ญ์ง๋ ฌํ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
์ญ์ง๋ ฌํ๋ JSON ํ์ผ์ ํ๋ก๊ทธ๋จ ๋ด์์ ์ธ ์ ์๋ ํ๋์ ๊ตฌ์กฐ๋ก ์ ํํ ํ๋ ๊ฒ์ด๋ค. Java์์๋ ๊ฐ์ฒด๊ฐ ๋ ๊ฒ์ด๊ณ python์์๋ ๋์ ๋๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ค.
a. JSON ํ์ฑ
์์ ์ง๋ ฌํ ๊ณผ์ ์ ๋ณด๋ฉด ์ฐ๋ฆฌ๋ Reflection API๋ฅผ ํ์ฉํด ๊ฐ์ฒด๋ฅผ ๋จผ์ ํด์ฒดํ์๋ค. ๋ณํ์ ์์ ํด์ฒด๊ฐ ํ์ํ๋ ์ด์ ๋ ๋ณํํ๊ณ ์ ํ๋ ๋์์ ๊ตฌ๋ถ์ง์ด ํ์
ํ๊ณ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ด๊ธฐ ์ํด์ ์๋ค. ํ JSON ํ์ฑ๋ ๊ทธ์ ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ์ด๋ผ ๋ณด๋ฉด ๋๋ค.JSON Parsing
์ ({
, }
, [
,]
, ,
,:
)๋ฅผ ๊ธฐ์ค์ผ๋ก JSON ํ์ผ์ ํด์ฒดํ์ฌ ๊ฐ์ฒด์ ์์๊ณผ ๋ ํ์
, key์ value ๊ตฌ๋ถ ๋ฑ์ ํ๋ ๊ณผ์ ์ด๋ค.
b. ๊ธฐ๋ณธ ๊ฐ์ฒด ์์ฑ ๋ฐ ํ๋ ๋งคํ
์ฐ๋ฆฌ๊ฐ JSON์ ๋ณํ์์ผ ๋ง๋ค๊ณ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋น ์์ฑ์
๋ฅผ ํ์ฉํด ๋ง๋ ๋ค. (์ด๋ ๋น ์์ฑ์๊ฐ ๋ฏธ๋ฆฌ ์ ์ ๋์ด ์์ง ์๋ค๋ฉด, ์ญ์ง๋ ฌํ์ ํ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๋ ์ ์๋ค.) ๊ทธ๋ฆฌ๊ณ JSON์ key์ ๊ฐ์ฒด์ ํ๋(๋ฉค๋ฒ ๋ณ์)๋ฅผ ๋งคํํ๋ค. ๋งคํํ๋ค๋ ๊ฒ์ ์๋ก ๊ด๊ณ ์๋ ๊ฒ์ผ๋ก ์ฐ๊ฒฐ์ง๋๋ค๋ ์๋ฏธ์ด๋ค. ๊ฐ์ฒด์ ํ๋๋ฅผ ReflectionAPI๋ก ์ ๋ถ ํ์
ํ๊ณ , ๊ทธ ์ค JSON์ key์ ์ด๋ฆ์ด ์ผ์นํ๋ ํ๋๋ฅผ ํ์ธํด, ๊ฐ์ ์ด๋ฆ์ key์ value๋ฅผ ํด๋น ํ๋์ ๊ฐ์ผ๋ก ๋ฃ์ ์ค๋น๋ฅผ ํ๋ค.
c. value ํ์ ๋ณํ ๋ฐ ๋์
์ด์ ์ด๋ฆ์ด ๊ฐ์ JSON์ key์ ๊ฐ์ฒด์ field๋ฅผ ์ฐ๊ด์ง์์ผ๋, key์ ํด๋นํ๋ value๋ฅผ ์ฐ๊ด๋ field์ ๊ฐ์ผ๋ก ๋์
ํ๋ ์์
๋ง์ด ๋จ์๋ค. ์ด๋ฅผ ์ํด์๋ ์๊น ์ง๋ ฌํ ์ ํ๋ ๊ฒ์ ๋ฐ๋๋ก ํ์
์ ๋ณํํ๋ค. ๋ง์ฝ JSON์ ๋ฐ์ดํฐ ํ์
์ผ๋ก ๊ฐ์ฒด์ ํด๋น field์ ๊ฐ์ ๋์ ํ ๋ง๋ค์ด๋ผ ์ ์์ผ๋ฉด ๋ณํ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
(๋ง๋ค์ด๋ผ ์ ์๋ ๊ฒฝ์ฐ: {"A" : true}
โ {public int A}
)
d. ์์
๋ค์ ์์ ๋ jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ JSON ๊ฐ์ java ๊ฐ์ฒด๋ก ๋ณํํ๋ ๋ก์ง์ด๋ค. Class๋ ์์์๋ ํ ๋ฒ ์ฌ์ฉํ Person์ ๊ทธ๋๋ก ํ์ฉํ์๋ค.
public class JsonDeserializeExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"Alice\", \"age\": 30}";
ObjectMapper objectMapper = new ObjectMapper();
try {
// JSON ๋ฌธ์์ด์ Java ๊ฐ์ฒด๋ก ์ญ์ง๋ ฌํ
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println("Deserialized Person: " + person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(5) Spring Boot์์ @RestController ๋ @ResponseBody๋ก API ๊ตฌํ ์, API ์๋ต์ ๊ฐ์ฒด๋ก ๋ฐํ ํ๋๋ฐ ์ ๋ฐํ ๊ฒฐ๊ณผ๋ JSON์ผ๋ก ๋์ค๋์?
๊ทธ๊ฑด ๋ฐ๋ก HttpMessageConverter ๋๋ถ์ด๋ค. @RestController
= @Controller
+ @ResponseBody
์ด๋ค. ์ด๋ @ResponseBody
์ด๋
ธํ
์ด์
์ ์ฐ๋ฉด ๊ธฐ์กด MVC ํจํด์ Sever Side Rendering์ด ์๋๋ผ Client Side Rendering์ ํ๊ณ ์๋ฒ๋ API ์๋ฒ๊ฐ ๋๊ฒ ๋ค๋ ๊ฒ์ ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ง์์ผ๋ก, ๊ธฐ์กด์ ์ฌ์ฉํ๋ ViewResolver
๋์ HttpMessageConverter
๋ฅผ ์ด๋ค. ํด๋น ์ธํฐํ์ด์ค๋ Http๋ฅผ ํตํด ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ๊ฐ์ฒด๋ฅผ ์ํฉ์ ๋ง๊ฒ ๋ณํํ๋ ๊ท์น์ ๋ด์ ์ธํฐํ์ด์ค์ด๋ค.
ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ ํฌ๊ฒ StringHttpMessageConverter
์ MappingJackson2HttpMessageConverter
๊ฐ ์๋๋ฐ, ์ ์๋ ๋ฌธ์์ด ๋ฐํ๊ฐ์ JSON์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์ฉ๋์ด๊ณ , ํ์๋ ๊ฐ์ฒดํํ์ ๋ฐํ๊ฐ์ JSON์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์ฉ๋์ด๋ค.
๊ฒฐ๋ก : ์ฌํผ @RestController
๋ฅผ ํ์ฉํ์ฌ api๋ก์ง์ ์์ฑํ๋ฉด ๊ฐ์ฒด๋ก ๊ฐ์ ๋ฐํํด๋, ํด๋น ๊ฐ์ฒด๊ฐ์ด HttpMessageConverter๋ฅผ ํ๋ฒ ๊ฑฐ์ณ์ JSON์ผ๋ก ์๋ ๋ณํ๋์ด ํด๋ผ์ด์ธํธ์๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ์๋ฉด๋๋ค.