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๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ฐ ์˜์—ญ์˜ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ธฐ์ˆ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋Š” Eden ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค.
  2. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•œ ํ›„ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Survivor ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™๋œ๋‹ค.
  3. Eden ์˜์—ญ์—์„œ GC๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฏธ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” Survivor ์˜์—ญ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ณ„์† ์Œ“์ธ๋‹ค.
  4. ํ•˜๋‚˜์˜ Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋ฉด ๊ทธ ์ค‘์—์„œ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ Survivor ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋“ ์ฐฌ Survivor ์˜์—ญ์€ ์•„๋ฌด ๋ฐ์ดํ„ฐ๋„ ์—†๋Š” ์ƒํƒœ๋กœ ๋œ๋‹ค.
  5. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‚ด์•„๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

Old ์˜์—ญ์— ๋Œ€ํ•œ GC(Major GC)

Major GC๋Š” GC๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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)์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

  1. SRP(Single Responsibility Principle) ๋‹จ์ผ ์ฑ…์ž„์›์น™ ๊ฐ์ฒด๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์— ์ฑ…์ž„์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ผ๋ฆฌ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋งˆ๋‹ค ์ฑ…์ž„์„ ์ œ๋Œ€๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๋Š”๋‹ค๋ฉด ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฑ…์ž„์„ ๋ถ„๋ฆฌ ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. OCP(Open-Closed Principle) ๊ฐœ๋ฐฉ ํ์‡„์›์น™ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ(closed), ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก(open) ์„ค๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ํ์‡„์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์„ค๊ณ„๊ฐ€ ๋˜๋ ค๋ฉด, ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  3. LSP(Liskov Substitution Principle) ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜์›์น™ ์ž์‹ ํด๋ž˜์Šค๋Š” ์ตœ์†Œํ•œ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ฐ€๋Šฅํ•œ ํ–‰์œ„๋Š” ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค. ์ž์‹ ํด๋ž˜์Šค๋Š” ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ์ž์‹ ํด๋ž˜์Šค์˜ ํ–‰์œ„๊ฐ€ ์ผ๊ด€๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ด์•ผ LSP๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  4. ISP(Interface Segregation Principle) ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. SRP๋Š” ๊ฐ์ฒด์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ๋œปํ•œ๋‹ค๋ฉด, ISP๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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

์™ธ๋ถ€ ๊ฐ์ฒด์—์„œ ๊ตฌํ˜„๋ฐฉ์‹์€ ์•Œ ์ˆ˜ ์—†๋„๋ก ์ˆจ๊ธฐ๊ณ  ๋ณ„๋„๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” getter/setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์™ธ๋ถ€์˜ ๊ฐ์ฒด๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.