1003 ~ 1009
# 1003 ~ 1009
# 1003 - DB ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
# ๋์์ฑ์ด๋(Concurrency)?
์ฌ์ ์ ์๋ฏธ๋ ํ๋์ CPU ์ฝ์ด์์ ์๊ฐ๋ถํ (Time sharing)์ ํตํ์ฌ ์ฌ๋ฌ ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ฌ์ง๊ฒ ํ๋ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค.
ํ์ง๋ง, ๋์ค์ ์ผ๋ก๋ ์ฌ๋ฌ ์์ฒญ์ด ๋์์ ๋์ผํ ์์(data)์ ์ ๊ทผํ๊ณ ์์ ํ๋ ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
# ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ๋ฐฉ๋ฒ
# [ ๋น๊ด์ ์ธ ๋ฐฉ๋ฒ ]
ํ์ฌ ์์ ํ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ์ธ์ ๋ ๋ค๋ฅธ ์์ฒญ์ ์ํด ์์ ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ํด๋น ๋ฐ์ดํฐ์ Lock์ ๊ฑฐ๋ ๋ฐฉ์.
์ฅ์ ์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์๋ฒฝํ ์งํฌ ์ ์๋ค. ์์ ํ ๋ฐ์ดํฐ์ row level lock์ ๊ฑธ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์์ฒญ์์ ์์ ํ๋ ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๋จ์ ์ lock์ผ๋ก ์ธํด ์ดํ์ ๋ค๋ฅธ ์์ฒญ์ ๋๊ธฐ์ํ๋ก ๋น ์ง๋ค. ๊ธฐ์กด์ lock์ transaction์ด commit ๋๋ rollback์ผ๋ก ๋๋๋ฉด ๋๊ธฐํ๊ณ ์๋ค ์์ฒญ์ ๋น๋ก์ ์คํํ๋ค.
ํด๋น ๋ฐฉ๋ฒ์ ์๋ฒ์ ์ฑ๋ฅ์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋์ด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋์
ํ๊ธฐ์ ์๋น์ค์ ์ต์ ์ฒ๋ฆฌ tps์ ๋ถํฉํ๋์ง ํ์ธํด์ผํ๋ค.
์ด ๋ฐฉ๋ฒ์ ์ธ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ์ฉํ ์ ์๋ค.
์ฒซ ๋ฒ์งธ๋ DB์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ Lock์์ค์ ๋์ด๋ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ ๊ธฐ๋ณธ์์ค๊ฐ์ธ Repeatable Read
๋ฅผ Serializer
์ด์์ ์์ค์ผ๋ก ์ฌ๋ฆฐ๋ค. ๊ฐ๋ ๋์ ๋ฝ์ผ๋ก ์์ ํ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค. ํ์ง๋ง, ์ด๋ก์ธํ ๋ค๋ฅธ ์์ฒญ๋ค์ด ๋ชจ๋ ์ทจ์๊ฐ๋๋ค. ์ทจ์๋ ์์
๋ค์ ์ฌ์๋๋ฅผ ์ํ ์ฒ๋ฆฌ๊ฐ ๋ฐ๋์ ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋น์ค์ ์ ์ฉํ๋๊ฒ์ ํ์ค์ฑ์ด ๋ถ์กฑํ๋ค.
๋ ๋ฒ์งธ๋ select for update
ํ์ฉํ์ฌ ๋ช
์์ ์ผ๋ก lock์ ์ก์ ์ ์๋ค. ํ์ง๋ง lock์ ์ก๋ ๊ตฌ๊ฐ์ด ๊ธธ์ด์ ธ ์ฑ๋ฅ์ ์ฌ๊ฐํ ์ํฅ์ ์ค๋ค. ๊ทน์ฅ์๋งค์ ๊ฐ์ ์๋น์ค๊ฐ ์๋๋ผ๋ฉด ์ฌ์ฉํ์ง ์๋๊ฒ์ด ์ข๋ค.
๋ง์ง๋ง์ Data์ transaction์ write lock์ ํ์ฉํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ write lock์ด ๊ฑธ๋ฆฌ๊ณ transaction์ด ๋๋์ผ lock์ด ํ๋ฆฌ๋ ๊ฒ์ ์ด์ฉํ๋ค. ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ฐ๋ง DB์ ์๋ฒ ์ฑ๋ฅ์ ๋ฐ๋ผ์ ์๋น์ค์ ์๋๊ฐ ์ข์ฐ๋๋ค.
# [ ๋๊ด์ ์ธ ๋ฐฉ๋ฒ ]
์์ ํ๋ ค๋ ๋ฐ์ดํฐ๋ ๋๋ง ์์ ํ ๊ฒ์ด๋ผ๋ ๋๊ด์ ์ธ ์๊ฐ์ ๋ฐฉ๋ฒ์ด๋ค. ํ ์ด๋ธ์ version์ด๋ผ๋ ์ซ์์ปฌ๋ผ ๋๋ updated_at ์ด๋ผ๋ ์๊ฐ์ปฌ๋ผ์ ๋ง๋ค์ด์ ์์ ๋ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํ๊ฑฐ๋, ํ์ฌ์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๊ฒ ํด์ค๋ค. ๊ฐ์ ์์ ํ ๋ Version์ด ๋์ผํ๋ฉด ์์ ์ด ๊ฐ๋ฅํด์ง๊ณ , ๋์ผํ์ง ์์ผ๋ฉด ์์ ์ ์คํจํ๋ค.
์ฅ์ ์ผ๋ก๋ ๋ชจ๋ธ์ ์ปฌ๋ผ์ ํ๋ ์ถ๊ฐํ๋ฉด ๊ตฌํ์ด ๋น๊ต์ ์ผ๋ก ์ฝ์ง๋ง, ๋๊ฐ์ DB์ธ์ ์ด ๋์ผํ ๋ฒ์ ์ผ๋ก ์์ ํ๋ ค๊ณ ํ๋ฉด ํ ๊ฐ์ ์ธ์ ์์ version conflict์ด ๋ฐ์ํ์ฌ affected row count๊ฐ 0์ด ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ ์์ฒญ์ ์ฌ์๋ํ๋๋ก ๊ตฌํ์ด ํ์.
# 1004 - JAVA์ ๋ฒ์ ๋ณ ๋ณํ(JAVA SE 10 ~ 15)
# [ Java SE 10 ]
2018๋ 3์ 20์ผ ๋ฐํ๋ ๋ฒ์ . ์ผ๋ฐ ์ง์์ 2018๋ 9์์ ์ข ๋ฃ. var ํค์๋๋ฅผ ์ด์ฉํ ์ง์ญ ๋ณ์ ํ์ ์ถ๋ก , ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋น์ง ์ปฌ๋ ์ , ๊ฐ๋ณ ์ค๋ ๋๋ก ๋ถ๋ฆฌ๋ Stop-The-World, ๋ฃจํธ CA ๋ชฉ๋ก ๋ฑ์ด ์ถ๊ฐ. ๋ํ JDK์ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ํ๋๋ก ํตํฉ, JVM ํ ์์ญ์ ์์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋ค๋ฅธ ์ข ๋ฅ์ ๋ฉ๋ชจ๋ฆฌ์๋ ํ ๋นํ ์ ์๊ฒ ๋์๋ค. ์คํ ๊ธฐ๋ฅ์ผ๋ก Java ๊ธฐ๋ฐ์ JIT ์ปดํ์ผ๋ฌ๊ฐ ์ถ๊ฐ๋์๊ณ , ์ด์ ๋ฒ์ ์์ Deprecated ์ฒ๋ฆฌ๋ API๋ Java SE 10์์ ๋ชจ๋ ์ญ์ ๋์๋ค.
# [ JAVA SE 11 ]
2018๋ 9์ 25์ผ์ ๋ฐํ๋ ๋ฒ์ . ์ผ๋ฐ ์ง์์ 2023๋ 9์, ์ฐ์ฅ ์ง์์ 2026๋ 9์์ ์ข ๋ฃ ์์ . ์ดํด๋ฆฝ์ค ์ฌ๋จ์ผ๋ก ๋์ด๊ฐ Java EE๊ฐ JDK์์ ์ญ์ ๋๊ณ , JavaFX๋ JDK์์ ๋ถ๋ฆฌ๋์ด ๋ณ๋์ ๋ชจ๋๋ก ์ ๊ณต๋๋ค. Gloun์ด๋ผ๋ ์ ์ฒด๊ฐ JavaFX๋ฅผ ์ ์ง๋ณด์ ์ค์ด๋ฏ๋ก ์ด๊ณณ์์ ๋ค์ด๋ก๋ํ๋ฉด ๋๋ค. ๋๋ค ํ๋ผ๋ฏธํฐ์ ๋ํ ์ง์ญ ๋ณ์ ๋ฌธ๋ฒ, ์ก์ค๋ก ๊ฐ๋น์ง ์ปฌ๋ ํฐ, HTTP ํด๋ผ์ด์ธํธ ํ์คํ ๋ฑ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ.
๊ฐ์ฅ ์ปค๋ค๋ ๋ณํ๋ ๋ฐ๋ก ๋ผ์ด์ ์ค ๋ถ๋ถ. Java SE 11๋ถํฐ Oracle JDK์ ๋ ์ ๊ธฐ๋ฅ์ด ์คํ ์์ค ๋ฒ์ ์ธ OpenJDK์ ์ด์๋๋ค. ์ด๋ ๋ค์ ๋งํด Oracle JDK์ OpenJDK๊ฐ ์์ ํ ๋์ผํด์ง๋ค๋ ๋ป์ด๋ค. Oracle JDK๋ Java SE 11๋ถํฐ LTS(์ฅ๊ธฐ ์ง์)๋ฒ์ ์ผ๋ก 3๋ ๋ง๋ค ์ถ์๋๋๋ฐ, ์ถ์ ํ 5๋ ๋์ ์ค๋ผํด์ ๊ธฐ์ ์ง์์ด ์ ๊ณต๋๊ณ ์ต๋ 3๋ ๊น์ง ์ง์ ๊ธฐ๊ฐ์ ์ฐ์ฅํ ์ ์๋ค. Oracle JDK๋ ์ด์ 3๋ ์ ํ ๋ฒ ์ถ์๋๋ ์๋ฐ์ ์ค์ง์ ์ธ ๋ฒ์ ์ ์ ๋ด๋นํ๋ ๊ฒ์ OpenJDK๋ผ ํ ์ ์๋ค. OpenJDK๋ ๊ธฐ์ ๋ค์ ์ํ ๊ธฐ์ ์ง์์ ์๊ณ , ์๋ก์ด ๋ฒ์ ์ด ๋์ค๋ฉด ์ด์ ๋ฒ์ ์ ๋ํ ๋ง์ด๋ ์ ๋ฐ์ดํธ์ ๋ณด์ ์ ๋ฐ์ดํธ๋ ์ค๋จ๋๋ค.
Java 11๊ณผ ํจ๊ป ๋ฐํ๋ ๋ ๋ค๋ฅธ ์์์ Oracle JDK๊ฐ ๊ตฌ๋ ํ ์ ๋ฃ ๋ชจ๋ธ๋ก ์ ํ๋๋ค๋ ์ ์ด๋ค. 2019๋ 1์๋ถํฐ ์ค๋ผํด์ด ์ ๊ณตํ๋ ๋ชจ๋ Oracle JDK๋ ์ ๋ฃํ๋๋ฉฐ, ๊ตฌ๋ ๊ถ์ ๊ตฌ์ ํ์ง ์์ผ๋ฉด Oracle JDK์ ์ ๊ทผ ์์ฒด๊ฐ ๊ธ์ง๋๋ค. ๊ธฐ์กด์ ์ผ๋ฐ/์ฐ์ฅ ์ง์ ์๋น์ค๋ ๊ตฌ๋ ๊ถ์ ํฌํจ๋๋ฏ๋ก ๋ณ๋์ ์๋น์ค๋ก๋ ์ ๊ณต๋์ง ์์ต๋๋ค. ๊ฐ์ธ ์ฌ์ฉ์๋ 2021๋ 1์๋ถํฐ ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ค. ์ด ๋๋ฌธ์ ๋ง์ ๊ธฐ์ ๋ค์ด Oracle JDK์์ ๋ฐ์ ๋นผ๊ณ ์์ผ๋ฉฐ, OpenJDK๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ค๋ฅธ ์๋ํํฐ JDK๊ฐ ๋์์ผ๋ก ๋ ์ค๋ฅด๊ณ ์๋ค. ๋ํ์ ์ธ ์๋ก Azul Systems์์ ๊ฐ๋ฐํ Zulu JDK๋ ์ค๋ผํด์ TCK(Technology Certification Kit) ์ธ์ฆ์ ๋ฐ์ ๊ตฌํ์ฒด์ด๋ค. ๊ฐ์ธ๊ณผ ๊ธฐ์ ๋ชจ๋ ๋ฌด๋ฃ๋ก ์ฌ์ฉ ํ ์ ์๊ณ , ๊ธฐ์ ์ง์์ ํํด์๋ง ์ ๋ฃ ์๋น์ค๊ฐ ์ ๊ณต๋๋ค. ๋ ๋ค๋ฅธ ๋์์ผ๋ก๋ AdoptOpenJDK๊ฐ ์๋๋ฐ, AdoptOpenJDK๋ HotStop VM๋์ Eclipse OpenJ9๋ฅผ ํ์ฌํ ๋ฒ์ ๋ ๊ฐ์ด ์ ๊ณตํ๊ณ ์๋ค. ๋ค๋ง ์์ง TCK ์ธ์ฆ์ ๋ฐ์ง ์์๊ธฐ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
# [ JAVA SE 12 ]
2019๋ 3์ 19์ผ ๊ณต๊ฐ๋ ๋ฒ์ ์ด๋ค. ํน์ง ์ค ํ๋๋ก ๋ฌธ๋ฒ์ ์ผ๋ก Switch๋ฌธ์ ํ์ฅํ ๊ฒ์ด ์๋ค.
- AS-IS
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break; case TUESDAY:
System.out.println(7);
break; case THURSDAY:
case SATURDAY:
System.out.println(8);
break; case WEDNESDAY:
System.out.println(9);
break;
}
- TO-BE
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
์ด์ธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ฐ์ , ๋ง์ดํฌ๋ก ๋ฒค์น๋งํฌ ํด ์ถ๊ฐ, ์ฑ๋ฅ ๊ฐ์ ์ ๋ณ๊ฒฝ์ ์ด ์๋ค.
# [ JAVA SE 13 ]
2019๋ 9์ 17์ผ ๊ณต๊ฐ๋ ๋ฒ์ ์ด๋ฉฐ, java 12์์์ ์ค์์น ๊ฐ์ ์ ์ด์ด yield๋ผ๋ ์์ฝ์ด๊ฐ ์ถ๊ฐ๋์๋ค.
var a = switch (day) {
case MONDAY, FRIDAY, SUNDAY:
yield 6;
case TUESDAY:
yield 7;
case THURSDAY, SATURDAY:
yield 8;
case WEDNESDAY:
yield 9;
};
# [ JAVA SE 14 ]
2020๋ 3์ 18์ผ ๊ณต๊ฐ๋ ๋ฒ์ ์ด๋ค. ํ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ์ผ๋ก instanceof์ ํจํด ๋งค์นญ๊ณผ record๋ผ๋ ๋ฐ์ดํฐ ์ค๋ธ์ ํธ ์ ์ธ์ด ์ถ๊ฐ๋์๋ค. ๊ทธ ์ธ์ ์ธํ๋ฒ ์ดํฐ๋ผ๋ ํจํค์ง ํด(OS์ ๋ง์ถ ์คํํ์ผ ์์ฑ ๊ธฐ๋ฅ) ์ถ๊ฐ ๋ฑ์ด ์๋ค.
- instanceof ํจํด ๋งค์นญ
if (!(obj instanceof String s)) {
.. s.contains(..) ..
} else {
.. s.contains(..) ..
}
- record ํ์ ์ง์
record Point(int x, int y) {}
# [ JAVA SE 15 ]
2020๋ 9์ 15์ผ ๊ณต๊ฐ๋ ๋ฒ์ .
- EdDSA ์ํธํ ์๊ณ ๋ฆฌ์ฆ ์ถ๊ฐ
- ํจํด ๋งค์นญ (2์ฐจ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์๋จ Java 14 ์ฐธ์กฐ)
- ์ค์ผ์ผ๋ง ๊ฐ๋ฅํ ๋ฎ์ ์ง์ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์ถ๊ฐ(ZGC)
- Solaris ๋ฐ SPARC ํ๋ซํผ ์ง์ ์ ๊ฑฐ
- ์ธ๋ถ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ API (์ธํ๋ฒ ์ดํ )
- ๋ ์ฝ๋ (2์ฐจ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์๋จ Java 14 ์ฐธ์กฐ)
- ํด๋์ค ๋ด์ธ (๋ฏธ๋ฆฌ ๋ณด๊ธฐ)
- ์์ ๊ฐ๋ฅํ ํด๋์ค๋ฅผ ์ง์ ํ ์ ์๋ ๋ด์ธ ํด๋์ค๊ฐ ์ ๊ณต
- ์์ ๊ฐ๋ฅํ ๋์์ ์์ ํด๋์ค ๋๋ ์ธํฐํ์ด์ค ํจํค์ง ๋ด์ ์ํด ์์ด์ผ ํ๋ค
package wiki.namu.example.species;
public sealed class Animal
Dog,
wiki.namu.example.species.india.Monkey,
wiki.namu.example.species.sabana.Leopard
{
// ...
}
- ํ ์คํธ ๋ธ๋ก
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
# 1005 - TCP์ย UDP
TCP์ UDP๋ TCP/IP์ ์ ์ก๊ณ์ธต์์ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ด๋ค. ์ ์ก๊ณ์ธต์ IP์ ์ํด ์ ๋ฌ๋๋ ํจํท์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ๊ณ ์ฌ์ ์ก ์๊ตฌ ๋ฑ์ ์ ์ด๋ฅผ ๋ด๋นํ๋ ๊ณ์ธต์ด๋ค.
# TCP(Transmission Control Protocol)
์ ์ก์ ์ ์ดํ๋ ํ๋กํ ์ฝ
์ธํฐ๋ท์์์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์ธ์ง์ ํํ๋ก ๋ณด๋ด๊ธฐ ์ํด IP์ ํจ๊ป ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก TCP์ IP๋ฅผ ํจ๊ป ์ฌ์ฉํ๋๋ฐ, IP๊ฐ ๋ฐ์ดํฐ์ ๋ฐฐ๋ฌ์ ์ฒ๋ฆฌํ๋ค๋ฉด TCP๋ ํจํท์ ์ถ์ ๋ฐ ๊ด๋ฆฌํ๊ฒ ๋๋ค. TCP๋ ์ฐ๊ฒฐํ ์๋น์ค๋ฅผ ์ง์ํ๋ ํ๋กํ ์ฝ๋ก ์ธํฐ๋ท ํ๊ฒฝ์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค.
# [ ํน์ง ]
- ์ฐ๊ฒฐํ ์๋น์ค๋ก ๊ฐ์ ํ์ ๋ฐฉ์์ ์ ๊ณตํ๋ค. (ํจํท ์ ์ก์ ์ํ ๋ ผ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ๋ฐฐ์ )
- 3-way handshaking๊ณผ์ ์ ํตํด ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ 4-way handshaking์ ํตํด ํด์ ํ๋ค.
- ํ๋ฆ ์ ์ด ๋ฐ ํผ์ก ์ ์ด๋ฅผ ํ๋ค.
- ๋์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ค. (Sequence Number, Ack)
- UDP๋ณด๋ค ์๋๊ฐ ๋๋ฆฌ๋ค.
- ์ ์ด์ค(Full-Duplex), ์ ๋์ (Point to Poin)๋ฐฉ์์ด๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ 1๋ 1๋ก ์ฐ๊ฒฐ๋๋ค.
- ์คํธ๋ฆฌ๋ฐ ์๋น์ค์ ๋ถ๋ฆฌํ๋ค. (์์ค๋ ๊ฒฝ์ฐ, ์ฌ์ ์ก ์์ฒญ)
# [ ์ฅ์ ]
- 3-way handshaking๊ณผ์ ์ ๋ชฉ์ ์ง์ ์์ ์ง๋ฅผ ํ์คํ ํ์ฌ ์ ํํ ์ ์ก์ ๋ณด์ฅํ๊ธฐ ์ํด์ ์ธ์ ์ ์๋ฆฝํ๋ ๊ณผ์ ์ด๋ค. TCP๋ ์ฐ๊ฒฐํ ์๋น์ค๋ก ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ 3-way handshaking์ ๊ณผ์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ด๋ ํผ์ก ์ ์ด์ ๊ฐ์ ๊ธฐ๋ฅ๋ ํ๋ค. ํ์ง๋ง ์ด๋ฌํ ๊ธฐ๋ฅ๋๋ฌธ์ UDP๋ณด๋ค ์๋๊ฐ ๋๋ฆฌ๋ค.
- ํต์ ์ ์ ๋ขฐ์ฑ์ด ๋๋ค.
# [ ๋จ์ ]
- ๋ฐ์ดํฐ๋ก ๋ณด๋ด๊ธฐ์ ์ ๋ฐ๋์ ์ฐ๊ฒฐ์ด ํ์ฑ๋์ด์ผ ํ๋ค.
- 1:1 ํต์ ๋ง ๊ฐ๋ฅํ๋ค.
- ๊ณ ์ ๋ ํต์ ๊ฒฝ๋ก๊ฐ ์ต๋จ์ ์ด ์๋๊ฒฝ์ฐ ์๋์ ์ผ๋ก UDP๋ณด๋ค ๋ฐ์ดํฐ ์ ์ก์๋๊ฐ ๋๋ฆฌ๋ค.
# UDP(User Datagram Protocol)
์ฌ์ฉ์ ๋ฐ์ดํฐ๊ทธ๋จ ํ๋กํ ์ฝ
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๊ทธ๋จ ๋จ์๋ก ์ฒ๋ฆฌํ๋ ํ๋กํ ์ฝ์ด๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๊ทธ๋จ์ด๋ ๋
๋ฆฝ์ ์ธ ๊ด๊ณ๋ฅผ ์ง๋๋ ํจํท์ด๋ค.
TCP์ ๋ฌ๋ฆฌ UDP๋ ๋น์ฐ๊ฒฐํ ํ๋กํ ์ฝ๋ก ์ฐ๊ฒฐ์ ์ํด ํ ๋น๋๋ ๋
ผ๋ฆฌ์ ๊ฒฝ๋ก๊ฐ ์๋ค. ๋๋ฌธ์ ๊ฐ๊ฐ์ ํจํท์ ๋ค๋ฅธ๊ฒฝ๋ก๋ก ์ ์ก๋๊ณ , ๊ฐ๊ฐ์ ํจํท์ ๋
๋ฆฝ์ ์ธ ๊ด๊ณ๋ฅผ ์ง๋๊ฒ ๋๋๋ฐ ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋
๋ฆฝ์ ์ธ ๊ฒฝ๋ก๋ก ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ฆ, UDP๋ ๋ฐ์ ์๊ฐ ๋ฐ์ดํฐ ํจํท์ ์์ฐจ์ ์ผ๋ก ๋ณด๋ด๋๋ผ๋ ์ด ํจํท๋ค์ ์๋ก ๋ค๋ฅธ ํต์ ์ ๋ก๋ฅผ ํตํด ์ ๋ฌ๋ ์ ์๋ค. ๋จผ์ ๋ณด๋ธ ํจํท์ด ๋๋ฆฐ ์ ๋ก๋ฅผ ํตํด ์ ์ก๋ ๊ฒฝ์ฐ ๋์ค์ ๋ณด๋ธ ํจํท๋ณด๋ค ๋ฆ๊ฒ ๋์ฐฉํ ์ ์์ผ๋ฉฐ ์ต์
์ ๊ฒฝ์ฐ ์ ์ค๋ ์๋ ์๋ค. UDP๋ ์ค๊ฐ์ ํจํท์ด ์ ์ค์ด๋ ๋ณ์กฐ๊ฐ ๋์ด๋ ์ฌ์ ์ก์ ํ์ง ์๋๋ค.
# [ ํน์ง ๋ฐ ์ฅ์ ]
- ๋น์ฐ๊ฒฐํ ์๋น์ค๋ก ๋ฐ์ดํฐํฌ๋จ ๋ฐฉ์์ด๋ค. (์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ํด์ ํ๋ ๊ณผ์ ์ด ์กด์ฌํ์ง ์๋๋ค.)
- ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์๋ ์ ๋ณด๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ๋๋ค๋ ์ ํธ์ ์ฐจ๊ฐ ์๋ค.
- UDPํค๋์ CheckSum ํ๋๋ฅผ ํตํด ์ต์ํ์ ์ค๋ฅ๋ง ๊ฒ์ถํ๋ค.
- TCP๋ณด๋ค ์๋๊ฐ ๋น ๋ฅด๋ค.
- ์ ๋ขฐ์ฑ๋ณด๋ค๋ ์ฐ์์ฑ์ด ์ค์ํ ์๋น์ค(์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ์๋น์ค)์์ ์์ฃผ ์ฌ์ฉ.
- ์์ผ ๋์ IP์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ก.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ตฌ๋ถ์ด ์๋ค. (1:1, 1:N, N:M ๋ฑ์ผ๋ก ์ฐ๊ฒฐ๊ฐ๋ฅ)
# [ ๋จ์ ]
- ์ ๋ขฐ์ฑ์ด ๋ฎ๋ค.
- ํ๋ฆ์ ์ด(flow control)๊ฐ ์์ด์ ํจํท์ด ์ ๋๋ก ์ ์ก๋์๋์ง, ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํ ์ ์๋ค.
# 1007 - ์๋ฐ์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ 3๊ฐ์ง ํค์๋
# 1. synchronized
synchronized
ํค์๋๋ฅผ ํตํด ํด๋น ๋ธ๋ญ์ ์ก์ธ์ค๋ฅผ ๋๊ธฐํํ ์ ์๋ค.
๊ฐ๋จํ ๋งํด์ synchronized
๊ฐ ์ ์ธ๋ ๋ธ๋ญ์๋ ๋์์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋ค.
- ์์
public class SomeClass {
// ๋ฉ์๋ ์ ์ฒด์ ๋๊ธฐํ ์ ์ฉ
public synchronized void foo() {
/* critical section */
}
// ๋ด๋ถ์ ๋๊ธฐํ ๋ธ๋ญ ์์ฑ
public void bar() {
synchronized (this) {
/* critical section */
}
}
}
// ํด๋์ค ๋ด๋ถ์ ์ ์ญ ๋ฉ์๋์์ ๋๊ธฐํ ๋ธ๋ญ์ ์์ฑํ๋ ๋ฐฉ๋ฒ
public class SomeClass {
public static void syncMethod() {
synchronized (SomeClass.class) {
/* critical section */
}
}
}
- synchronized method
- ๋๊ธฐํ๋ฅผ ์ํค๊ณ ์ถ์ ํด๋์ค์ ๋ฉ์๋์ synchronized ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๋๊ณ , synchronized method๋ ์ธ์คํด์ค ๋จ์์ synchronized ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋์ ๋ํด์๋ง lock ๊ณต์ ํ๋ค.
- static synchronized method
- static synchronized method ๋ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ๋จ์๋ก lock์ ๊ณต์ ํ๋ฉฐ, synchronized method์ ๋์ผํ๊ฒ ํจ์ ๊ฐ์ ๋๊ธฐํ๊ฐ ๋ฐ์ํ๋ค. ๋ง์ฝ synchronized method๊ณผ ํจ๊ป ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ธ์คํด์ค ๋ฝ๊ณผ ํด๋์ค ๋ฝ์ ๊ณต์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํ๋ค.
- synchronized block
- synchronized(this) : ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ค์ด์ ์๋ก ๋ค๋ฅธ block์ ํธ์ถํด๋ this๋ฅผ ์ฌ์ฉํด ์์ ์ lock์ ๊ฑธ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
- synchronized(Object) : block๋ง๋ค ์๋ก ๋ค๋ฅธ lock์ ๊ฑธ๋ฆฌ๊ฒํด ํจ์ฌ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- static synchronized block
- ํด๋์ค ๋จ์๋ก lock์ ๊ณต์ ํ๋ lock๊ฐ์ฒด๋ฅผ ์ง์ ํ๊ณ block์ผ๋ก ๋ฒ์๋ฅผ ํ์ ์ง์ ์ ์๋ค.
# 2. volatile
JVM์์ ์ค๋ ๋๋ ์คํ๋๊ณ ์๋ CPU ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ค(CPU Cache). ๋ฐ๋ผ์ ๋ฉํฐ ์ฝ์ด ํ๋ก์ธ์์์ ๋ค์์ ์ค๋ ๋๊ฐ ๋ณ์ a๋ฅผ ๊ณต์ ํ๋๋ผ๋ ์บ์ฑ๋ ์์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ฝ์ด์ ์ค๋ ๋๋ ๋ฐ์ดํฐ ๊ฐ์ด ๋ถ์ผ์นํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํด ์ฃผ์ง ์๋ ์ด์ ์บ์ฑ ๋ ๋ฐ์ดํฐ๊ฐ ์ธ์ ๊ฐฑ์ ๋๋์ง ๋ํ ์ ํํ ์ ์ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ volatile
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ CPU ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์บ์ฑ๋ ๊ฐ์ด ์๋๋ผ ํญ์ ์ต์ ์ ๊ฐ์ ๊ฐ์ง๋๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๊ฐ์ ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค. -> ์ฆ, ๋์ผ ์์ ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋๋ก ๋๊ธฐํํ๋ค.
public volatile long count = 0;
ํ์ง๋ง volatile
์ ํตํด ๋ชจ๋ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋๊ฑด ์๋๋ค. ์์์ฑ์ด ๋ณด์ฅ๋์ง ์๋ ๊ฒฝ์ฐ ๋์์ฑ ๋ฌธ์ ๋ ๋์ผํ๊ฒ ๋ฐ์ํ๋ค.(๋จ์ง ๋ฉํฐ ์ฝ์ด์์์ ๋ชจ๋ ์ค๋ ๋๊ฐ ์บ์ ์์ด ์ต์ ์ ๊ฐ์ ๋ณด๊ฒ ํ ๋ฟ)
# Atomic ํด๋์ค
์์์ ์ค๋ช
ํ ๋ ๊ฐ์ง ํค์๋ synchronized
, volatile
๋ง์ผ๋ก๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
์๋ฐ์์๋ ์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด, ๋น-์์์ ์ฐ์ฐ์์๋ ๋๊ธฐํ๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ด์ฉํ๊ธฐ ์ํ ํด๋์ค ๋ชจ์์ ์ ๊ณตํ๋ค.
java.util.concurrent.* (๋ํ์ ์ผ๋ก ์ปฌ๋ ์ , Wrapper ํด๋์ค ๋ฑ์ด ์๋ค.)
- java.util.concurrent.atomic.AtomicLong
public class AtomicLong extends Number implements java.io.Serializable {
private volatile long value; // volatile ํค์๋๊ฐ ์ ์ฉ๋์ด ์๋ค.
public final long incrementAndGet() { // value ๊ฐ์ ์ค์ ๋ก ์ฆ๊ฐ์ํค๋ ๋ฉ์๋
return U.getAndAddLong(this, VALUE, 1L) + 1L;
}
}
- jdk.internal.misc.Unsafe
public final class Unsafe {
// ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ๊ณผ CPU์ ์บ์๋ ๊ฐ์ ๋น๊ตํด ๋์ผํ ๊ฒฝ์ฐ์๋ง update ์ํ
public final long getAndAddLong(Object o, long offset, long delta) {
long v;
do {
v = getLongVolatile(o, offset);
} while (!weakCompareAndSetLong(o, offset, v, v + delta)); // CAS ์๊ณ ๋ฆฌ์ฆ (JNI ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.)
return v;
}
}
Non-Blocking ์์๋ ๋์์ฑ์ ๋ณด์ฅํ๋ ์ด์ ๋ CAS(Compare-and-swap) ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
- valatile ํค์๋๋ฅผ ์ด์ฉํ๋ฉด์ ํ์ฌ ์ค๋ ๋์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ ๋น๊ตํ๋ค.
- ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒด(thread-safe ํ ์ํ์ด๋ฏ๋ก ๋ก์ง ์ํ)
- ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์คํจ ํ ์ฌ์๋(thread-safe ํ์ง ์์ ์ํ์์ผ๋ฏ๋ก ์ฌ์๋)
์ฑ๋ฅ๋น๊ต ๋ฐ ๋ง๋ฌด๋ฆฌ
- Blocking(synchronized)
private static long startTime = System.currentTimeMillis();
private static int maxCnt = 1000;
private static long count = 0;
@Test
void threadNotSafe() throws Exception {
for (int i = 0; i < maxCnt; i++) {
new Thread(this::plus).start();
}
Thread.sleep(2000); // ๋ชจ๋ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋ ๋ ๊น์ง ์ ๊น ๋๊ธฐ
Assertions.assertThat(count).isEqualTo(maxCnt);
}
public synchronized void plus() {
if (++count == maxCnt) {
System.out.println(System.currentTimeMillis() - startTime);
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
ํ๊ท 1300ms ์ ๋ ์์๋์๋ค. (Blocking ์ฐ์ฐ์์ 1000๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ๊ฐ 1ms์ ์ถ๊ฐ ๋๋ ์ด๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ)
- Non-Blocking (AtomicLong)
private static long startTime = System.currentTimeMillis();
private static int maxCnt = 1000;
private static AtomicLong count2 = new AtomicLong();
@Test
void threadNotSafe2() throws Exception {
for (int i = 0; i < maxCnt; i++) {
new Thread(this::plus2).start();
}
Thread.sleep(2000); // ๋ชจ๋ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋ ๋ ๊น์ง ์ ๊น ๋๊ธฐ
Assertions.assertThat(count2.get()).isEqualTo(maxCnt);
}
public void plus2() {
if (count2.incrementAndGet() == maxCnt) {
System.out.println(System.currentTimeMillis() - startTime);
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
ํ๊ท 140ms ์ ๋ ์์๋์๋ค. (Non-Blocking ์ฐ์ฐ์์ 1ms์ ์ถ๊ฐ ๋๋ ์ด๋ ํฐ ์๋ฏธ๊ฐ ์๋ค.)
์์๋ก ๋๋ ์ด๋ฅผ ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋๋ผ๋งํฑํ๊ฒ ์ฐจ์ด๊ฐ๋๋ค
# 1008 - ์๋ฐ ์ค๊ณ ๊ฒฐํจ
# 1. Generics์ ํ์ ์ Runtime์ ํ์ฉํ ์ ์๋ค.
์ ๋ค๋ฆญ์ด๋?
- ์๋ฐ์ ์ ๋ค๋ฆญ์ด๋ ํด๋์ค์ ํจ์๋ฑ์ type์ ๋ง์น ๋งค๊ฐ๋ณ์ ๊ฐ์ฒ๋ผ ๋ฃ์ด ์ค์ผ๋ก์ ์ปดํ์ผ ํ์์ ๋ฏธ๋ฆฌ ํ์ ์ค๋ฅ๋ฅผ ๊ฒ์ถ ํ ์ ์๋๋ก ํ๋ ๊ฐ๋ .
์ ๋ค๋ฆญ์ ํ๊ณ
- ์ ๋ค๋ฆญ์ ํ์ฉํด ์ปดํ์ผ ํ์์ ํ์ ์ฒดํฌ๋ฅผ ํ๊ณ ๋๋ฉด ์ ๋ค๋ฆญ ์ธ์๋ก ๋๊ฒจ์ ธ ์จ ํ์ ์ Type erasure๋ผ๋ ์ ์ฐจ๋ฅผ ํตํด ์ ๊ฑฐ๋๋ค. ๋ฐ๋ผ์ ์ธ์๋ก ๋๊ฒจ์ง ํ์ ์ Runtime์์๋ ํ์ฉ ๋ ์ ์๋ค.
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) { // evaluates to true
System.out.println("Equal");
}
- ์์ ๊ฐ์ ์ฝ๋๋ ์ ๋ค๋ฆญ ํ์ ์ธ์ ๊ฐ์ด ๋ค๋ฅด์ง๋ง ๊ฐ์ ํด๋์ค๋ก ์ธ์ ๋๋ค. Runtime์๋ ํ์ ์ด ์ง์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
public class MyClass<E> {
public static void myMethod(Object item) {
if (item instanceof E) { //Compiler error
...
}
E item2 = new E(); //Compiler error
E[] iArray = new E[10]; //Compiler error
}
}
- ๋ํ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ instanceof. new๋ฑ์ ์ฐ์ฐ์๋ฅผ ํ์ฉํ ์ ์๋ ์ด์ ๋ Type erasure ๋๋ฌธ์ด๋ค.
# 2. Unsigned integer types๊ฐ ์๋ค.
- ์๋ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก c, c++๋ฑ์์ ์กด์ฌํ๋ unsigned ์๋ฃํ์ด ์กด์ฌํ์ง ์๋๋ค.
- ์ํธํ๊ณผ ๊ฐ์ด ๋งค์ฐ ํฐ ์์ ์ ์๋ฅผ ํ์ฉํด ๋ค์ํ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ถ์ผ์์ ์ฌ์ฉํ๊ธฐ์ ๋ถ์ ํฉํ ์ ์๋ค.
- 2์ ๋ณด์ ํํ์ด๋ ๋นํธ๊ด์ ์์์ ํํ์ ์ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ค๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ธ๋ค๋ฉด ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ด๊ธฐ๋ ํ์ง๋ง ๊ฐ๋ฐํ ๋์ ์ถ๊ฐ์ ์ธ ๋ ธ๋ ฅ์ด ํ์ํ๋ค.
# 3. Operator everloading์ ํ ์ ์๋ค.
- ์๋ฐ์์๋ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํ์ฉํ์ง ์๋๋ค.(์์ธ์ ์ผ๋ก String์ +, += ์ฐ์ฐ์๋ง์ด ์ ์ผํ๊ฒ ์กด์ฌํ๋ค.)
- ์ํ์ ์ธ ๋ด์ฉ์ ๊ฐ์ฒด๋ค์ ๋ํด์ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ณ ํ์ฉํ๋๋ฐ์ ๋ถํธํ ์ ์ด ์๋ค.
# 4. ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ 2^31์ผ๋ก ์ ํ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฑ์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋ฐฐ์ด์์ฒด์ ํฌ๊ธฐ๋ฅผ int์๋ฃํ์ผ๋ก ์ ์ํ๊ธฐ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ 2^31๋ณด๋ค ํฐ ๋ฐฐ์ด์ ์ ์ํ ์ ์๋ค.
# 5. primitives type๊ณผ Array๊ฐ ํด๋์ค์ ๋ค๋ฅด๊ฒ ์ทจ๊ธ๋จ.
- ๋ค๋ฅธ ํด๋์ค๋ค๊ณผ ๋ค๋ฅด๊ฒ ์์๊ฐ๊ณผ ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ฐฉ์์ ๋ฌธ๋ฒ์ด ํ์ฉ๋๋๋ฐ ์ธ์ด๋ฅผ ์ตํ๊ฑฐ๋ ํ์ฉํ๋์ ์์ ๋นํจ์จ์ ์์ ํ๋ค.
# 1009 - Jackson ObjectMapper
@Getter
@Setter
@NoArgsConstructor
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
}
- Object to Json
ObjectMapper objectMapper = new ObjectMapper();
Cat cat = new Cat("kitty");
String catString = objectMapper.writeValueAsString(cat);
System.out.println("catString : " + catString);
--- output ---
catString : {"name":"kitty"}
- Json to Object
String json = "{\"name\":\"kitty\"}";
Cat cat2 = objectMapper.readValue(json, Cat.class);
System.out.println("cat2 name : " + cat2.getName());
--- output ---
cat2 name : kitty
- Json to Jackson JsonNode
JsonNode jsonNode = objectMapper.readTree(json);
String name = jsonNode.get("name").asText();
System.out.println("Tree cat2 name : " + name);
--- output ---
Tree cat2 name : kitty
- Json List to List
String jsonList = "[{\"name\":\"kitty\"},{\"name\":\"kitty2\"}]";
List<Cat> cats = objectMapper.readValue(jsonList, new TypeReference<List<Cat>>() {});
for (Cat catElement : cats) {
System.out.println("catElement : " + catElement.getName());
}
--- output ---
catElement : kitty
catElement : kitty2