week 1 jisoo - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JAVA

JDK, JRE, JVM์ด๋ž€

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)๋กœ ๋‚˜๋‰œ๋‹ค.

1. Class Loader

์ž๋ฐ”์—์„œ ์†Œ์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด Person.java ์ฒ˜๋Ÿผ .javaํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

.java ์†Œ์Šค๋ฅผ ์ž๋ฐ”์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผํ•˜๋ฉด Person.class ๊ฐ™์€ .classํŒŒ์ผ**(๋ฐ”์ดํŠธ์ฝ”๋“œ)**์ด ์ƒ์„ฑ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํด๋ž˜์ŠคํŒŒ์ผ๋“ค์„ ์—ฎ์–ด์„œ JVM์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ์ธ Runtime Data Area๋กœ ๋กœ๋“œํ•˜๋Š” ์—ญํ•  (์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰์ค‘์ผ ๋•Œ ์ด๋Ÿฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.)

2. Execution Engine

Class Loader์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋œ ํด๋ž˜์Šค(๋ฐ”์ดํŠธ ์ฝ”๋“œ)๋“ค์„ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€๊ฒฝํ•ด ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)๋ฐฉ์‹์ด ์žˆ๊ณ  JIT(Just-In-Time) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

JIT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์ „์ฒด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•ด์„œ Execution Engine์ด ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

3. Garbage Collector

Garbage Collector(GC)๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ(์ ์žฌ)๋œ ๊ฐ์ฒด๋“ค ์ค‘์— ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ ํ›„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

GC๊ฐ€ ์—ญํ• ์„ ํ•˜๋Š” ์‹œ๊ฐ„์€ ์ •ํ™•ํžˆ ์–ธ์ œ์ธ์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. (์ฐธ์กฐ๊ฐ€ ์—†์–ด์ง€์ž๋งˆ์ž ํ•ด์ œ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ)

๋˜ ๋‹ค๋ฅธ ํŠน์ง•์€ GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ์ •์ง€๋œ๋‹ค.

ํŠนํžˆ Full GC๊ฐ€ ์ผ์–ด๋‚˜์„œ ์ˆ˜ ์ดˆ๊ฐ„ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ •์ง€ํ•œ๋‹ค๋ฉด ์žฅ์• ๋กœ ์ด์–ด์ง€๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

4. Runtime Data Area

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค.

JVM์ด ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰๋˜๋ฉด์„œ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค. Class Loader์—์„œ ์ค€๋น„ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณด๊ด€ํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.

์ด ์˜์—ญ์€ ํฌ๊ฒŒ Method Area, Heap Area, Stack Area, PC Register, Native Method Stack๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ์ž๋ฐ” ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ(Runtime Data area)๊ตฌ์กฐ

1. Method area (๋ฉ”์†Œ๋“œ ์˜์—ญ)

JVM์ด ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(ํ•„๋“œ), ํด๋ž˜์Šค ๋ณ€์ˆ˜(Static ๋ณ€์ˆ˜), ์ƒ์„ฑ์ž์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

Runtime Constant Pool

  • ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ํฌํ•จ๋˜์ง€๋งŒ ๋…์ž์  ์ค‘์š”์„ฑ์ด ์žˆ๋‹ค.
  • ํด๋ž˜์Šค ํŒŒ์ผ constant_pool ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์ˆ˜, ๋ฉ”์†Œ๋“œ์™€ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • JVM์€ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋‚˜ ํ•„๋“œ์˜ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์ฐธ์กฐํ•œ๋‹ค

๋ฉ”์†Œ๋“œ ์˜์—ญ/๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€์˜ ์‚ฌ์šฉ๊ธฐ๊ฐ„ ๋ฐ ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฒ”์œ„

  • JVM ์‹œ์ž‘์‹œ ์ƒ์„ฑ
  • ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ๊นŒ์ง€
  • ๋ช…์‹œ์ ์œผ๋กœ null ์„ ์–ธ ์‹œ
  • ๊ตฌ์„ฑ ๋ฐฉ์‹์ด๋‚˜ GC ๋ฐฉ๋ฒ•์€ JVM ๋ฒค๋”๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•œ๋‹ค.

2. Heap area (ํž™ ์˜์—ญ)

  • JVM์ด ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
  • New ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋˜๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์™€ ๋ฐฐ์—ด์„ ์ €์žฅํ•œ๋‹ค.
  • ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ์Šคํƒ ์˜์—ญ์˜ ๋ณ€์ˆ˜๋‚˜ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•œ๋‹ค.
  • ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•„๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์˜๋ฏธ ์—†๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜์–ด GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.
  • ํž™ ์˜์—ญ์˜ ์‚ฌ์šฉ๊ธฐ๊ฐ„ ๋ฐ ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฒ”์œ„ ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ null ์„ ์–ธ ์‹œ GC(Garbage Collection) ๋Œ€์ƒ ๊ตฌ์„ฑ ๋ฐฉ์‹์ด๋‚˜ GC ๋ฐฉ๋ฒ•์€ JVM ๋ฒค๋”๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•œ๋‹ค.

3. Stack area (์Šคํƒ ์˜์—ญ)

์ง€์—ญ ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ๊ฐ’, ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๊ฐ’๋“ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

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์„ ์ €์žฅ
  • ๋ฉ”์†Œ๋“œ ์ •๋ณด, ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ์—ฐ์‚ฐ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • ๊ธฐ๋ณธ(์›์‹œ)ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ์Šคํƒ ์˜์—ญ์— ์ง์ ‘ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ์ฐธ์กฐํƒ€์ž„ ๋ณ€์ˆ˜๋Š” ํž™ ์˜์—ญ์ด๋‚˜ ๋ฉ”์†Œ๋“œ ์˜์—ญ์˜ ๊ฐ์ฒด ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.

4. PC Register (PC ๋ ˆ์ง€์Šคํ„ฐ)

Thread(์“ฐ๋ ˆ๋“œ)๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ์œผ๋กœ Program Counter ์ฆ‰, ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์˜ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์˜์—ญ์ด๋‹ค. (*CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ์™€ ๋‹ค๋ฆ„)

์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

5. Native method stack

์ž๋ฐ” ์™ธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.

๋ณดํ†ต 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

  1. ์ตœ์ดˆ์— ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด Eden์˜์—ญ์— ์ƒ์„ฑ๋œ๋‹ค.

  2. Eden์˜์—ญ์— ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋“์ฐจ๊ฒŒ ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ GC๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.

  3. survivor1 ์˜์—ญ์— Eden์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  survivor1 ์˜์—ญ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์˜์—ญ์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

  4. Eden์˜์—ญ๋„ ๊ฐ€๋“์ฐจ๊ณ  survivor1์˜์—ญ๋„ ๊ฐ€๋“์ฐจ๊ฒŒ๋œ๋‹ค๋ฉด, Eden์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด์™€ survivor1์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ค‘์— ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

  5. ์ฐธ์กฐ ๋˜๊ณ ์žˆ์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” ๋‚ด๋ฒ„๋ ค๋‘๊ณ  ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋งŒ survivor2์˜์—ญ์— ๋ณต์‚ฌํ•œ๋‹ค.

  6. survivor2์˜์—ญ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์˜์—ญ์˜ ๊ฐ์ฒด๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค.

  7. ์œ„์˜ ๊ณผ์ •์ค‘์— ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ survivor2์—์„œ Old์˜์—ญ์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

  • ์œ„ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณต, survivor2์˜์—ญ๊นŒ์ง€ ๊ฝ‰์ฐจ๊ธฐ ์ „์— ๊ณ„์†ํ•ด์„œ Old๋กœ ๋น„์›€

Major GC(Full GC) : Old ์˜์—ญ์—์„œ ์ผ์–ด๋‚˜๋Š” GC

  1. Old ์˜์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  2. ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ๋ชจ์•„ ํ•œ ๋ฒˆ์— ์ œ๊ฑฐํ•œ๋‹ค.

  • Minor GC๋ณด๋‹ค ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋งŽ์ด ๊ฑธ๋ฆฌ๊ณ  ์‹คํ–‰์ค‘์— GC๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ค‘์ง€ํ•œ๋‹ค.
  • Major GC(Full GC)๊ฐ€ ์ผ์–ด๋‚˜๋ฉด,

Old์˜์—ญ์— ์žˆ๋Š” ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋“ค์„ ํ‘œ์‹œํ•˜๊ณ  ๊ทธ ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด์„œ **Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ตฌ๋ฉ(**์ œ๊ฑฐ๋˜๊ณ  ๋นˆ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„)์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์„ ์—†์• ๊ธฐ ์œ„ํ•ด ์žฌ๊ตฌ์„ฑ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. (๋””์Šคํฌ ์กฐ๊ฐ๋ชจ์Œ์ฒ˜๋Ÿผ ์กฐ๊ฐ๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•จ)

๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๊ณ  ์žˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ •์ง€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

SPRING

์Šคํ”„๋ง๋ถ€ํŠธ ์™€ ์Šคํ”„๋ง์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ

์Šคํ”„๋ง, ์ •ํ™•ํ•˜๊ฒŒ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๋จผ์ € ์Šคํ”„๋ง์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ฐจ์ด๊ฐ€ ์–ด๋–ค๊ฑด์ง€ ์•Œ๊ณ  ๊ฐ€๋Š”๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ฝ”๋“œ ๋ญ‰์น˜์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ž๊ธฐ ์ฝ”๋“œ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จ์‹œํ‚ค๊ณ  ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”์šฑ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. 

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ๋‹ฌ๋ ค์žˆ๋‹ค.

์Šคํ”„๋ง ์‚ฌ์ดํŠธ์—์„œ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ธํ”„๋ผ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์„ค์ •ํ•˜๋„๋ก ํ•ด์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋กœ ๋Œ€๋ถ€๋ถ„์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ง€์›ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ ์•ˆ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๊ธฐ์ˆ ํ•˜๋ฉด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋ฅผ ํ•ด์„ํ•ด์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋กœ๋Š” Servlet API ๊ฐ€ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” API๋ฅผ ์ฒ˜๋ฆฌํ•  ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๊ฒƒ์ด Servlet API ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค์ž„์„ ํ‘œ์‹œ(์–ด๋…ธํ…Œ์ด์…˜ ํ™œ์šฉ)ํ•œ๋‹ค. ๊ทธ ์ดํ›„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์Šคํ”„๋ง์€ API ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ Servlet์— ๊ด€๋ จ๋œ ๊ฒƒ์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ, ๊ฐ์ฒด ์ƒ์„ฑ ๋“ฑ ์™ ๋งŒํ•œ ๊ฒƒ๋“ค์€ ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ํ•ด์ค€๋‹ค. ์ด๋Ÿฐ ํŽธํ•œ ์  ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๋ชจ๋“  Spring ๋ชจ๋“ˆ๋“ค์˜ ํ•ต์‹ฌ์€ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ IoC(Inversion of Control)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ IoC๋ฅผ ํ†ตํ•ด ์†Œ์Šค๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™” ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Boot?

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์€๋งŒํผ ํ™˜๊ฒฝ์„ค์ •์ด ๋ณต์žกํ•œ ํŽธ์ด๋‹ค. ์ด์— ์–ด๋ ค์›€์„ ๋Š๋ผ๋Š” ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ •๋ง ํŽธํ•˜๊ฒŒ ์Šคํ”„๋ง์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ 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์„ค์ •๋งŒ ๊ต์ฒดํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋””๋น„๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋”๋ผ๋„ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์€ ํ•˜๋‚˜๋„ ์—†๋Š”๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ์„œ๋น„์Šค ์ถ”์ƒํ™”์˜ ์žฅ์ ์ธ ๊ฒƒ์ด๋‹ค.

https://www.wbluke.com/16

์•„ํ‚คํ…์ฒ˜

๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ์ ˆ์ฐจ์ง€ํ–ฅ์— ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค

์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”
  • ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋„๋ก ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•
  • c์–ธ์–ด
  • ์ปดํ“จํ„ฐ์˜ ์ž‘์—… ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ (๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์ฒ˜๋ฆฌ๋จ)
  • ํ”„๋กœ์‹œ์ ธ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ฒ•
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•จ์ˆ˜ ๊ตฌํ˜„

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ์†Œํ”„ํŠธ์›จ์–ด, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฐœ๋‹ฌ๋กœ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฐœ๋‹ฌ์„ ๋”ฐ๋ผ์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฐฐ๊ฒฝ์—์„œ ๋“ฑ์žฅ
  • ๊ฐœ๋ฐœํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ฌถ์–ด ๋ชจ๋“ˆํ™” โ†’ ํ•˜๋“œ์›จ์–ด๊ฐ€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ค‘๋ณต ์—ฐ์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•จ
  • ๋ชจ๋“ˆ์˜ ์žฌํ™œ์šฉ์„ฑ โ†’ ํ•˜๋“œ์›จ์–ด์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ž„
  • ์‹ค์ œ ์„ธ๊ณ„๋ฅผ ๋ชจ๋ธ๋ง
  • ๋ฐ์ดํ„ฐ์™€ ์ ˆ์ฐจ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ƒ๊ฐ
  • ๊ฐ์ฒด๋Š” ์ž์‹ ๋งŒ์˜ ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ์‹œ์ €๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ๊ฐ์ฒด๋Š” ์ž์‹ ๋งŒ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ๊ฐ์ฒด๋“ค์€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฐ์ฒด ๋‚ด์— ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
  • ๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ์ฑ…์ž„์€ ์ž‘์„ ์ˆ˜๋ก ์ข‹๋‹ค.
  • ๊ฐ์ฒด๋Š” ๊ฐ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ •์˜ โ†’ ํ•œ ๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ์ฑ…์ž„์„ ์ •์˜ํ•œ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค
  • ์บก์Šํ™” : ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„(ํŠนํžˆ ๋ฐ์ดํ„ฐ)์„ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š์Œ
  • ์ƒ์† : ์ด๋ฏธ ์ž‘์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ์ด์–ด๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ์ƒ์„ฑ (๋ถ€๋ชจ ํด๋ž˜์Šค ๊ธฐ๋Šฅ ์žฌํ™œ์šฉ)
  • ๋‹คํ˜•์„ฑ : ํ•˜๋‚˜์˜ ์ด๋ฆ„์œผ๋กœ ๋งŽ์€ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ํ•˜๋Š” ๊ธฐ๋ฒ•
  • ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์„ฑ์ด ๋†’๋‹ค
  • ์ฝ”๋”ฉ์ด ์ ˆ์ฐจ๋น„ํ–ฅ์— ๋น„ํ•ด ๊ฐ„๋‹จ
  • ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค
  • ์„ค๊ณ„์— ๋งŽ์€ ์‹œ๊ฐ„์ด ๋“ค์–ด๊ฐ„๋‹ค

https://brownbears.tistory.com/407
https://pjh3749.tistory.com/244

SOLID ์›์น™์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•˜์‹œ์˜ค

SOLID ์›์น™

SOLID ์›์น™์ด๋ž€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์ง€์ผœ์ค˜์•ผ ํ•  5๊ฐœ์˜ ์›์น™( SRP, OCP, LSP, DIP, ISP )์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„ค๊ณ„์›์น™์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์‹œ์Šคํ…œ์— ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„, ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๊ณ  ์ดํ›„์— ํ™•์žฅ์„ฑ์ด ์žˆ๋Š” ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์„ค๊ณ„๋ž€ ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ, ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ”์œ„๊ฐ€ ์ ์€ ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

1. SRP( Single Responsibility Principle ), ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

๊ฐ์ฒด๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์‘์ง‘๋„๋ฅผ ๋†’๊ฒŒ, ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์‘์ง‘๋„
    • ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”์†Œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ญ‰์ณ์žˆ๋Š”์ง€, ์ฆ‰ ๊ตฌ์„ฑ ์š”์†Œ๋“ค ์‚ฌ์ด์˜ ์‘์ง‘๋ ฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐํ•ฉ๋„
    • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ ์š”์†Œ๋“ค ์‚ฌ์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜์กด์ ์ธ์ง€๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

SRP์— ๋”ฐ๋ฅธ ์„ค๊ณ„๋ฅผ ํ•˜๋ฉด ์‘์ง‘๋„๋Š” ๋†’๊ฒŒ, ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ”ํžˆ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

calculator() ํ•จ์ˆ˜๊ฐ€ ๋ง์…ˆ, ๋บผ์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ์„ ๋ชจ๋‘ ํ•œ๋‹ค๋ฉด ์ด๋Š” ์ข‹์€ ์„ค๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ง์…ˆ, ๋บผ์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ์ด ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Calculator ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ, Calculator ๊ฐ์ฒด๋Š” ๋ง์…ˆ, ๋บ„์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ๋งŒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์‚ฌ์น™์—ฐ์‚ฐ์— ๋Œ€ํ•œ ์ฑ…์ž„๋งŒ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„์— ๊ณ„์‚ฐ๊ธฐ์— ์•Œ๋žŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ, alarm() ํ•จ์ˆ˜๋ฅผ Calculator์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ SRP์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ์ฒด์— ์ฑ…์ž„์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ผ๋ฆฌ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ์ฒด๋งˆ๋‹ค ์ฑ…์ž„์„ ์ œ๋Œ€๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ€ ํ•˜๋Š” ์ผ( ํ•จ์ˆ˜ )์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์ด ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ–๋„๋ก ์ž˜ ๋ถ„๋ฐฐํ•œ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋”๋ผ๋„ ๊ทธ ์˜ํ–ฅ์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SRP ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

2. OCP ( Open-Closed Principle ), ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™

๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ( 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() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ฑด๋“œ๋ฆด ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด์„œ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

3. LSP ( Liskov Substitution Principle ), ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

์ž์‹ ํด๋ž˜์Šค๋Š” ์ตœ์†Œํ•œ ์ž์‹ ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ฐ€๋Šฅํ•œ ํ–‰์œ„๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ž์‹ ํด๋ž˜์Šค๋Š” ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค์˜ ํ–‰์œ„๊ฐ€ ์ผ๊ด€๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ€๋ชจ์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ด์•ผ LSP๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ OOP๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ OOP์˜ ํŠน์ง•์ด๋ผ ๋ฐฐ์› ๊ณ  ์ด๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์•ผ ํ•  ๊ฒƒ๋งŒ ๊ฐ™์•˜๋Š”๋ฐ,

LSP์— ๋”ฐ๋ฅด๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ๋Š” ๊ฐ€๊ธ‰์  ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

4. ISP ( Interface Segregation Principle ), ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ค๊ณ„๋ฅผ ํ•˜๋ฉด, ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์˜ํ–ฅ๋ ฅ์ด ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

5. DIP ( Dependency Inversion Principle ), ์˜์กด ์—ญ์ „ ์›์น™

๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋˜๋Š”๋ฐ, ์ด ๋•Œ ๊ฐ์ฒด๋“ค์€ ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ์›์น™์„ ๊ฐ–๊ณ  ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ์›์น™์ด๋ž€, ์ถ”์ƒ์„ฑ์ด ๋‚ฎ์€ ํด๋ž˜์Šค๋ณด๋‹ค ์ถ”์ƒ์„ฑ์ด ๋†’์€ ํด๋ž˜์Šค์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด ์›์น™์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์บก์Šํ™”)

Client ๊ฐ์ฒด๋Š” Cat, Dog, Bird์˜ crying() ๋ฉ”์„œ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , Animal ์ธํ„ฐํŽ˜์ด์Šค์˜ crying() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ DIP๋ฅผ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บก์Šํ™”์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค

๊ฐ์ฒด์˜ ์บก์Šํ™”

TV๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ „์›์„ ํ‚ค๊ณ , ์ฑ„๋„๊ณผ ์Œ๋Ÿ‰์„ ์กฐ์ ˆ ํ•  ์ค„ ์•ˆ๋‹ค๋ฉด TV๋ฅผ ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TV์˜ ๋‚ด๋ถ€์ ์ธ ๋ชจ์Šต์ด๋‚˜ ์›๋ฆฌ๋Š” ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ TV ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ดํ•ด ์—†์ด ์ค‘์š”ํ•œ ๋ถ€ํ’ˆ๋“ค์„ ๊ฑด๋“ค์ด๊ฒŒ ๋œ๋‹ค๋ฉด, TV๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ํ˜น์€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒํ•œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์„ ๊ฐ์ฒด์˜ ์บก์Šํ™”(encapsulation)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์บก์Šํ™”์˜ ์žฅ์ 

์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜์—ฌ, ๊ฐ์ฒด์˜ ์˜ค์šฉ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ•ญ์ƒ ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.) ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ทธ ๊ฐ์ฒด์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์‚ฌ์šฉ์ž๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ฐ ๊ฐ์ฒด๋“ค์˜ ๋…๋ฆฝ์„ฑ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.) ๊ฐ์ฒด๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๊ฐ์ฒด๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์ผ์€ ๊ฐ์ฒด ์„ค๊ณ„์˜ ๊ธฐ๋ณธ ์›์น™์ž…๋‹ˆ๋‹ค.) ํฐ ์‹œ์Šคํ…œ ์ผ์ง€๋ผ๋„ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ์ œ์–ด์ž(access modifier)

ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋Š” ํด๋ž˜์Šค ๋ฉค๋ฒ„(ํ•„๋“œ์™€, ๋ฉ”์†Œ๋“œ)์—๊ฒŒ ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ๊ฐ์ฒด๋ฅผ ์บก์Šํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 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; 
    }
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ