week 1 jisoo - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
JVM์ CPU๋ ์ด์์ฒด์ ์ ์ข ๋ฅ์ ๋ฌด๊ดํ๊ฒ ์คํ ๊ฐ๋ฅํ๋ค.
JVM์ ์๋์ ๊ฐ์ด ์ฃผ์ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค.
-
Loads code
: ์์ฑ๋ ์ฝ๋๋ฅผ ๋ก๋ (์ฝ๊ธฐ) -
Verifies code
: ์ฝ๋ ๊ฒ์ฆ ๋ฐ ํ์ธ (๋ฌธ๋ฒ ๊ฒ์ฆ, ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธ) -
Executes code
: ์ฝ๋ ์คํ (์ค์ ๋จธ์ ์์ ์ฝ๋๋ฅผ ์คํํด ํ๋ก๊ทธ๋จ์ ๊ตฌ๋) -
Provides Runtime Environment
: ๋ฐํ์ ํ๊ฒฝ ์ ๊ณต (์ด๋ ํ ์ฅ๋น์์๊ฑด ๊ตฌ๋์ด ๋๊ธฐ ์ํด ๊ธฐ๋ณธ ๋ฒ ์ด์ค ํ๊ฒฝ ๊ตฌ์ถ)
JRE : Java Runtime Environment. ์๋ฐ ์คํ ํ๊ฒฝ์ ์๋ฏธํ๋ค. JVM์ ๋์์ํค๋๋ฐ ํ์ํ ๊ฐ์ข ์๋ฐ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ด๊ณ ์๋ค.
JDK : Java Development Kit = ์๋ฐ ๊ฐ๋ฐ ํคํธ (JRE + ๊ฐ๋ฐํด) JRE์ javac ๋ฑ์ ์ปดํ์ผ๋ฌ, ๋๋ฒ๊ฑฐ ๋ฑ์ ํฌํจํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
JVM๊ณผ JRE, JDK์ ํฌํจ๊ด๊ณ๋ฅผ ๋ํ๋ธ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ดํด๊ฐ ์ฌ์ด ๊ทธ๋ฆผ์ด๋ค.
JVM
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ JRE
์ด๋ฉฐ, ์ผ๋ฐ์ ์ธ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋๊ฒ์ด JRE
์ด๋ค.
JDK
๋ JRE
๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ปดํ์ผ๋ฌ์ ๋๋ฒ๊ฑฐ๋ฑ์ด ํฌํจ๋ ๋ฒ์ ์ด๋ค. ๊ฐ๋ฐ์๋ผ๋ฉด JDK๋ฅผ ์ค์นํด์ผํ๋ค.
https://cryptosalamander.tistory.com/4
JVM(Java Virtual Machine)
: ์๋ฐ ๊ฐ์ ๋จธ์ ์ผ๋ก ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ฃผ์ฒด๋ค.
CPU๋ ์ด์์ฒด์ (ํ๋ซํผ)์ ์ข ๋ฅ์ ๋ฌด๊ดํ๊ฒ ์คํ์ด ๊ฐ๋ฅํ๋ค.
์ฆ, ์ด์์ฒด์ ์์์ ๋์ํ๋ ํ๋ก์ธ์ค๋ก ์๋ฐ ์ฝ๋๋ฅผ ์ปดํ์ผํด์ ์ป์ ๋ฐ์ดํธ ์ฝ๋
๋ฅผ ํด๋น ์ด์์ฒด์ ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด
๋ก ๋ฐ๊ฟ ์คํ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
JVM์ ๊ตฌ์ฑ์ ์ดํด๋ณด๋ฉด ํฌ๊ฒ 4๊ฐ์ง
(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area)
๋ก ๋๋๋ค.
์๋ฐ์์ ์์ค๋ฅผ ์์ฑํ๋ฉด Person.java
์ฒ๋ผ .java
ํ์ผ์ด ์์ฑ๋๋ค.
.java ์์ค๋ฅผ ์๋ฐ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ๋ฉด Person.class
๊ฐ์ .class
ํ์ผ**(๋ฐ์ดํธ์ฝ๋)**์ด ์์ฑ๋๋ค.
์ด๋ ๊ฒ ์์ฑ๋ ํด๋์คํ์ผ๋ค์ ์ฎ์ด์ JVM์ด ์ด์์ฒด์ ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ญ์ธ Runtime Data Area๋ก ๋ก๋ํ๋ ์ญํ (์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ์ค์ผ ๋ ์ด๋ฐ ์์ ์ด ์ํ๋๋ค.)
Class Loader์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํด๋์ค(๋ฐ์ดํธ ์ฝ๋)๋ค์ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํด ๋ช ๋ น์ด ๋จ์๋ก ์คํํ๋ ์ญํ ์ ํ๋ค.
๋ช
๋ น์ด๋ฅผ ํ๋ ํ๋ ์คํํ๋ ์ธํฐํ๋ฆฌํฐ(Interpreter)
๋ฐฉ์์ด ์๊ณ JIT(Just-In-Time) ์ปดํ์ผ๋ฌ
๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ด ์๋ค.
JIT ์ปดํ์ผ๋ฌ๋ ์ ์ ํ ์๊ฐ์ ์ ์ฒด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ณ๊ฒฝํด์ Execution Engine์ด ๋ค์ดํฐ๋ธ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ผ๋ก ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ์์ด๋ค.
Garbage Collector(GC)
๋ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์ฑ(์ ์ฌ)๋ ๊ฐ์ฒด๋ค ์ค์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ํ์ ํ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
GC๊ฐ ์ญํ ์ ํ๋ ์๊ฐ์ ์ ํํ ์ธ์ ์ธ์ง๋ฅผ ์ ์ ์๋ค. (์ฐธ์กฐ๊ฐ ์์ด์ง์๋ง์ ํด์ ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์)
๋ ๋ค๋ฅธ ํน์ง์ GC๊ฐ ์ํ๋๋ ๋์ GC๋ฅผ ์ํํ๋ ์ฐ๋ ๋๊ฐ ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ผ์์ ์ง๋๋ค.
ํนํ Full GC
๊ฐ ์ผ์ด๋์ ์ ์ด๊ฐ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ ์งํ๋ค๋ฉด ์ฅ์ ๋ก ์ด์ด์ง๋ ์น๋ช
์ ์ธ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ ๊ฒ์ด๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ ์์ญ์ด๋ค.
JVM์ด ์ด์์ฒด์ ์์์ ์คํ๋๋ฉด์ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. Class Loader์์ ์ค๋นํ ๋ฐ์ดํฐ๋ค์ ๋ณด๊ดํ๋ ์ ์ฅ์์ด๋ค.
์ด ์์ญ์ ํฌ๊ฒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack
๋ก ๋๋ ์ ์๋ค.
- ์๋ฐ ๋ฐํ์ ๋ฉ๋ชจ๋ฆฌ(Runtime Data area)๊ตฌ์กฐ
JVM์ด ์ฝ์ด๋ค์ธ ํด๋์ค์ ์ธํฐํ์ด์ค ๋ํ ๋ฐํ์ ์์ ํ, ๋ฉค๋ฒ ๋ณ์(ํ๋), ํด๋์ค ๋ณ์(Static ๋ณ์), ์์ฑ์
์ ๋ฉ์๋
๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด๋ค.
Runtime Constant Pool
- ๋ฉ์๋ ์์ญ์ ํฌํจ๋์ง๋ง ๋ ์์ ์ค์์ฑ์ด ์๋ค.
- ํด๋์ค ํ์ผ constant_pool ํ ์ด๋ธ์ ํด๋นํ๋ ์์ญ์ด๋ค.
- ํด๋์ค์ ์ธํฐํ์ด์ค ์์, ๋ฉ์๋์ ํ๋์ ๋ํ ๋ชจ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ ์ฅํ๋ค.
- JVM์ ๋ฐํ์ ์์ ํ์ ํตํด ํด๋น ๋ฉ์๋๋ ํ๋์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฐธ์กฐํ๋ค
๋ฉ์๋ ์์ญ/๋ฐํ์ ์์ ํ์ ์ฌ์ฉ๊ธฐ๊ฐ ๋ฐ ์ค๋ ๋ ๊ณต์ ๋ฒ์
- JVM ์์์ ์์ฑ
- ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์๊น์ง
- ๋ช ์์ ์ผ๋ก null ์ ์ธ ์
- ๊ตฌ์ฑ ๋ฐฉ์์ด๋ GC ๋ฐฉ๋ฒ์ JVM ๋ฒค๋๋ง๋ค ๋ค๋ฅผ ์ ์๋ค.
- ๋ชจ๋ ์ค๋ ๋์์ ๊ณต์ ํ๋ค.
- JVM์ด ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐํ์ ์
๋์ ์ผ๋ก ํ ๋น
ํ์ฌ ์ฌ์ฉํ๋ ์์ญ์ด๋ค. -
New
์ฐ์ฐ์๋ก ์์ฑ๋ ๊ฐ์ฒด ๋๋ ๊ฐ์ฒด(์ธ์คํด์ค)์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค. - ํ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ์คํ ์์ญ์ ๋ณ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์์ ์ฐธ์กฐํ๋ค.
- ์ฐธ์กฐํ๋ ๋ณ์๋ ํ๋๊ฐ ์๋ค๋ฉด ์๋ฏธ ์๋ ๊ฐ์ฒด๊ฐ ๋์ด GC์ ๋์์ด ๋๋ค.
- ํ ์์ญ์ ์ฌ์ฉ๊ธฐ๊ฐ ๋ฐ ์ค๋ ๋ ๊ณต์ ๋ฒ์ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ฑฐ๋ ๋ช ์์ ์ผ๋ก null ์ ์ธ ์ GC(Garbage Collection) ๋์ ๊ตฌ์ฑ ๋ฐฉ์์ด๋ GC ๋ฐฉ๋ฒ์ JVM ๋ฒค๋๋ง๋ค ๋ค๋ฅผ ์ ์๋ค. ๋ชจ๋ ์ค๋ ๋์์ ๊ณต์ ํ๋ค.
์ง์ญ ๋ณ์, ํ๋ผ๋ฏธํฐ, ๋ฆฌํด ๊ฐ, ์ฐ์ฐ์ ์ฌ์ฉ๋๋ ์์ ๊ฐ๋ฑ์ด ์์ฑ๋๋ ์์ญ์ด๋ค.
int a = 10; ์ด๋ผ๋ ์์ค๋ฅผ ์์ฑํ๋ค๋ฉด ์ ์๊ฐ์ด ํ ๋น๋ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ a๋ผ๊ณ ์ก์๋๊ณ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ์ด 10์ด ๋ค์ด๊ฐ๋ค. ์ฆ, ์คํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฆ์ด a๋ผ๊ณ ๋ถ์ฌ์ฃผ๊ณ ๊ฐ์ด 10์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง๋ ๋ค.
ํด๋์ค Person p = new Person();
์ด๋ผ๋ ์์ค๋ฅผ ์์ฑํ๋ค๋ฉด Person p๋ ์คํ ์์ญ์ ์์ฑ๋๊ณ new๋ก ์์ฑ๋ Person ํด๋์ค์ ์ธ์คํด์ค๋ ํ ์์ญ์ ์์ฑ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ์์ญ์ ์์ฑ๋ p์ ๊ฐ์ผ๋ก ํ ์์ญ์ ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ์ฆ, ์คํ ์์ญ์ ์์ฑ๋ p๊ฐ ํ ์์ญ์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ (์ฐธ์กฐํ๊ณ ) ์๋ ๊ฒ์ด๋ค.
๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์คํ์ด ์์ฑ๋๋ค.
- ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์กด์ฌํ๋ฉฐ, ์ค๋ ๋๊ฐ ์์๋ ๋ ํ ๋น๋๋ค.
- ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค
ํ๋ ์(Frame)
์์ถ๊ฐ(push)
ํ๊ณ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ํ๋ ์์์ ๊ฑฐ(pop)
ํ๋ ๋์์ ์ํํ๋ค. - ์ ์ ํ์ถ(FILO, First In Last Out) ๊ตฌ์กฐ๋ก push์ pop ๊ธฐ๋ฅ ์ฌ์ฉ
- ๋ฉ์๋ ํธ์ถ ์ ์์ฑ๋๋ ์ค๋ ๋ ์ํ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ Frame์ ์ ์ฅ
- ๋ฉ์๋ ์ ๋ณด, ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ์ฐ์ฐ ์ค ๋ฐ์ํ๋ ์์ ๋ฐ์ดํฐ ์ ์ฅ
- ๊ธฐ๋ณธ(์์)ํ์ ๋ณ์๋ ์คํ ์์ญ์ ์ง์ ๊ฐ์ ๊ฐ์ง๋ค.
- ์ฐธ์กฐํ์ ๋ณ์๋ ํ ์์ญ์ด๋ ๋ฉ์๋ ์์ญ์ ๊ฐ์ฒด ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
Thread(์ฐ๋ ๋)๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ ์์ญ์ผ๋ก Program Counter ์ฆ, ํ์ฌ ์ฐ๋ ๋๊ฐ ์คํ๋๋ ๋ถ๋ถ์ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅํ๊ณ ์๋ ์์ญ์ด๋ค. (*CPU์ ๋ ์ง์คํฐ์ ๋ค๋ฆ)
์ด๊ฒ์ ์ด์ฉํด์ ์ฐ๋ ๋๋ฅผ ๋์๊ฐ๋ฉด์ ์ํํ ์ ์๊ฒ ํ๋ค.
์๋ฐ ์ธ ์ธ์ด๋ก ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
๋ณดํต C/C++๋ฑ์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ์ด๋ค. (JNI)
์ฐ๋ ๋๊ฐ ์์ฑ๋์์ ๋ ๊ธฐ์ค์ผ๋ก
1,2๋ฒ์ธ ๋ฉ์๋ ์์ญ๊ณผ ํ ์์ญ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๊ณ ,
3,4,5๋ฒ์ธ ์คํ ์์ญ๊ณผ PC ๋ ์ง์คํฐ, Native method stack์ ๊ฐ๊ฐ์ ์ฐ๋ ๋๋ง๋ค ์์ฑ๋๊ณ ๊ณต์ ๋์ง ์๋๋ค.
Heap area & Garbage Collector
ํ ์์ญ์ ์ข ๋ ์ดํด๋ด์ผํ๋๋ฐ ๊ทธ ์ด์ ๋ GC์ ์ฃผ์ ๋์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
(Stack์์ญ๊ณผ Method์์ญ๋ GC์ ๋์์ด ๋๋ค)
-
Young Generation: ์ด ์์ญ์ ์๋ฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๋ง์ ์ ์ฅ๋๊ณ , ์๊ธด์ง ์ผ๋ง ์๋๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค. ์๊ฐ์ด ์ง๋ ์ฐ์ ์์๊ฐ ๋ฎ์์ง๋ฉด
Old
์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋Minor GC
๊ฐ ๋ฐ์ํ๋ค. -
Old(Tenured) Generation: Young Generation ์์ญ์์ ์ ์ฅ๋์๋ ๊ฐ์ฒด ์ค์ ์ค๋๋ ๊ฐ์ฒด๊ฐ ์ด๋๋์ด ์ ์ฅ๋๋ ์์ญ์ด๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋
Major GC(Full GC)
๊ฐ ๋ฐ์ํ๋ค.
ํ ์์ญ์ ์ฐ์ 5๊ฐ์ ์์ญ**(eden, survivor1, survivor2, old, permanent)**์ผ๋ก ๋๋๋ค.
-> JDK7๊น์ง๋ permanent์์ญ์ด heap์ ์กด์ฌํ์ต๋๋ค. JDK8๋ถํฐ๋ permanent ์์ญ์ ์ฌ๋ผ์ง๊ณ ์ผ๋ถ๊ฐ "meta space ์์ญ"์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. (์์ ๊ทธ๋ฆผ JDK7 ๊ธฐ์ค์ ๋๋ค.) meta space ์์ญ์ Native stack ์์ญ์ ํฌํจ๋์์ต๋๋ค.
(survivor์์ญ์ ์ซ์๋ ์๋ฏธ์๊ณ ๋ ๊ฐ๋ก ๋๋๋ค๋ ๊ฒ์ด ์ค์ํ๋ค)
ํ ์์ญ์ ๊ตณ์ด 5๊ฐ๋ก ๋๋ ์ด์ ๋ ํจ์จ์ ์ผ๋ก GC๊ฐ ์ผ์ด๋๊ฒ ํ๊ธฐ ์ํจ์ด๋ค. ์์ธํ ๊ฒ์ GC๊ฐ ์ผ์ด๋๋ ํ๋ก์ธ์ค๋ฅผ ๋ณด๋ฉด์ ์ค๋ช ํ๋ค.
GC๋ Minor GC์ Major GC๋ก ๋๋๋ค.
- Minor GC : New ์์ญ์์ ์ผ์ด๋๋ GC
-
์ต์ด์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด
Eden
์์ญ์ ์์ฑ๋๋ค. -
Eden
์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด ์ฒซ ๋ฒ์งธ GC๊ฐ ์ผ์ด๋๋ค. -
survivor1
์์ญ์ Eden์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ survivor1 ์์ญ์ ์ ์ธํ ๋ค๋ฅธ ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ค. -
Eden์์ญ๋ ๊ฐ๋์ฐจ๊ณ survivor1์์ญ๋ ๊ฐ๋์ฐจ๊ฒ๋๋ค๋ฉด, Eden์์ญ์ ์์ฑ๋ ๊ฐ์ฒด์ survivor1์์ญ์ ์์ฑ๋ ๊ฐ์ฒด ์ค์ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๊ฐ ์๋์ง ๊ฒ์ฌํ๋ค.
-
์ฐธ์กฐ ๋๊ณ ์์ง ์์ ๊ฐ์ฒด๋ ๋ด๋ฒ๋ ค๋๊ณ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ง survivor2์์ญ์ ๋ณต์ฌํ๋ค.
-
survivor2์์ญ์ ์ ์ธํ ๋ค๋ฅธ ์์ญ์ ๊ฐ์ฒด๋ค์ ์ ๊ฑฐํ๋ค.
-
์์ ๊ณผ์ ์ค์ ์ผ์ ํ์ ์ด์ ์ฐธ์กฐ๋๊ณ ์๋ ๊ฐ์ฒด๋ค์ survivor2์์ Old์์ญ์ผ๋ก ์ด๋์ํจ๋ค.
- ์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณต, survivor2์์ญ๊น์ง ๊ฝ์ฐจ๊ธฐ ์ ์ ๊ณ์ํด์ Old๋ก ๋น์
- Major GC(Full GC) : Old ์์ญ์์ ์ผ์ด๋๋ GC
-
Old
์์ญ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฒ์ฌํ๋ฉฐ ์ฐธ์กฐ๋๊ณ ์๋์ง ํ์ธํ๋ค. -
์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ชจ์ ํ ๋ฒ์ ์ ๊ฑฐํ๋ค.
- Minor GC๋ณด๋ค ์๊ฐ์ด ํจ์ฌ ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์คํ์ค์ GC๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ค์งํ๋ค.
- Major GC(Full GC)๊ฐ ์ผ์ด๋๋ฉด,
Old์์ญ์ ์๋ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ค์ ํ์ํ๊ณ ๊ทธ ํด๋น ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ ๊ฑฐํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด์ **Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ค๊ฐ์ค๊ฐ ๊ตฌ๋ฉ(**์ ๊ฑฐ๋๊ณ ๋น ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ)์ด ์๊ธฐ๋๋ฐ ์ด ๋ถ๋ถ์ ์์ ๊ธฐ ์ํด ์ฌ๊ตฌ์ฑ์ ํ๊ฒ ๋๋ค. (๋์คํฌ ์กฐ๊ฐ๋ชจ์์ฒ๋ผ ์กฐ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํจ)
๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฎ๊ธฐ๊ณ ์๋๋ฐ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ฒ๋ฆฌ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ ์งํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์คํ๋ง, ์ ํํ๊ฒ๋ ์คํ๋ง ํ๋ ์์ํฌ์ด๋ค. ๋จผ์ ์คํ๋ง์ ๋ํด ์ดํดํ๊ธฐ ์ํด์๋ ํ๋ ์์ํฌ๊ฐ ๋ฌด์์ธ์ง, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฐจ์ด๊ฐ ์ด๋ค๊ฑด์ง ์๊ณ ๊ฐ๋๊ฒ ๊ฐ์ฅ ์ค์ํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋จํ๊ฒ ํน์ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋ ๋ญ์น์ด๋ค. ๊ฐ๋ฐ์๋ ์๊ธฐ ์ฝ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจ์ํค๊ณ ์ํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๊ฐ๋ฐ์ ํ ์ ์๋ค. ๋์ฑ ๊ฐ๋จํ๊ฒ๋ ์ํ๋ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ฅผ ์ฝํด์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ค.
ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฐ๋ ์ด๊ณ , ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค. ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์คํํ๋์ง๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ํ๋ ์์ํฌ์ ๋ฌ๋ ค์๋ค.
์คํ๋ง ์ฌ์ดํธ์์๋ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ธํ๋ผ์ ๊ด๋ จ๋ ๋ด์ฉ์ ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ์ค์ ํ๋๋ก ํด์ค์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ก ๋๋ถ๋ถ์ ์ปจํธ๋กค ํ ์ ์๊ฒ๋ ์ง์ํ๋ค๊ณ ์ค๋ช
ํ๋ค. ์ฆ, ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์
๋์์ ๋ํ ๋ด์ฉ์ ๊ธฐ์ ํ๋ฉด ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ด๋ฅผ ํด์ํด์ ๋์ํ๋ ๊ฒ์ด๋ค. ์คํ๋ง์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋ก๋ Servlet API
๊ฐ ์๋ค. ๊ฐ๋ฐ์๋ API๋ฅผ ์ฒ๋ฆฌํ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ด๊ฒ์ด Servlet API ๋ฅผ ์ํ ํด๋์ค์์ ํ์(์ด๋
ธํ
์ด์
ํ์ฉ)ํ๋ค. ๊ทธ ์ดํ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์คํ๋ง์ API ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ํด๋์ค๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌํ๋ค. ๊ฐ๋ฐ์๊ฐ Servlet์ ๊ด๋ จ๋ ๊ฒ์ ๊ฐ๋ฐํ์ง ์์๋ ๋๋ฉฐ, ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ๊ฐ์ฒด ์์ฑ
๋ฑ ์ ๋งํ ๊ฒ๋ค์ ์คํ๋ง์ด ์์์ ํด์ค๋ค. ์ด๋ฐ ํธํ ์ ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
๋ชจ๋ Spring ๋ชจ๋๋ค์ ํต์ฌ์ ์์กด์ฑ ์ฃผ์
๊ณผ IoC(Inversion of Control)
์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์์กด์ฑ ์ฃผ์
๊ณผ IoC๋ฅผ ํตํด ์์ค๋ณ๊ฒฝ์ ์ต์ํ ํ๋ฉฐ ํ๋ก๊ทธ๋จ์ ์ ์ดํ ์ ์์ต๋๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ๊ธฐ๋ฅ์ด ๋ง์๋งํผ ํ๊ฒฝ์ค์ ์ด ๋ณต์กํ ํธ์ด๋ค. ์ด์ ์ด๋ ค์์ ๋๋ผ๋ ์ฌ์ฉ์๋ค์ ์ํด ๋์จ ๊ฒ์ด ๋ฐ๋ก ์คํ๋ง ๋ถํธ๋ค.
์คํ๋ง ๋ถํธ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ค์ ์ ๋ง์ ๋ถ๋ถ์ ์๋ํํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ง ํธํ๊ฒ ์คํ๋ง์ ํ์ฉํ ์ ์๋๋ก ๋๋๋ค.
์คํ๋ง ๋ถํธ starter
๋ํ๋์๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋ฐ๋ก API๋ฅผ ์ ์ํ๊ณ , ๋ด์ฅ๋ ํ์บฃ์ด๋ ์ ํฐ
(= ๋ด์ฅ ์๋ธ๋ฆฟ ์ปจํ
์ด๋
)๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ฅผ ์คํํ ์ ์๋ค. ์ฌ์ง์ด ์คํ๋ง ํํ์ด์ง์ ์ด๋์
๋ผ์ด์
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ค๋ค. ์คํํ๊ฒฝ์ด๋ ์์กด์ฑ ๊ด๋ฆฌ
๋ฑ์ ์ธํ๋ผ ๊ด๋ จ ๋ฑ์ ์ ๊ฒฝ์ธ ํ์ ์์ด ๋ฐ๋ก ์ฝ๋ฉ์ ์์ํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ๊ทธ๊ฒ์ด ์คํ๋ง์ ํค ํฌ์ธํธ์ด๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ (spring-boot-starter~์ ์ญํ - ๊ด๋ จ jarํ์ผ๋ค์ ์๋์ผ๋ก ๋ค์ด๋ก๋)
- ์๋ ์ค์ (@SpringBootApplication, ์ปดํฌ๋ํธ ์ค์บ์ญํ )
- ๋ด์ฅ ์น์๋ฒ(tomcat, netty, jetty, undertow)
์ข๋ ์์ธํ ์ค๋ช ํด๋ณด๋ฉด, ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋ค์๊ณผ ๋น์ทํ ์๊ตฌ์ฌํญ๋ค์ ๊ฐ์ฃ . Spring MVC, Jackson Databind (๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ฉ), Hibernate-Validator (Java Validation API ๋ฅผ ์ด์ฉํ ์๋ฒ์ฌ์ด๋ ์ ํจ์ฑ ํ์ธ ์ฉ), Log4j (๋ก๊น ์ฉ). ์ฐ๋ฆฌ๊ฐ ์ด ์ฝ์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด ๋ชจ๋ ํ๋ ์์ํฌ๋ค์ด ํธํ๋๋ ๋ฒ์ ์ ์ ํํด์ผ ํ์ต๋๋ค.
ํ์ง๋ง Spring Boot๋ ์คํํฐ๋ค์ ์ ๊ณตํฉ๋๋ค. ์๋๋ Spring Boot์์ ์ธ๊ธํ ์คํํฐ์ ๋๋ค.
์คํํฐ๋ค์ ํธ๋ฆฌํ ์ข ์์ฑ ๊ธฐ์ ์๋ค(dependency descriptors)๋ก์ ์ฌ๋ฌ๋ถ์ ์ด ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํจ์ํฌ ์ ์๋ค. ์ฌ๋ฌ๋ถ์ ๋ชจ๋ ์คํ๋ง๊ณผ ์ฌ๋ฌ๋ถ์ด ํ์๋กํ๋ ๊ด๋ จ ๊ธฐ์ ์ ์ป์ ์ ์๋ ์ฌ์ธ์ ์ผํ๋ชฐ์ ์ป๋ ๊ฒ์ผ๋ก ๊ตณ์ด ์ํ์ฝ๋๋ฅผ ์ฐพ์๋ณด๊ฑฐ๋ ๋ก๋ํ ์ข ์์ฑ ๊ธฐ์ ์๋ค์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ํ์ง ์์๋ ๋๋ค. ์๋ฅผ๋ค์ด ์ฌ๋ฌ๋ถ์ด ์คํ๋ง๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์์ํ JPA ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ spring-boot-starter-data-jpa ์ข ์์ฑ์ ํฌํจ์ํค๊ณ ์งํํ๋ฉด ๋๋ค.
์ฆ JPA๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ํ์ํ๋ ์ฐ๊ด๋ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ๊บผ๋ฒ์ ํจํค์ง๋ก ๋ค์ด๋ก๋ํด์ฃผ๊ณ , datasource
์ ๊ฐ์ ๋ณต์กํ ์ค์ ๋ค์ ๋ฐ๋ก configuration
ํด๋์ค์์ ๊ด๋ จ๋ ๋น์ ์ถ๊ฐํ์ฌ ํ๋ํ๋ ์ค์ ํ ํ์๊ฐ ์๊ณ , application.properties
ํ์ผ์ด๋ application.yml
ํ์ผ์ ๊ฐ๋จํ ์ค์ ์ฝ๋๋ก ์ค์ ์ ๋๋ผ ์ ์๋ค.
๋ํ dispatcherServlet ์ค์ , componentscan ์ค์ ๋ฑ์ ๋ฒ๊ฑฐ๋ก์ด ์์ ๋ spring-boot-starter-web์ dependency ์ถ๊ฐ๋ง์ผ๋ก ์์์ ํด์ค๋ค.
@SpringBootApplication
์ด๋
ธํ
์ด์
์ด ๋ถ์ ํจํค์ง ๋ด ๋ชจ๋ Component ๋ฅผ ์ค์บํ๋ฉฐ,
starter~ dependency๋ฅผ ์ถ๊ฐํ ๋ (starter) ๋ฒ์ ๋ช ์๋ฅผ ์ํด๋, ํด๋น ๊ธฐ๋ฅ์ ํ์ํ ๋ค๋ฅธ ์ฐ๊ด๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ์ ํ ๋ฒ์ ์ ์์์ ๋ค์ด๋ก๋ํด์ค๋ค. (DEPENDENCY MANAGEMENT) - ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํด์ผํ ์์กด์ฑ์ด ์ค์ด๋ ๋ค.
ํธ๋์ญ์
์ ๊ฒฝ๊ณ์ค์ ์ ๋ด๋นํ๋ ์ฝ๋๋ ์ผ์ ํ ํจํด์ ๊ฐ๋ ์ ์ฌํ ๊ตฌ์กฐ๋ค. ์ด๋ ๊ฒ ์ฌ๋ฌ ๊ธฐ์ ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ณตํต์ ์ด ์๋ค๋ฉด ์ถ์ํ
๋ฅผ ์๊ฐํด๋ณผ ์ ์๋ค. ์ถ์ํ
๋ ํ์ ์์คํ
์ ๊ณตํต์ ์ ๋ฝ์๋ด์ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ ๋งํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ ์์คํ
์ด ์ด๋ค ๊ฒ์ธ์ง ์์ง ๋ชปํด๋, ๋๋ ํ์ ์์คํ
์ด ๋ฐ๋๋๋ผ๋ ์ผ๊ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ ์๊ฐ ์๋ค.
ํธ๋์ญ์ ์ฒ๋ฆฌ ์ฝ๋์๋ ์ถ์ํ๋ฅผ ๋์ ํด๋ณผ ์ ์์ง ์์๊น? ๋ชจ๋ ๊ธฐ์ ์ด ํธ๋์ญ์ ๊ฐ๋ ์ ๊ฐ๊ณ ์์ผ๋ ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ๋ฐฉ๋ฒ์์ ๊ณตํต์ ์ด ์์ ๊ฒ์ด๋ค. ์ด ๊ณตํต์ ์ธ ํน์ง๋ค์ ๋ชจ์์ ์ถ์ํ๋ ํธ๋์ญ์ ๊ด๋ฆฌ ๊ณ์ธต์ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์๋ ํธ๋์ญ์ ์ถ์ ๊ณ์ธต์ด ์ ๊ณตํ๋ API๋ฅผ ์ด์ฉํด ํธ๋์ญ์ ์ ์ด์ฉํ๊ฒ ๋ง๋ค์ด์ค๋ค๋ฉด ํน์ ๊ธฐ์ ์ ์ข ์๋์ง ์๋ ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค.
์คํ๋ง์ ํธ๋์ญ์ ๊ธฐ์ ์ ๊ณตํต์ ์ ๋ด์ ํธ๋์ญ์ ์ถ์ํ ๊ธฐ์ ์ ์ ๊ณตํ๊ณ ์๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง์ ๊ฐ ๊ธฐ์ ์ ํธ๋์ญ์ API๋ฅผ ์ด์ฉํ์ง ์๊ณ ๋, ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ํธ๋์ญ์ ์ ์ ์ดํ๋ ํธ๋์ญ์ ๊ฒฝ๊ณ์ค์ ์์ ์ด ๊ฐ๋ฅํด์ง๋ค.
class UserService {
private PlatformTransactionManager transactionManager;
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
// DI๋ก ์ธ๋ถ์์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋๋ค.
// JdbcTemplate์ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด DataSourceTransactionManager
// JTA๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด JTATransactionManager
// JPA๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด JPATransactionManager
}
public void upgradeLevels() {
TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
List<User> users = userDao.getAll();
for (User user : users) {
if (canUpgradeLevel(user)) {
upgradeLevel(user);
}
}
this.transactionManager.commit(status);
} catch (RuntimeException e) {
this.transactionManager.rollback(status);
throw e;
}
}
}
์ถ์ฒ: https://www.wbluke.com/16 [ํจ๊ป ์๋ผ๊ธฐ]
์คํ๋ง์ด ์ ๊ณตํ๋ ํธ๋์ญ์
๊ฒฝ๊ณ์ค์ ์ ์ํ ์ถ์ ์ธํฐํ์ด์ค๋ PlatformTransactionManager
์ด๋ค. ์คํ๋ง์ ํธ๋์ญ์
์ถ์ํ ๊ธฐ์ ์ ์์์ ์ ์ฉํด๋ดค๋ ํธ๋์ญ์
๋๊ธฐํ
๋ฅผ ์ฌ์ฉํ๋ค. ์ด์ UserService๋ ํธ๋์ญ์
๊ธฐ์ ์์ ์์ ํ ๋
๋ฆฝ์ ์ธ ์ฝ๋๊ฐ ๋๋ค.
์ด๋ ๊ฒ ๊ธฐ์ ๊ณผ ์๋น์ค์ ๋ํ ์ถ์ํ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ฉด ํน์ ๊ธฐ์ ํ๊ฒฝ์ ์ข
์๋์ง ์๋ ํฌํฐ๋ธํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค. UserDao์ UserService๋ ๊ฐ๊ฐ ๋ด๋นํ๋ ์ฝ๋์ ๊ธฐ๋ฅ์ ์ธ ๊ด์ฌ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋๊ณ , ์๋ก ๋ถํ์ํ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ๋
์์ ์ผ๋ก ํ์ฅ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ ๊ฒ์ด๋ค. ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ๋ด์ ์ฝ๋์ง๋ง ๋ด์ฉ์ ๋ฐ๋ผ ๋ถ๋ฆฌํ๋ค. ๊ฐ์ ๊ณ์ธต์์ ์ํ์ ์ธ ๋ถ๋ฆฌ
๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํธ๋์ญ์
์ ์ถ์ํ๋ ์ด์๋ ์ข ๋ค๋ฅด๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๊ทธ ํ์์์ ๋์ํ๋ ๋ก์ฐ๋ ๋ฒจ์ ํธ๋์ญ์
๊ธฐ์ ์ด๋ผ๋ ์์ ๋ค๋ฅธ ๊ณ์ธต์ ํน์ฑ์ ๊ฐ๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ
ํ ๊ฒ์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ์ข
๋ฅ์ ๋ฐ๋ฅธ ์ํ์ ์ธ ๊ตฌ๋ถ์ด๋ , ๋ก์ง๊ณผ ๊ธฐ์ ์ด๋ผ๋ ์์ง์ ์ธ ๊ตฌ๋ถ์ด๋ ๋ชจ๋ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ผ๋ฉฐ, ์๋ก ์ํฅ์ ์ฃผ์ง ์๊ณ ์์ ๋กญ๊ฒ ํ์ฅ๋ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐ๋ ์คํ๋ง์ DI
๊ฐ ์ค์ํ ์ญํ ์ ํ๊ณ ์๋ค.
DI์ ๊ฐ์น๋ ์ด๋ ๊ฒ ๊ด์ฌ, ์ฑ ์, ์ฑ๊ฒฉ์ด ๋ค๋ฅธ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ๋ ๋ฐ ์๋ค.
โป ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle)
๋จ์ผ ์ฑ ์ ์์น์ ํ๋์ ๋ชจ๋์ ํ ๊ฐ์ง ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค๋ ์๋ฏธ๋ค. ํ๋์ ๋ชจ๋์ด ๋ฐ๋๋ ์ด์ ๋ ํ ๊ฐ์ง์ฌ์ผ ํ๋ค๊ณ ์ค๋ช ํ ์๋ ์๋ค.
๋จ์ผ ์ฑ ์ ์์น์ ์งํค๋ ์ฝ๋๊ฐ ๋๋ฉด ์ด๋ค ์ฅ์ ์ด ์์๊น? ๋จ์ผ ์ฑ ์ ์์น์ ์ ์งํค๊ณ ์๋ค๋ฉด, ์ด๋ค ๋ณ๊ฒฝ์ด ํ์ํ ๋ ์์ ๋์์ด ๋ช ํํด์ง๋ค. ์ด ์์น์ด ์ ์ง์ผ์ง์ง ์์ ์ํ๋ผ๋ฉด, ํ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ์ ๋ฐฑ๊ฐ์ ํด๋์ค๋ค๊ณผ ํ ์คํธ๋ค์ ์์ ํด์ฃผ์ด์ผ ํ ์ง๋ ๋ชจ๋ฅธ๋ค. ๊ทธ๋์ ์ ์ ํ๊ฒ ์ฑ ์๊ณผ ๊ด์ฌ์ด ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๊ณ , ์๋ก ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋ค์ํ ์ถ์ํ ๊ธฐ๋ฒ์ ๋์ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง๊ณผ ๊ธฐ์ /ํ๊ฒฝ์ ๋ถ๋ฆฌํ๋ ๋ฑ์ ์์ ์ ๊ฐ์๋ก ๋ณต์กํด์ง๋ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ฐ๋์ ํ์ํ๋ค. ์ด๋ฅผ ์ํ ํต์ฌ์ ์ธ ๋๊ตฌ๊ฐ ๋ฐ๋ก ์คํ๋ง์ด ์ ๊ณตํ๋ DI๋ค.
๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํ๋ก๊ทธ๋๋ฐ์ ์์น์ ์๋ก ๊ธด๋ฐํ๊ฒ ๊ด๋ จ์ด ์๋ค. ๋จ์ผ ์ฑ
์ ์์น์ ์ ์งํค๋ ์ฝ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ๊ณ ์ด๋ฅผ DI๋ก ์ฐ๊ฒฐ
ํด์ผ ํ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ๋จ์ผ ์ฑ
์ ์์น๋ฟ ์๋๋ผ ๊ฐ๋ฐฉ ํ์ ์์น๋ ์ ์งํค๊ณ
, ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ ์๋ก์ ๋ณ๊ฒฝ์ด ์ํฅ์ ์ฃผ์ง ์๊ณ
, ๊ฐ์ ์ด์ ๋ก ๋ณ๊ฒฝ์ด ๋จ์ผ ์ฑ
์์ ์ง์ค๋๋ ์์ง๋ ๋์ ์ฝ๋
๊ฐ ๋์ค๋๊น ๋ง์ด๋ค. ์ฌ์ง์ด ์ด๋ฐ ๊ณผ์ ์์ ์ ๋ต ํจํด, ์ด๋ํฐ ํจํด, ๋ธ๋ฆฌ์ง ํจํด, ๋ฏธ๋์์ดํฐ ํจํด ๋ฑ ๋ง์ ๋์์ธ ํจํด์ด ์์ฐ์ค๋ฝ๊ฒ ์ ์ฉ๋๊ธฐ๋ ํ๋ค. ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น์ ์ ์ง์ผ์ ๋ง๋ ์ฝ๋๋ ํ
์คํธํ๊ธฐ๋ ํธํ๋ค. ์คํ๋ง์ด ์ง์ํ๋ DI์ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ ๋๋ถ์ ๋์ฑ ํธ๋ฆฌํ๊ฒ ์๋ํ๋ ํ
์คํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
์๋น์ค ์ถ์ํ๋ Spring framework๋ ๋ฌผ๋ก ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ์ค์ํ ๊ฐ๋ ์ด๋ค. ๊ฐ๋จํ ์ด์ผ๊ธฐํ๋ฉด ๊ฐ๋ฐํ๊ฒฝ, ํน์ ์ด๋ ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ํ ๋ก์ฐ๋ ๋ฒจ์ ๊ธฐ์ ์ ๊ตฌ์ ๋ฐ์ง ์๊ฒ ํ๊ธฐ์ํด์, ๊ทธ๋ฆฌ๊ณ ์ฑ ์์ ๋ถ๋ฆฌ ์ํค๊ธฐ ์ํ ์ถ์ํ ๊ฐ๋ ์ด๋ค.
์๋ฅผ ๋ค์ด์ PlatformTransactionManager
๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋น์ค ์ถ์ํ์ ๋ํ์ ์ธ ์์ด๋ค. ํธ๋์ญ์
์ ๊ด๋ฆฌํ๋ค๋ ๊ฒ์ ํฌ๊ฒ ๋ณด๋ฉด ๋๋น์ ํธ๋์ญ์
์ ๊ด๋ฆฌํ๋ค๋ ๋ง์ด๋ค. ๊ทธ๋ ๋ค๋ฉด? ๊ณผ์ฐ ๋๋น๋ผ๋ ๊ฒ์ ์ข
๋ฅ๊ฐ ํ๋์ธ ๊ฒ์ธ๊ฐ? ์๋๋ค. JDBC,ํ์ด๋ฒ๋ค์ดํธ ๋ฑ๋ฑ ์์ฃผ ๋ง์ ๋๋น์ ์ข
๋ฅ๊ฐ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์์ ๋๋น์ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ๊ฐ๋ค๋ฅธ ํธ๋์ญ์ ์ฝ๋๊ฐ ํ์ํ๋ค๋ฉด? ๋ง์ฝ ๋๋น๊ฐ ๋ฐ๋๊ฒ ๋๋ค๋ฉด ๊ทธ์ ๋ฐ๋ผ ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋ ๋ํ ๋ฐ๋์ด์ผ ํ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฐ๋
์ด ์๋น์ค ์ถ์ํ ๊ฐ๋
์ด๋ค. ํธ๋์ญ์
์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ต์์ ์ธํฐํ์ด์ค์ธ PlatformTransactionManager
๋ฅผ ์ ์ธํ๊ณ ๊ฐ ๋๋น์ ๋ํ transactionManager ํด๋์ค๋ฅผ DIํด์ฃผ๋ฉด? ํธ๋์ญ์
๊ด๋ จ ์ฝ๋๋ ํต์ผ๋๋ ๋์์ ๋๋น๊ฐ ๋ฐ๋๋ค๋ฉด DI์ค์ ๋ง ๊ต์ฒดํด์ฃผ๋ฉด ๋๋ค. ๋๋น๊ฐ ๋ฐ๋๊ฒ ๋๋๋ผ๋ ํธ๋์ญ์
๊ด๋ จ์ฝ๋์ ๋ณ๊ฒฝ์ ํ๋๋ ์๋๊ฒ์ด๋ค. ์ด๊ฒ์ด ์๋น์ค ์ถ์ํ์ ์ฅ์ ์ธ ๊ฒ์ด๋ค.
- ์์ฐจ์ ์ธ ์ฒ๋ฆฌ๊ฐ ์ค์
- ํ๋ก๊ทธ๋จ ์ ์ฒด๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
- c์ธ์ด
- ์ปดํจํฐ์ ์์ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ฌ (๊ฐ์ฒด ์งํฅ ์ธ์ด๋ณด๋ค ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌ๋จ)
- ํ๋ก์์ ธ๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ฒ
- ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ผ๋ก ํจ์ ๊ตฌํ
- ์ํํธ์จ์ด, ์ปดํ์ผ๋ฌ์ ๋ฐ๋ฌ๋ก ํ๋์จ์ด๊ฐ ์ํํธ์จ์ด์ ๋ฐ๋ฌ์ ๋ฐ๋ผ์ค์ง ๋ชปํ๋ ๋ฐฐ๊ฒฝ์์ ๋ฑ์ฅ
- ๊ฐ๋ฐํ๋ ค๋ ๊ธฐ๋ฅ๋ค์ ๋ฌถ์ด ๋ชจ๋ํ โ ํ๋์จ์ด๊ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ์ค๋ณต ์ฐ์ฐํ์ง ์๋๋ก ํจ
- ๋ชจ๋์ ์ฌํ์ฉ์ฑ โ ํ๋์จ์ด์ ์ฒ๋ฆฌ๋์ ํ๊ธฐ์ ์ผ๋ก ์ค์
- ์ค์ ์ธ๊ณ๋ฅผ ๋ชจ๋ธ๋ง
- ๋ฐ์ดํฐ์ ์ ์ฐจ๋ฅผ ํ๋๋ก ๋ฌถ์ด์ ์๊ฐ
- ๊ฐ์ฒด๋ ์์ ๋ง์ ๋ฐ์ดํฐ์ ํ๋ก์์ ๋ฅผ ๊ฐ๋๋ค.
- ๊ฐ์ฒด๋ ์์ ๋ง์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ๊ฐ ๊ฐ์ฒด๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
- ๊ธฐ๋ฅ์ ์ค์ฌ์ผ๋ก ๊ฐ์ฒด ๋ด์ ๋ฉ์๋๋ฅผ ๊ตฌํ
- ๊ฐ์ฒด๊ฐ ๊ฐ๋ ์ฑ ์์ ์์ ์๋ก ์ข๋ค.
- ๊ฐ์ฒด๋ ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ ์ โ ํ ๊ฐ์ฒด๊ฐ ๊ฐ๋ ์ฑ ์์ ์ ์ํ๊ฒ์ด ์ธํฐํ์ด์ค
- ์บก์ํ : ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ(ํนํ ๋ฐ์ดํฐ)์ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์์
- ์์ : ์ด๋ฏธ ์์ฑ๋ ํด๋์ค๋ฅผ ์ด์ด๋ฐ์ ์๋ก์ด ํด๋์ค ์์ฑ (๋ถ๋ชจ ํด๋์ค ๊ธฐ๋ฅ ์ฌํ์ฉ)
- ๋คํ์ฑ : ํ๋์ ์ด๋ฆ์ผ๋ก ๋ง์ ์ํฉ์ ๋์ฒํ๋ ๊ธฐ๋ฒ
- ์ฝ๋์ ์ฌํ์ฉ์ฑ์ด ๋๋ค
- ์ฝ๋ฉ์ด ์ ์ฐจ๋นํฅ์ ๋นํด ๊ฐ๋จ
- ๋๋ฒ๊น ์ด ์ฝ๋ค
- ์ค๊ณ์ ๋ง์ ์๊ฐ์ด ๋ค์ด๊ฐ๋ค
https://brownbears.tistory.com/407
https://pjh3749.tistory.com/244
SOLID ์์น์ด๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ์์ ์ง์ผ์ค์ผ ํ 5๊ฐ์ ์์น( SRP, OCP, LSP, DIP, ISP )์ ๋งํฉ๋๋ค.
์ด๋ฌํ ์ค๊ณ์์น์ ์์์ผ ํ๋ ์ด์ ๋ ์์คํ ์ ์์ํ์ง ๋ชปํ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋๋ผ๋, ์ ์ฐํ๊ฒ ๋์ฒํ๊ณ ์ดํ์ ํ์ฅ์ฑ์ด ์๋ ์์คํ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ธฐ ์ํด์์ ๋๋ค.
์ข์ ์ค๊ณ๋ ์์คํ ์ ์๋ก์ด ์๊ตฌ์ฌํญ์ด๋ ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋, ์ํฅ์ ๋ฐ๋ ๋ฒ์๊ฐ ์ ์ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
๊ฐ์ฒด๋ ๋จ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค๋ ์์น์ ๋งํฉ๋๋ค.
๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณํ ๋๋ ์์ง๋๋ฅผ ๋๊ฒ, ๊ฒฐํฉ๋๋ ๋ฎ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์์ง๋
- ํ ํ๋ก๊ทธ๋จ์ ์์๊ฐ ์ผ๋ง๋ ๋ญ์ณ์๋์ง, ์ฆ ๊ตฌ์ฑ ์์๋ค ์ฌ์ด์ ์์ง๋ ฅ์ ๋งํฉ๋๋ค.
- ๊ฒฐํฉ๋
- ํ๋ก๊ทธ๋จ ๊ตฌ์ฑ ์์๋ค ์ฌ์ด๊ฐ ์ผ๋ง๋ ์์กด์ ์ธ์ง๋ฅผ ๋งํฉ๋๋ค.
SRP์ ๋ฐ๋ฅธ ์ค๊ณ๋ฅผ ํ๋ฉด ์์ง๋๋ ๋๊ฒ, ๊ฒฐํฉ๋๋ ๋ฎ๊ฒ ์ค๊ณํ ์ ์๊ฒ ๋ฉ๋๋ค.
ํํ ํจ์๋ ํ๋์ ๊ธฐ๋ฅ๋ง ์ํํ๋๋ก ๊ตฌํ๋์ด์ผ ํ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
calculator()
ํจ์๊ฐ ๋ง์
, ๋บผ์
, ๊ณฑ์
, ๋๋์
์ ๋ชจ๋ ํ๋ค๋ฉด ์ด๋ ์ข์ ์ค๊ณ๊ฐ ์๋๋๋ค.
๋ง์ , ๋บผ์ , ๊ณฑ์ , ๋๋์ ์ด ๊ฐ๊ฐ์ ํจ์๋ก ์ ์๋์ด ์์ด์ผ ์ ์ง๋ณด์๊ฐ ์ฌ์ธ ๊ฒ์ ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก Calculator
๊ฐ์ฒด๊ฐ ์์ ๋, Calculator ๊ฐ์ฒด๋ ๋ง์
, ๋บ์
, ๊ณฑ์
, ๋๋์
๋ง ํ ์ ์์ด์ผ ํฉ๋๋ค.
์ฆ, ์ฌ์น์ฐ์ฐ์ ๋ํ ์ฑ ์๋ง ๊ฐ๊ณ ์์ด์ผ ํฉ๋๋ค.
์ดํ์ ๊ณ์ฐ๊ธฐ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๊ณ ํด์, alarm()
ํจ์๋ฅผ Calculator์ ๊ธฐ๋ฅ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ SRP์ ์๋ฐฐ๋ฉ๋๋ค.
ํ ๊ฐ์ฒด์ ์ฑ ์์ด ๋ง์์ง์๋ก ํด๋์ค ๋ด๋ถ์์ ์๋ก ๋ค๋ฅธ ์ญํ ์ ์ํํ๋ ์ฝ๋๋ผ๋ฆฌ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
์ฆ, ๊ฐ์ฒด๋ง๋ค ์ฑ ์์ ์ ๋๋ก ๋๋์ง ์๋๋ค๋ฉด ์์คํ ์ ๋งค์ฐ ๋ณต์กํด์ง๋๋ค.
์๋ํ๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ ํ๋ ์ผ( ํจ์ )์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธฐ๋ฉด ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ค์ ํ ์คํธ๋ฅผ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ํ๋์ ์ฑ ์๋ง ๊ฐ๋๋ก ์ ๋ถ๋ฐฐํ๋ค๋ฉด, ์์คํ ์ ๋ณํ๊ฐ ์๊ธฐ๋๋ผ๋ ๊ทธ ์ํฅ์ ์ต์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ SRP ์์น์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์( closed ), ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก( open ) ์ค๊ณ๊ฐ ๋์ด์ผ ํ๋ค๋ ์์น์ ๋งํฉ๋๋ค.
์ฆ, ํ์ฅ์ ๋ํด์๋ ๊ฐ๋ฐฉ์ ์ด๊ณ ์์ ์ ๋ํด์๋ ํ์์ ์ด์ด์ผ ํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ๋ง์กฑํ๋ ์ค๊ณ๊ฐ ๋๋ ค๋ฉด, ์บก์ํ๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ์ธํฐํ์ด์ค
์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Animal
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ ํด๋์ค๋ค์ ์ธ์์๋ฆฌ crying()
ํจ์๋ฅผ ์ฌ`์ ์ํฉ๋๋ค.
์ธ์์๋ฆฌ๋ฅผ ํธ์ถํ๋ ํด๋ผ์ด์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ด ์ธํฐํ์ด์ค์์ ์ ์ํ crying()
ํจ์๋ง ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
public class Client {
public static void main(String args[]){
Animal cat = new Cat();
Animal dog = new Dog();
cat.crying();
dog.crying();
}
}
์ด๋ ๊ฒ ์บก์ํ๋ฅผ ํ๋ฉด, ๋๋ฌผ์ด ์ถ๊ฐ๋์์ ๋ crying()
ํจ์๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ๊ฑด๋๋ฆด ํ์๊ฐ ์์ผ๋ฉด์ ์ฝ๊ฒ ํ์ฅํ ์ ์๊ฒ๋ฉ๋๋ค.
์์ ํด๋์ค๋ ์ต์ํ ์์ ์ ๋ถ๋ชจ ํด๋์ค์์ ๊ฐ๋ฅํ ํ์๋ ์ํํ ์ ์์ด์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค.
์ฆ, ์์ ํด๋์ค๋ ์ธ์ ๋ ๋ถ๋ชจ ํด๋์ค์ ์ญํ ์ ๋์ฒด
ํ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋งํ๋ฉฐ, ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค์ ํ์๊ฐ ์ผ๊ด๋จ์ ์๋ฏธํฉ๋๋ค.
์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋์ฒดํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ์ ๊ธฐ๋ฅ์ ๋ํด ์ค๋ฒ๋ผ์ด๋ ๋์ง ์๋๋ก ํ๋ฉด ๋ฉ๋๋ค.
์ฆ, ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ฑ ์์ ๋ฌด์ํ๊ฑฐ๋ ์ฌ์ ์ํ์ง ์๊ณ ํ์ฅ๋ง ์ํํ๋๋ก ํด์ผ LSP๋ฅผ ๋ง์กฑํ๊ฒ ๋ฉ๋๋ค.
์ฒ์ OOP๋ฅผ ๊ณต๋ถํ ๋ ์ค๋ฒ๋ผ์ด๋๊ฐ OOP์ ํน์ง์ด๋ผ ๋ฐฐ์ ๊ณ ์ด๋ฅผ ์ ํ์ฉํด์ผ ํ ๊ฒ๋ง ๊ฐ์๋๋ฐ,
LSP์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ค๋ฒ๋ผ์ด๋๋ ๊ฐ๊ธ์ ํผํ๋ ๊ฒ์ด ์ข๋ค
๊ณ ํฉ๋๋ค.
์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค.
์ฆ, ํ๋์ ๊ฑฐ๋ํ ์ธํฐํ์ด์ค ๋ณด๋ค๋ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
SRP๋ ๊ฐ์ฒด์ ๋จ์ผ ์ฑ ์์ ๋ปํ๋ค๋ฉด, ISP๋ ์ธํฐํ์ด์ค์ ๋จ์ผ ์ฑ ์์ ์๋ฏธํ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํธ๋ํฐ( Phone )์๋ ์ ํ( call ), ๋ฌธ์( sms ), ์๋( alarm ), ๊ณ์ฐ๊ธฐ( calculator ) ๋ฑ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
์๋ 3Gํฐ๊ณผ ํ์ฌ ์ค๋งํธํฐ์ Phone์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ๋ฏ๋ก, call, sms, alarm, calculator
๊ธฐ๋ฅ์ด ์ ์๋ Phone ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ISP๋ฅผ ๋ง์กฑํ๋ ค๋ฉด Phone ์ธํฐํ์ด์ค์ call(), sms(), alarm(), calculator()
ํจ์๋ฅผ ๋ชจ๋ ์ ์ํ๋ ๊ฒ๋ณด๋ค,
Call, Sms, Alarm, Calculator ์ธํฐํ์ด์ค
๋ฅผ ๊ฐ๊ฐ ์ ์ํ์ฌ, 3Gํฐ๊ณผ ์ค๋งํธํฐ ํด๋์ค์์ 4๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ์ค๊ณ๋ฅผ ํ๋ฉด, ๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๊ฒ ๋ฉ๋๋ค.
์ฆ, ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ๋ํด์ ์ํฅ๋ ฅ์ด ์ค์ด๋ค๊ฒ ๋ฉ๋๋ค.
๊ฐ์ฒด๋ค์ด ์๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์์กด ๊ด๊ณ๊ฐ ํ์ฑ๋๋๋ฐ, ์ด ๋ ๊ฐ์ฒด๋ค์ ๋๋ฆ๋๋ก์ ์์น์ ๊ฐ๊ณ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค.
์ฌ๊ธฐ์ ๋๋ฆ๋๋ก์ ์์น์ด๋, ์ถ์์ฑ์ด ๋ฎ์ ํด๋์ค๋ณด๋ค ์ถ์์ฑ์ด ๋์ ํด๋์ค์ ์์กด ๊ด๊ณ
๋ฅผ ๋งบ์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ธํฐํ์ด์ค
๋ฅผ ํ์ฉํ๋ฉด ์ด ์์น์ ์ค์ํ ์ ์๊ฒ ๋ฉ๋๋ค. (์บก์ํ)
Client ๊ฐ์ฒด๋ Cat, Dog, Bird์ crying()
๋ฉ์๋์ ์ง์ ์ ๊ทผํ์ง ์๊ณ , Animal
์ธํฐํ์ด์ค์ crying()
๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ DIP๋ฅผ ๋ง์กฑํ ์ ์์ต๋๋ค.
TV๋ผ๋ ๊ฐ์ฒด๋ฅผ ์๊ฐํด๋ด ์๋ค. ์ฌ์ฉ์๋ ์ ์์ ํค๊ณ , ์ฑ๋๊ณผ ์๋์ ์กฐ์ ํ ์ค ์๋ค๋ฉด TV๋ฅผ ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. TV์ ๋ด๋ถ์ ์ธ ๋ชจ์ต์ด๋ ์๋ฆฌ๋ ์ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ TV ๊ฐ์ฒด์ ๋ํ ์ถฉ๋ถํ ์ดํด ์์ด ์ค์ํ ๋ถํ๋ค์ ๊ฑด๋ค์ด๊ฒ ๋๋ค๋ฉด, TV๋ ๊ฐ๋ฐ์๊ฐ ์๋ํ ๋๋ก ํน์ ์ฌ์ฉ์๊ฐ ์์ํ๋๋ก ์๋ํ์ง ์์ ํ๋ฅ ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ฌ์ฉ์๊ฐ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋ ์์ญ์ ์ ํํ๋ ๊ฒ์ ๊ฐ์ฒด์ ์บก์ํ(encapsulation)๋ผ๊ณ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ถํ์ํ ๋ถ๋ถ์ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ์ฌ, ๊ฐ์ฒด์ ์ค์ฉ์ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค. (ํญ์ ๊ฐ๋ฐ์์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅผ ์ ์์์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.) ๊ฐ์ฒด์ ๋ด๋ถ๊ฐ ๋ฐ๋์ด๋ ๊ทธ ๊ฐ์ฒด์ ์ฌ์ฉ๋ฐฉ๋ฒ์ด ๋ฐ๋์ง ์์ต๋๋ค. (์ฌ์ฉ์๋ ๊ฐ์ฒด ๋ด๋ถ๊ฐ ๋ฐ๋์ด๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ ํ ์ ์์ต๋๋ค.) ๊ฐ์ฒด ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ด๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. (๊ฐ ๊ฐ์ฒด๋ค์ ๋ ๋ฆฝ์ฑ์ด ์ ์ง๋ฉ๋๋ค.) ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ฒ ๋ฉ๋๋ค. (๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ์ผ์ ๊ฐ์ฒด ์ค๊ณ์ ๊ธฐ๋ณธ ์์น์ ๋๋ค.) ํฐ ์์คํ ์ผ์ง๋ผ๋ ์ปดํฌ๋ํธ ๋ณ๋ก ์๊ฒ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค. ์ด๋ก ์ธํ์ฌ ์์คํ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํ ํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค.
ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฐ๋ฐ์๋ ํด๋์ค ๋ฉค๋ฒ(ํ๋์, ๋ฉ์๋)์๊ฒ ์ ๊ทผ์ ์ด์๋ฅผ ์ฌ์ฉํ์ฌ์ ๊ฐ์ฒด๋ฅผ ์บก์ํ ํ ์ ์์ต๋๋ค. Java์์ ์ ๊ทผ์ ์ด์๋ 4๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค.
private
: ๊ฐ์ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
default
: (๊ฐ์ ํด๋์ค) + ๊ฐ์ ํจํค์ง ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
protected
: (๊ฐ์ ํด๋์ค) + (๊ฐ์ ํจํค์ง) + ์์ ์ ์์๋ฐ์ ์์ ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
public
: ์์ ๋กญ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
public class AccessModifier {
private int a = 10;
int b = 20; //default๋ ํค์๋๋ฅผ ์ ์ง ์์ต๋๋ค.
protected int c = 30;
public int d = 40;
}
class AmTester {
public static void main(String[] args) {
AccessModifier am = new AccessModifier();
//int a = am.a; //๋ค๋ฅธ ํด๋์ค ์์๋ ์ ๊ทผ ๋ถ๊ฐ!
int b = am.b;
int c = am.c;
int d = am.d;
}
}