week 1 duyongseon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
JAVA
JVM, JDK, JRE๋ ๋ฌด์์ธ๊ฐ?
JRE
์๋ฐ ์คํ ํ๊ฒฝ์ ์ค์๋ง๋ก JVM์ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐํ ํ์ผ๋ค์ด ๊ฒฐํฉ๋ ์๋ฐ๋ฅผ ์คํํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ๋๋ค.
JDK
์๋ฐ ๊ฐ๋ฐ ํท์ ์ค์๋ง๋ก JRE์ ์ปดํ์ผ๋ฌ, ๋๋ฒ๊ฑฐ ๋ฑ ๊ฐ๋ฐ๋๊ตฌ๋ฅผ ํฌํจํ๋ ํ๋ก๊ทธ๋จ์ ๋๋ค.
JVM
JVM์ Java Byte Code๋ฅผ OS์ ๋ง๊ฒ ํด์ํด ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
Java Compiler๋ javaํ์ผ์ class๋ผ๋ Java byte code๋ก ๋ณํ์์ผ์ค๋๋ค. Byte Code๋ ๊ธฐ๊ณ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ OS์์ ๋ฐ๋ก ์คํ๋์ง ์์ JVM์ด OS๊ฐ ByteCode๋ฅผ ์ดํด ํ ์ ์๋๋ก ํด์ ํด์ค๋๋ค.
์ด๋ฌํ JVM์ ํด์์ ๊ฑฐ์ณ C์ธ์ด ๊ฐ์ ๋ค์ดํฐ๋ธ ์ธ์ด์ ๋นํด ์๋๊ฐ ๋๋ฆฌ์ง๋ง JIT(Just In Time) ์ปดํ์ผ๋ฌ๋ฅผ ๊ตฌํํด ์ด ์ ์ ๊ทน๋ณตํ์ต๋๋ค.
OS์ ์ข ์์ ์ด์ง ์๊ณ Java ํ์ผ๋ง ๊ตฌ์ฑํ๋ฉด ์ด๋ ๋๋ฐ์ด์ค๋ JVM ์์์ ์คํ ํ ์ ์๋ค๋ ์ ์ด Java์ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
JVM์ ํฌ๊ฒ ClassLoader, Runtime Data Areas, Excution Engine 3๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
JVM ๊ตฌ์กฐ
Class Loader
RunTime ์์ ์ Class๋ฅผ ๋ก๋ฉํ๊ฒ ํด์ฃผ๋ฉฐ Class์ Instance๋ฅผ ์์ฑํ๋ฉด Class Loader๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ฒ ๋ฉ๋๋ค.
Runtime Data Areas
JVM์ด ํ๋ก๊ทธ๋จ์ ์ํํ๊ธฐ ์ํด OS๋ก๋ถํฐ ๋ณ๋๋ก ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋งํ๋ฉฐ, Runtime Data Areas๋ ํฌ๊ฒ 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
-
PC Register : Thread๊ฐ ์์ฑ๋ ๋ ๋ง๋ค ์๊ธฐ๋ ๊ณต๊ฐ์ผ๋ก Thread๊ฐ ์ด๋ ํ ๋ช ๋ น์ ์คํํ๊ฒ ๋ ์ง์ ๋ํ ๋ถ๋ถ์ ๊ธฐ๋กํฉ๋๋ค. JVM์ Stacks-Base ๋ฐฉ์์ผ๋ก ์๋ ํ๋๋ฐ, JVM์ CPU์ ์ง์ Instruction์ ์ํํ์ง ์๊ณ , Stack์์ Operand๋ฅผ ๋ฝ์๋ด ์ด๋ฅผ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ทจํ๋๋ฐ, ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ PC Register๋ผ๊ณ ํฉ๋๋ค.
-
Java Virtual Machine Stack : Thread์ ์ํ์ ๋ณด๋ฅผ Frame์ ํตํด์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค. Thread๊ฐ ์์๋ ๋ ์์ฑ๋๋ฉฐ, ๊ฐ Thread ๋ณ๋ก ์์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ Thread๋ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก Local Variable์ ๊ฐ์ง๋๋ค. Java Virtual Machine Stacks์์ ํ์ฌ ์ํํ๊ณ ์๋ Frame์ CUrrent Frame์ด๋ผ๊ณ ํ๋ฉฐ, Stack Frame์๋ Method์ Parameter Variable, Local Variable๊ณผ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
-
Native Method Stack : JVM์ Native Method๋ฅผ ์ํด Native Method Stack์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๋๋ค. Application์์ Native Method๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด Native Method Stack์ ์๋ก์ด Stack Frame์ ์์ฑํ์ฌ Push ํฉ๋๋ค. ์ด๋ JNI๋ฅผ ์ด์ฉํด JVM ๋ด๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ์ํจ์ ๋๋ค. Native Method์ ์ํ์ด ๋๋๋ฉด ํด๋น Method๋ฅผ ํธ์ถํ Stack Frame์ด ์๋ ์๋ก์ด Stack Frame์ ํ๋ ์์ฑํ์ฌ ์์ ์ ์ํํฉ๋๋ค.
-
Method Area : ๋ชจ๋ Thread๊ฐ ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋๋ค. Method Area๋ Class์ Inerface์ ByteCode ๋ฐ ๋ฉํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ ๋ฉ๋๋ค. ์ด๋ Garbage Collection์ ๋์์ด ๋๋ฉฐ Hotspot JVM์ ๊ฒฝ์ฐ Permenent Area๋ผ๋ ๋ช ์นญ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. IBM JVM ๊ฐ์ ๊ฒฝ์ฐ๋ Heap ๋ด์ Class Object ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
-
Heap : Instance์ Array ๊ฐ์ฒด ๋ ์ข ๋ฅ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ๋๋ค. Java Heap์ ๋ชจ๋ Thread์ ์ํด ๊ณต์ ๋๋ค๊ณ ํ๋๋ฐ ๊ทธ๋ก ์ธํด ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ ํ ์ ์์ต๋๋ค.
Execution Engine
Load ๋ Class์ ByteCode๋ฅผ ์คํํ๋ Runtime Module์ด ๋ฐ๋ก Execution Engine์ ๋๋ค. Class Loader๋ฅผ ํตํด JVM ๋ด์ Runtime Data Areas์ ๋ฐฐ์น๋ ๋ฐ์ดํธ ์ฝ๋๋ Execution Engine์ ์ํด ์คํ๋๋ฉฐ, ์คํ ์์ง์ ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด์ ์คํํฉ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ํฐ ์๋ ์๋ฆฌ๋ฅผ ์ค๋ช ํ์์ค
Java์์๋ ๊ฐ๋ฐ์๊ฐ ํ๋ก๊ทธ๋จ ์ฝ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ํด์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector)๊ฐ ๋ ์ด์ ํ์ ์๋ (์ฐ๋ ๊ธฐ) ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ง์ฐ๋ ์์ ์ ํฉ๋๋ค. ์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ ๊ฐ์ง ์ ์ ์กฐ๊ฑด์ ์ํด ๋ง๋ค์ด์ก๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ(Unreachable)๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ด ๋๊ฐ์ง ์ ์ ์กฐ๊ฑด์ ์ฅ์ ์ ์ต๋ํ ์ด๋ฆฌ๊ธฐ ์ํด HotSpot JVM์์๋ ํฌ๊ฒ 2๊ฐ๋ก ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ ๋๋์๋ค. ๋๋ก ๋๋ ๊ณต๊ฐ์ด Young ์์ญ๊ณผ Old ์์ญ์ด๋ค.
-
Young ์์ญ(Young Generation ์์ญ) : ์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์์นํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Minor GC๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
-
Old ์์ญ(Old Generation ์์ญ) : ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋์ง ์์ Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋ฉ๋๋ค. ๋๋ถ๋ถ Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋นํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ Young ์์ญ๋ณด๋ค GC๋ ์ ๊ฒ ๋ฐ์ํฉ๋๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Major GC(ํน์ Full GC)๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
Young ์์ญ์์์ GC(Minor GC)
Young ์์ญ์ 3๊ฐ์ ์์ญ์ผ๋ก ๋๋ฉ๋๋ค.
- Eden ์์ญ
- Survivor ์์ญ (2๊ฐ)
Survivor ์์ญ์ด 2๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด 3๊ฐ์ ์์ญ์ผ๋ก ๋๋ฉ๋๋ค. ๊ฐ ์์ญ์ ์ฒ๋ฆฌ ์ ์ฐจ๋ฅผ ์์์ ๋ฐ๋ผ ๊ธฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ก ์์ฑํ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ Eden ์์ญ์ ์์นํ๋ค.
- Eden ์์ญ์์ GC๊ฐ ํ ๋ฒ ๋ฐ์ํ ํ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ ์ค ํ๋๋ก ์ด๋๋๋ค.
- Eden ์์ญ์์ GC๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฏธ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ Survivor ์์ญ์ผ๋ก ๊ฐ์ฒด๊ฐ ๊ณ์ ์์ธ๋ค.
- ํ๋์ Survivor ์์ญ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด ๊ทธ ์ค์์ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ฐฌ Survivor ์์ญ์ ์๋ฌด ๋ฐ์ดํฐ๋ ์๋ ์ํ๋ก ๋๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ ๊ณ์ํด์ ์ด์๋จ์ ์๋ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
Old ์์ญ์ ๋ํ GC(Major GC)
Major GC๋ GC๋ฐฉ์์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์ ์ฐจ๊ฐ ๋ฌ๋ผ์ง์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ต๋๋ค.
- Old ์์ญ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๊ฒ์ฌํ๋ฉฐ ์ฐธ์กฐ๋๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
- ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ชจ์ ํ ๋ฒ์ ์ ๊ฑฐํฉ๋๋ค.
Minor GC๋ณด๋ค ์๊ฐ์ด ํจ์ฌ ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์คํ์ค์ GC๋ฅผ ์ ์ธํ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ค์งํฉ๋๋ค.
SPRING
์คํ๋ง๋ถํธ ์ ์คํ๋ง์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค
์คํ๋ง ํ๋ ์์ํฌ๋ ์๋ฐ ์ํ๊ณ์์ ๊ฐ์ฅ ๋์ค์ ์ธ ์์ฉํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ํ๋ ์์ํฌ์ ๋๋ค. ์์กด์ฑ ์ฃผ์ (DI, Dependency Injection)๊ณผ ์ ์ด์ ์ญ์ (IOC, Inversion Of Control)์ ์คํ๋ง์์ ๊ฐ์ฅ ์ค์ํ ํน์ง์ค ํ๋์ ๋๋ค. ์ด๋ค๋ก ์ธํด์ ์ข๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๋ฐฉ์์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ๋ฐ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐํ ์์ฉํ๋ก๊ทธ๋จ์ ๋จ์ํ ์คํธ๊ฐ ์ฉ์ดํ๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ํ๋ฆฌํฐ ๋์ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
์คํ๋ง๋ถํธ๋ ์๋์ค์ (AutoConfiguration)์ ์ด์ฉํ์๊ณ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ํ ๋ชจ๋ ๋ด๋ถ ๋ํ๋์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํด์ผํ๋๊ฑด ๋จ์ง ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ฟ์ ๋๋ค. ์คํ๋ง์ jarํ์ผ์ด ํด๋์ค ํจ์ค์ ์๋ ๊ฒฝ์ฐ Spring Boot๋ Dispatcher Servlet์ผ๋ก ์๋ ๊ตฌ์ฑํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ง์ฝ Hibernate์ jarํ์ผ์ด ํด๋์ค ํจ์ค๋ด์ ์กด์ฌํ๋ค๋ฉด ์ด๋ฅผ datasource๋ก ์๋์ค์ ํ๊ฒ ๋ฉ๋๋ค. ์คํ๋ง๋ถํธ๋ ๋ฏธ๋ฆฌ์ค์ ๋ ์คํํฐ ํ๋ก์ ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์น์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋์, ์ฐ๋ฆฌ๋ ์ฌ์ฉํ๋ ค๋ jar, ์ฌ์ฉํ jar ๋ฒ์ , ํจ๊ป ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋ชจ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์๋ Spring MVC, Jackson Databind, Hibernate ์ฝ์ด ๋ฐ Log4j์ ๊ฐ์ ์ ์ฌํ ์๊ตฌ์ฌํญ๋ค์ด ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ jar๋ค์ ์๋ก ํธํ๋๋ ๋ฒ์ ๋ค์ ๋ฐ๋ก ์ ํ์ ํด์ฃผ์ด์ผ ํ์ต๋๋ค. ์ด๋ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๊ธฐ ์ํด์ ์คํ๋ง ๋ถํธ๋ SpringBoot Starter๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ ๋์ ํ์ต๋๋ค.
์คํ๋ง์ ํน์ง์ ๋ํด์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋น๋์ด ์ค๋ช ํ์์ค
- AOP : ์ธ์ฆ ์ฒ๋ฆฌ ํน์ ๊ณตํต ๋ก๊ทธ ์์ง๊ณผ ๊ฐ์ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ AOP๋ฅผ ํตํด์ ๊ตฌํ ํ ์ ์์ต๋๋ค.
- DI : ๊ฐ์ฒด๊ฐ์ ์์กด๊ด๊ณ๋ฅผ Dependency Injection์ ํตํด์ ์ํ ํ ์ ์์ต๋๋ค.
- PSA : ํ๊ฒฝ๊ณผ ์ธ๋ถ ๊ธฐ์ ์ ๋ณํ์ ๊ด๊ณ์์ด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ธฐ์ ์ ์ ๊ทผ ํ ์ ์๊ฒ ํด์ค๋๋ค.
์คํ๋ง์ ์๋น์ค ์ถ์ํ๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค
์ถ์ํ๋ ํ์ ์์คํ ์ ๊ณตํต์ ์ ๋ฝ์๋ด์ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ ๋งํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ ์์คํ ์ด ์ด๋ค ๊ฒ์ธ์ง ์์ง ๋ชปํด๋, ๋๋ ํ์ ์์คํ ์ด ๋ฐ๋๋๋ผ๋ ์ผ๊ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ ์๊ฐ ์์ต๋๋ค. ์คํ๋ง์ ํธ๋์ญ์ ๊ธฐ์ ์ ๊ณตํต์ ์ ๋ด์ ํธ๋์ญ์ ์ถ์ํ ๊ธฐ์ ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ธ PlatformTransactionManager๋ฅผ ์ ์ธํ๊ณ ๊ฐ DB์ ๋ํ transactionManager ํด๋์ค๋ฅผ DIํด์ฃผ๋ฉด ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๋ ํต์ผ๋๋ ๋์์ DB๊ฐ ๋ฐ๋๋ค๋ฉด DI์ค์ ๋ง ๊ต์ฒดํด์ฃผ๋ฉด ํธ๋์ญ์ ๊ด๋ จ์ฝ๋์ ๋ณ๊ฒฝ์ ํ๋๋ ์๊ฒ๋๋ฉฐ ์ด๊ฒ์ด ์๋น์ค ์ถ์ํ์ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ํคํ ์ฒ
๊ฐ์ฒด์งํฅ๊ณผ ์ ์ฐจ์งํฅ์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํ์์ค
์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ฐจ์ ์ธ ์ฒ๋ฆฌ๊ฐ ์ค์์ ๋๋ฉฐ ํ๋ก๊ทธ๋จ ์ ์ฒด๊ฐ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ์ปดํจํฐ์ ์์ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋นํด ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌ ๋์ด ์๊ฐ์ ์ผ๋ก ์ ๋ฆฌํ์ง๋ง ์คํ ์์๊ฐ ์ ํด์ ธ ์์ผ๋ฏ๋ก ์ฝ๋์ด ์์๊ฐ ๋ฐ๋๋ฉด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ ์ธ๊ณ๋ฅผ ๋ชจ๋ธ๋งํ์ฌ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ์ ์ ์ฐจ๋ฅผ ํ๋์ ๋ฉ์ด๋ฆฌ๋ก ๋ฌถ์ด์ ์๊ฐํ๊ฒ ๋ฉ๋๋ค.์ฝ๋์ ์ฌํ์ฉ์ฑ์ด ๋๊ณ ๋๋ฒ๊น ์ด ์ฝ๋ค๋ ์ฅ์ ์ด ์์ง๋ง ์ด๋ค ๋ชจ๋์ ์๋ ํ๋์ ๊ธฐ๋ฅ๋ง ํ์ํ๋๋ผ๋ ๋ชจ๋ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ๋ณด๋ค ํ๋ก๊ทธ๋จ ์ฌ์ด์ฆ๊ฐ ๋ ์ปค์ง ์๋ ์๊ณ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ์ฐจ์งํฅ์์ฒ๋ผ ํน์ ํจ์์ ์ ๊ทผ ํ ์ ์๊ณ ์์ผ๋ก๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํด ์๋์ ์ธ ์ธก๋ฉด์์ ๋ถ์ด์ต์ด ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
SOLID ์์น์ ๋ํด ์๋๋๋ก ์ค๋ช ํ์์ค
๊ฐ์ฒด์งํฅ ์ค๊ณ์์ ์ง์ผ์ค์ผ ํ 5๊ฐ์ ์์น(SRP, OCP, LSP, ISP, DIP)์ ๋งํฉ๋๋ค.
-
SRP(Single Responsibility Principle) ๋จ์ผ ์ฑ ์์์น ๊ฐ์ฒด๋ ๋จ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค๋ ์์น์ ๋งํฉ๋๋ค. ๊ฐ์ฒด์ ์ฑ ์์ด ๋ง์์ง์๋ก ํด๋์ค ๋ด๋ถ์์ ์๋ก ๋ค๋ฅธ ์ญํ ์ ์ํํ๋ ์ฝ๋๋ผ๋ฆฌ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ์ฆ, ๊ฐ์ฒด๋ง๋ค ์ฑ ์์ ์ ๋๋ก ๋๋์ง ์๋๋ค๋ฉด ์์คํ ์ ๋งค์ฐ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ ์ฑ ์์ ๋ถ๋ฆฌ ์ํฌ ํ์๊ฐ ์์ต๋๋ค.
-
OCP(Open-Closed Principle) ๊ฐ๋ฐฉ ํ์์์น ๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์(closed), ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก(open) ์ค๊ณ๊ฐ ๋์ด์ผ ํ๋ค๋ ์์น์ ๋งํฉ๋๋ค. ์ฆ, ํ์ฅ์ ๋ํด์๋ ๊ฐ๋ฐฉ์ ์ด๊ณ ์์ ์ ๋ํด์๋ ํ์์ ์ด์ด์ผ ํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ์ด๋ฅผ ๋ง์กฑํ๋ ์ค๊ณ๊ฐ ๋๋ ค๋ฉด, ์บก์ํ๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ์ธํฐํ์ด์ค์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
-
LSP(Liskov Substitution Principle) ๋ฆฌ์ค์ฝํ ์นํ์์น ์์ ํด๋์ค๋ ์ต์ํ ๋ถ๋ชจ ํด๋์ค์์ ๊ฐ๋ฅํ ํ์๋ ์ํ ํ ์ ์์ด์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค. ์์ ํด๋์ค๋ ์ธ์ ๋ ๋ถ๋ชจ ํด๋์ค์ ์ญํ ์ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋งํ๋ฉฐ, ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค์ ํ์๊ฐ ์ผ๊ด๋จ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ฑ ์์ ๋ฌด์ํ๊ฑฐ๋ ์ฌ์ ์ํ์ง ์๊ณ ํ์ฅ๋ง ์ํํ๋๋ก ํด์ผ LSP๋ฅผ ๋ง์กฑํ๊ฒ ๋ฉ๋๋ค.
-
ISP(Interface Segregation Principle) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น ์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค. ์ฆ, ํ๋์ ๊ฑฐ๋ํ ์ธํฐํ์ด์ค ๋ณด๋ค๋ ์ฌ๋ฌ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ธํฐํ์ด์ค๊ฐ ๋ซ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. SRP๋ ๊ฐ์ฒด์ ๋จ์ผ ์ฑ ์์ ๋ปํ๋ค๋ฉด, ISP๋ ์ธํฐํ์ด์ค์ ๋จ์ผ ์ฑ ์์ ์๋ฏธํฉ๋๋ค.
-
DIP(Dependency Inversion Principle) ์์กด ์ญ์ ์์น ๊ฐ์ฒด๋ค์ด ์๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์์กด ๊ด๊ณ๊ฐ ํ์ฑ๋๋๋ฐ, ์ด ๋ ๊ฐ์ฒด๋ค์ ๋๋ฆ๋๋ก์ ์์น์ ๊ฐ๊ณ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์์ผ ํ๋ค๋ ์ค๊ณ ์์น์ ๋๋ค.
์บก์ํ์ ๋ํด ์ค๋ช ํ์์ค
์ธ๋ถ ๊ฐ์ฒด์์ ๊ตฌํ๋ฐฉ์์ ์ ์ ์๋๋ก ์จ๊ธฐ๊ณ ๋ณ๋๋ก ์ ๊ทผ ํ ์ ์๋ getter/setter ๋ฉ์๋๋ฅผ ํตํด ์ ๊ทผํ๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ธ๋ถ์ ๊ฐ์ฒด๊ฐ ์ํฅ์ ๋ฐ์ผ๋ฉด ์๋ฉ๋๋ค.