week 7 incheol - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
์๊ณ ๋ฆฌ์ฆ
๊ธฐ์ ๋ฌธ์
-
JAVA(์ ์ ํ)
-
java์ non-static ๋ฉค๋ฒ์ static ๋ฉค๋ฒ์ ์ฐจ์ด
- static ํค์๋๋?
- ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ์ ์ต์ด์ ํ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค ์ฌ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค.
- ํด๋์ค๋ฅผ ์ค๊ณํ ๋, ๋ฉค๋ฒ๋ณ์ ์ค ๋ชจ๋ ์ธ์คํด์ค์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํด์ผํ๋ ๊ฒ์ static์ ๋ถ์ธ๋ค.
- ์ ์ ๋ฉ์๋๋ ๋ฌด์จ ๊ธฐ์ค์ผ๋ก ์ ํด์ผํ๋๊ฐ?
- ๋ง์ฝ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ก ์์ฑ๋๊ณ , ๋ณํ๋ฅผ ๊ฐ์ ํ์ง ์๋๋ค.
- ๋ง์ฝ ๋ฉ์๋๊ฐ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ์ธ์คํด์ค ์์ฑ์ ์์กดํ์ง ์๋๋ค.
- ๋ฉ์๋๊ฐ ๊ณต์ ๋๊ณ ์๋ค๋ฉด, ์ ์ ๋ฉ์๋๋ก ์ถ์ถํด๋ผ ์ ์๋ค.
- ๋ฉ์๋๊ฐ ๋ณํ๋์ง ์๊ณ , ์ค๋ฒ๋ผ์ด๋ฉ ๋์ง ์๋๋ค.
- static ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ๊ฐ๋ method area๋?
-
Method Area๋ Class์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํ๋ค. Class ์ Method๊ฐ์ ๊ฒฝ์ฐ Method Area์ ์ ์ฅ ๋๋ค. Method์ ํด๋์ค์ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ Class ์ Meta ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.(Field ์ด๋ฆ, Fieldํ์ , Class ์ด๋ฆ ๋ฑ๋ฑ) ์๋์ Method Area์ ์ ์ฅ๋๋ ์ ๋ณด๋ฅผ ์์ธํ๊ฒ ๋ํ๋ธ ๊ทธ๋ฆผ์ด๋ค.
Java 8 ์ด์ ์ Method Area๋ฅผ **PermGen(Permanat Generation Space)**์ ํ ๋น ํ๋ค
Java 8 ์ดํ์๋ PermGen์ด ์์ ํ ์ ๊ฑฐ ๋์ด Method Area๋ Native Heap์ ํ ๋น ๋๋ค. ๊ณผ๊ฑฐ์ PermGen์ ํ์ฌ Metaspace ๋ก ๋ถ๋ฆฌ์ฐ๋๋ฐ Method Area๋ Meta ์ ๋ณด๋ฅผ ์ ์ฅ ํ๊ธฐ ๋๋ฌธ์ด๋ค. PermGen์์๋ Default๋ก Maximum size๋ฅผ ํ ๋น ํ์๋๋ฐ ๋ง์ฝ ํด๋น ์ฌ์ด์ฆ์ ๋๋ฌ ํ๋ฉด OutOfMemoryErr ๊ฐ ์์ฑ ๋์๋ค.
Metaspace์์๋ Maximum size๊ฐ ๋ฐ๋ก ์ค์ ๋ ์ด์์ง ์๊ณ ์์คํ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ๊ฐ Maximum size์ด๋ค. ๋ํ Garbage Collector ํผํฌ๋จผ์ค์ ์ฑ๋ฅ์ ํฅ์์์ผฐ๋ค.
-
- static ํค์๋๋?
-
๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ์ ๋ํด ์ค๋ช
-
๋ํผ(Wrapper) ํด๋์ค
๊ธฐ๋ณธ ์๋ฃํ(int, double, boolean ๋ฑ)์ ๋ฐ์ดํฐ๋ฅผ ์ธ์คํด์ค(๊ฐ์ฒด)๋ก ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ(ํฌ์ฅ) ํ๋ ํด๋์ค์ด๋ค.
-
์ฌ์ฉ ์ด์
๊ธฐ๋ณธ ์๋ฃํ์ ๊ฐ์ ๊ตณ์ด ๋ํผ(wrapper) ํด๋์ค๋ก ํฌ์ฅํ๋ ์ด์ ๋ ์ ๋ค๋ฆญ, ์๋ฃ๊ตฌ์กฐ, ๋งค๊ฐ๋ณ์ ๋ฑ ๊ธฐ๋ณธ ์๋ฃํ์ด ์๋ ๋ ํผ๋ฐ์ค ํ์ ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์์ด ๋ค์ํ๊ฒ ํ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑ(heap ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ) ํ์ฌ ์์ ๋ฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ํ ๋ฌธ์์ด(String)๊ณผ ๊ธฐ๋ณธ ์๋ฃํ ๊ฐ ํ ๋ณํํ์ฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.(์ด๊ฒ์ ๊ดํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ ์ ๋ค๋ฃฐ ์์ ์ด๋ค. )
-
-
๋ฐ์ฑ(boxing)์ ๊ธฐ๋ณธ ์๋ฃํ์ ๋ฐ์ดํฐ๋ฅผ ๋ํผ(wrapper) ํด๋์ค์ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ณผ์ ์ ์๋ฏธ
-
์ธ๋ฐ์ฑ(un boxing)์ ๋ํผ(wrapper) ํด๋์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ณธ ์๋ฃํ์ผ๋ก ์ป์ด๋ด๋ ๊ณผ์ ์ ์๋ฏธ
-
-
-
SPRING(๊น์งํ)
-
JPA vs Mybatis
-
JDBC
JDBC๋ DB์ ์ ๊ทผํ ์ ์๋๋ก Java์์ ์ ๊ณตํ๋ API์ด๋ค. ๋ชจ๋ Java์ Data Access ๊ธฐ์ ์ ๊ทผ๊ฐ ์ฆ, ๋ชจ๋ Persistence Framework๋ ๋ด๋ถ์ ์ผ๋ก JDBC API๋ฅผ ์ด์ฉํ๋ค.
-
JPA
์๋ฐ ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช ์ธ๋ก, Java์์ ์ ๊ณตํ๋ API์ด๋ค. ์๋ฐ ํ๋ซํผ SE์ ์๋ฐ ํ๋ซํผ EE๋ฅผ ์ฌ์ฉํ๋ ์์ฉํ๋ก๊ทธ๋จ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ฆฌ๋ฅผ ํํํ๋ ์๋ฐ API์ด๋ค. ์ฆ, JPA๋ ORM์ ์ฌ์ฉํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ๋ชจ์๋ ๊ฒ์ด๋ค. ๊ธฐ์กด์ EJB์์ ์ ๊ณต๋๋ ์ํฐํฐ ๋น(Entity Bean)์ ๋์ฒดํ๋ ๊ธฐ์ ์ด๋ค
์ฌ์ฉ์๊ฐ ์ํ๋ JPA ๊ตฌํ์ฒด๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์๋ค. JPA์ ๋ํ์ ์ธ ๊ตฌํ์ฒด๋ก๋ Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials ๋ฑ์ด ์๋ค. ์ด ๊ตฌํ์ฒด๋ค์ ORM Framework๋ผ๊ณ ๋ถ๋ฅธ๋ค.
-
Hibernate
Hibernate๊ฐ SQL์ ์ง์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํด์ JDBC API๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋ค. Hibernate๊ฐ ์ง์ํ๋ ๋ฉ์๋ ๋ด๋ถ์์๋ JDBC API๊ฐ ๋์ํ๊ณ ์์ผ๋ฉฐ, ๋จ์ง ๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ ์ง์ ์์ฑํ์ง ์์ ๋ฟ์ด๋ค.
-
Mybatis
๊ฐ๋ฐ์๊ฐ ์ง์ ํ SQL, ์ ์ฅ ํ๋ก์์ ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๋งคํ์ ์ง์ํ๋ SQL Mapper์ด๋ค. JDBC๋ก ์ฒ๋ฆฌํ๋ ์๋น ๋ถ๋ถ์ ์ฝ๋์ ํ๋ผ๋ฏธํฐ ์ค์ ๋ฐ ๊ฒฐ๊ณผ ๋งคํ์ ๋์ ํด์ค๋ค. ๊ธฐ์กด์ JDBC๋ฅผ ์ฌ์ฉํ ๋๋ DB์ ๊ด๋ จ๋ ์ฌ๋ฌ ๋ณต์กํ ์ค์ (Connection)๋ค์ ๋ค๋ฃจ์ด์ผ ํ์ง๋ง SQL Mapper๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ค์ SQL๋ฌธ์ ์ฐ๊ฒฐํจ์ผ๋ก์จ, ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ํธ๋ฆฌํ ํ ์คํธ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
-
-
SPRING MVC vs Webflux ๋น๊ต
-
Spring MVC
ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Queue๋ฅผ ํตํ๊ฒ ๋๋ค. ์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ๋น Thread ํ๊ฐ๊ฐ ํ ๋น๋๋ค. ( One Request Per Thread Model ) ์ฆ, Thread Pool์ด ์์ฉํ ์ ์๋ ์์ฒญ๊น์ง๋ง ๋์์ ์ผ๋ก ์์ ์ด ์ฒ๋ฆฌ๋๊ณ ๋ง์ฝ ๋๊ฒ ๋๋ค๋ฉด ํ์์ ๋๊ธฐํ๊ฒ ๋๋ค.
Thread ์์ฑ ๋น์ฉ์ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค. ์๋ฒ ์ฑ๋ฅ์ ๋ง๊ฒ Thread ์ต๋ ์์น๋ฅผ ์ ํ ์ํค๋๋ฐ, tomcat ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ 200์ด๋ค.
ํ๋์ ์์ ์ด ๋ฆ๊ฒ ์ฒ๋ฆฌ๋๋ ๋ถ๋ถ์ DB, Network ๋ฑ์ I/O๊ฐ ์ผ์ด๋๋ ๋ถ๋ถ์์ ๋ง์ ์๊ฐ์ด ์๋น๋๋ค. I/O์์ ์ CPU๊ฐ ๊ด์ฌํ์ง ์๋๋ค. I/O๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ์์ด Spring์์ ์ ๊ณตํด์ฃผ๋ WebFlux์ด๋ค.
-
Webflux
์์ฒญ๋ณ๋ก Thread๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๋ค์์ ์์ฒญ์ ์ ์ Thread๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ค. Worker Thread ๊ธฐ๋ณธ ์ฌ์ด์ฆ๋ ์๋ฒ์ Core ๊ฐ์๋ก ์ค์ ์ด ๋์ด์๋ค. ์ฆ core ์๊ฐ 4๊ฐ๋ผ๋ฉด 4๊ฐ์ Thread๋ก ๋์ฉ๋ ํธ๋ํฝ์ ๊ฐ๋นํ๋ค๋ ๊ฒ์ธ๊ฐ? ( Node.js์์ ๋ณธ ์ํคํ ์ฒ์ด๋ค... )
์ด๋ ๊ฒ Non Blocking ๋ฐฉ์์ ํ์ฉํ๋ฉด ํจ์จ์ ์ธ I/O ์ ์ด๊ฐ ๋์ด ์ฑ๋ฅ์ด ํฅ์๋ ์ ์๋ค. ๊ทธ๋์ MSA์์ ๋คํธ์ํฌ ํธ์ถ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ ์ฉํ๊ธฐ ์ข๋ค. ํ์ง๋ง!! I/O ์์ ์ค ํ๋๋ผ๋ Blocking ๋ฐฉ์์ด ์๋ค๋ฉด, ๊ฒฐ๊ตญ Blocking์ด ๋ฐ์๋๊ธฐ ๋๋ฌธ์ 4๊ฐ์ Thread ์ดํ ์์ฒญ์ ๊ฒฐ๊ตญ ๋๊ธฐ๋ฅผ ํด์ผํ๋ค.
์์ ๊ด๋ จ๋ ์๊ฐ DB connection ์ผ ๊ฒ์ด๋ค. ์๋ฌด ์๊ฐ์์ด blocking ๋๋ DB connection์ ๋ฃ์ด๋๊ณ ๋๋จธ์ง๋ non-blocking ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. MongoDB, Redis ๋ฑ์ NoSQL์ non-blocking db connection์ ์ง์ํ๋ค๊ณ ํ๋ค!
-
-
-
Infra/์ด์(๋ฐํจ์)
- Join์ ์ข
๋ฅ์ ๋ํด ์๋๋๋ก ๋ค ์ค๋ช
- inner join
- outer join
- left outer join
- right router join
- fetch join
- union
- ์ ๊ทํ, ์ญ์ ๊ทํ๋ ๋ฌด์์ธ์ง?
-
์ ๊ทํ
์ค๋ณต๋ ์ ๋ณด(๋ฐ์ดํฐ)์ ํฌํจ์ ์ต์ํํ๊ธฐ ์ํ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ ๊ฒ
์ ๊ทํ๋ ๊ฒ์๊ณผ ๊ฐฑ์ ๊ด๋ฆฌ๋ฅผ ํฌ๊ฒ ๋จ์ํํ๋ค.
-
์ญ์ ๊ทํ
์ง๋์น ์ ๊ทํ๋ก ํ ์ด๋ธ ์๊ฐ ์ฆ๊ฐํ๊ฒ๋๋ฉด (ํ ํ ์ด๋ธ๋น ๋ฐ์ดํฐ๊ฐ ํ๋๋ฐ์ ์กด์ฌํ์ง ์๋ ์ํฉ ๋ฐ์ ๊ฐ๋ฅ)
์์ ํ ๋๋ง๋ค JOIN ์ฐ์ฐ์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋ ์คํ๋ ค ์์ ์ ํจ์จ์ฑ์ด ๋ฎ์์ง ์ ์๋ค.
๋ฐ๋ผ์ ํ์์ ๋ฐ๋ผ ์ด๋ฏธ ๋ถํด๋ ๋ ๊ฐ ์ด์์ ๋ฆด๋ ์ด์ ๋ค์ ํฉ์ณ์ ํ๋์ ๋ฆด๋ ์ด์ ์ผ๋ก ๋ง๋๋ ์ญ์ ๊ทํ๋ฅผ ํตํด
๊ฒ์ ์ง์์ ์ํ์๋๋ฅผ ๋์ธ๋ค.
-
์ ๊ทํ์ ๋ชฉ์
- ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ, ๋ฐ์ดํฐ์ ์ค๋ณต์ ์ต์ํ ํ๊ธฐ ์ํด์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ ํ์ฅ ์ ์ฌ๋์์ธ์ ์ต์ํ
- ๋ค์ํ ๊ด์ ์์์ query๋ฅผ ์ง์ํ๊ธฐ ์ํด์
- ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์ํ์ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด์
- ๊ฐ์ข ์ด์ ํ์(Anomaly) ์ ๋ฐฉ์งํ๊ธฐ ์ํด์, ํ ์ด๋ธ์ ๊ตฌ์ฑ์ ๋ ผ๋ฆฌ์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ํ๋ค.
-
์ ๊ทํ ๊ณผ์
- 1์ฐจ ์ ๊ทํ : ๊ฐ ๋ก์ฐ๋ง๋ค ๊ฐ์ด 1๊ฐ์ฉ๋ง ์์ด์ผ ํ๋ค
- 2์ฐจ ์ ๊ทํ : ๋ถ๋ถ ํจ์ ์ข ์์ฑ ์ ๊ฑฐ
- 3์ฐจ ์ ๊ทํ : ์ดํ ํจ์ ์กฑ์์ฑ ์ ๊ฑฐ
-
์ด์ํ์
- ์ญ์ ์ด์: ํํ ์ญ์ ์ ๊ฐ์ด ์ ์ฅ๋ ๋ค๋ฅธ ์ ๋ณด๊น์ง ์ฐ์์ ์ผ๋ก ์ญ์ ๋๋ ํ์
- ์ฝ์ ์ด์: ํํ ์ฝ์ ์ ํน์ ์์ฑ์ ํด๋นํ๋ ๊ฐ์ด ์์ด NULL์ ์ ๋ ฅํด์ผ ํ๋ ํ์
- ์์ ์ด์: ํํ ์์ ์ ์ค๋ณต๋ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ง ์์ ๋์ด ์ผ์ด๋๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ํ์
-
- Join์ ์ข
๋ฅ์ ๋ํด ์๋๋๋ก ๋ค ์ค๋ช