STUDY๐Ÿ„

[Spring ๊ธฐ๋ณธ] 1. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

์ด๋ฆฌ์ญ 2025. 3. 19. 18:55

์•ˆ๋…•ํ•˜์„ธ์š”!

HTTP๋ฅผ ๋‹ค ๋๋‚ด๊ณ  Spring์œผ๋กœ ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค!

๋ณธ๊ฒฉ์ ์œผ๋กœ ์Šคํ”„๋ง์„ ๋ฐฐ์šฐ๋ ค๋ฉด ์Šคํ”„๋ง์˜ ๊ฐœ๋…์ ์ธ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์•Œ์•„์•ผ๊ฒ ์ฃ ?

๊ณ ๊ณ !


1. ์Šคํ”„๋ง์ด๋ž€? (์Šคํ”„๋ง ์ƒํƒœ๊ณ„)

1-1. ์Šคํ”„๋ง์˜ ๊ตฌ์„ฑ

์Šคํ”„๋ง์€ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์— ์†ํ•˜๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์Šคํ”„๋ง ๋ถ€ํŠธ, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์ธ ๊ธฐ์ˆ ์— ์†ํ•˜๋Š” ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ, ์Šคํ”„๋ง ์„ธ์…˜, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ, ์Šคํ”„๋ง Rest Docs, ์Šคํ”„๋ง ๋ฐฐ์น˜, ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ธ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋’ค์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ• ๊ฑฐ๊ตฌ์š”.

๋จผ์ € ์„ ํƒ์ ์ธ ๊ธฐ์ˆ ๋“ค๋ถ€ํ„ฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ๋ž€, CRUD ๋“ฑ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์›€์„ ์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ œ์ผ ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ์€ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์„ธ์…˜์ด๋ž€, ์„ธ์…˜ ๊ธฐ๋Šฅ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์›€์„ ์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง Rest Docs๋Š” API ๋ฌธ์„œํ™”๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง ๋ฐฐ์น˜๋Š” ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ์ˆ ์— ํŠนํ™”๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ ๋งŽ์€ ๊ธฐ์ˆ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

1-2. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

์‚ฌ์‹ค ์ด๊ฒŒ ์ œ์ผ ์ค‘์š”ํ• ๊ฑฐ์—์š”.

  • ํ•ต์‹ฌ ๊ธฐ์ˆ : ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ, AOP, ์ด๋ฒคํŠธ, ๊ธฐํƒ€
  • ์›น ๊ธฐ์ˆ : ์Šคํ”„๋ง MVC, ์Šคํ”„๋ง WebFlux
  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ : ํŠธ๋žœ์ ์…˜, JDBC, ORM ์ง€์›, XML ์ง€์›
  • ๊ธฐ์ˆ  ํ†ตํ•ฉ: ์บ์‹œ, ์ด๋ฉ”์ผ, ์›๊ฒฉ์ ‘๊ทผ, ์Šค์ผ€์ค„๋ง
  • ํ…Œ์ŠคํŠธ: ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์›
  • ์–ธ์–ด: ์ฝ”ํ‹€๋ฆฐ, ๊ทธ๋ฃจ๋น„

์ด๊ฒƒ๋“ค์„ ๋‹ค ํ•ฉํ•ด์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์—๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ์ˆ ๋“ค์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋ญ˜๊นŒ์š”?

๋˜ ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์žฅ์ ์€ ๋ญ˜๊นŒ์š”?

๊ทธ๊ฑด ๋ฐ‘์—์„œ ๋ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

1-3. ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ฐœ๋…๊ณผ ์žฅ์ 

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

์ตœ๊ทผ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋‹ค ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฅ์ ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์ „์—๋Š” Tomcat ๊นŒ๋Š” ๋“ฑ.. ๊ณผ์ •์ด ๊ต‰์žฅํžˆ ๋ณต์žกํ–ˆ์Šต๋‹ˆ๋‹ค.
      ์ง€๊ธˆ์€ ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ช‡ ์ค„ ์น˜๊ณ  ๋„์•~
  • Tomcat ๊ฐ™์€ ์›น ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๋„ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์ „์—๋Š” ์ด๊ฒƒ์ €๊ฒƒ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ต‰์žฅํžˆ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
      ์ง€๊ธˆ์€ springboot.ooostarter ๋“ฑ ์—ฌ๋Ÿฌ๊ฐœ ์•ˆ ๋•ก๊ฒจ์˜ค๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง๊ณผ 3rd party(์™ธ๋ถ€) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์ „๊ณผ ๋‹ฌ๋ฆฌ ์š”์ฆ˜์€ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์•Œ์•„์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋ฒ„์ „๋„ ๋‹ค ์ง์ ‘ ์ง€์ •ํ•ด์„œ ๋‹ค์šด๋กœ๋“œ ํ•ด์ค๋‹ˆ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ, ์ƒํƒœ ํ™•์ธ, ์™ธ๋ถ€ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์ค‘์š”ํ•œ๋ฐ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ก€์— ์˜ํ•œ ์„ค์ •์ด ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • ์˜›๋‚ ์— ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
      ์š”์ฆ˜์€ ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ๊ฐ„๊ฒฐํ•ด์กŒ๋Š”๋ฐ, ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์™ ๋งŒํ•œ ๊ฒƒ์€ ๋””ํดํŠธ ์„ค์ •์ด ๋ฉ”๋‰ด์–ผ์— ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ๋ณด๊ณ  ํ•„์š”ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ๊ด€๋ก€์— ๋”ฐ๋ผ ์„ค์ •ํ•˜๋ฉด ๋˜๊ณ , ์ผ๋ถ€๋Š” ์กฐ๊ธˆ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

1-4. ์Šคํ”„๋ง ๋‹จ์–ด?

์Šคํ”„๋ง์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ €, ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ  (ํ•ต์‹ฌ์ธ bean ๊ด€๋ฆฌ) ๋กœ๋„ ์‚ฌ์šฉ๋˜๊ณ , ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์Šคํ”„๋ง ๋ถ€ํŠธ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จํ•œ ์Šคํ”„๋ง ์ƒํƒœ๊ณ„๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

1-5. ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, ์ปจ์…‰

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, ์ปจ์…‰์€ ๋ญ˜๊นŒ์š”?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ณ , DB ์ ‘๊ทผ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ผ๊นŒ์š”?

์ „์ž ์ •๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ์ผ๊นŒ์š”?

์›น ์„œ๋ฒ„๋„ ์ž๋™์œผ๋กœ ๋„์›Œ์ค„๊นŒ์š”?

ํด๋ผ์šฐ๋“œ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ผ๊นŒ์š”?

 

๋‹ค ํ•ต์‹ฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์ผ ๋ฟ์ด์ง€...

 

์Šคํ”„๋ง์˜ ์ง„์งœ ํ•ต์‹ฌ์€ ์ด๋ ‡๊ฒŒ 4๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

- ์Šคํ”„๋ง์€ ์ž๋ฐ” ์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ
- ์ž๋ฐ” ์–ธ์–ด์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด
- ์Šคํ”„๋ง์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง„ ๊ฐ•๋ ฅํ•œ ํŠน์ง•์„ ์‚ด๋ ค๋‚ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
- ์Šคํ”„๋ง์€ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

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

์šฐ์„  ๊ฐ์ฒด ์ง€ํ–ฅ ํŠน์ง•์€ 4๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”์ƒํ™”
  • ์บก์Аํ™”
  • ์ƒ์†
  • ๋‹คํ˜•์„ฑ

ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ”์ง€ ์•Œ์•„์•ผ ๊ฒ ์ฃ ?

 

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ "๊ฐ์ฒด"๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ˜‘๋ ฅ)

๋˜ํ•œ, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

์œ ์—ฐํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค?

์ด๊ฒƒ์„ ๋‹คํ˜•์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


3. ๋‹คํ˜•์„ฑ

3-1. ๋‹คํ˜•์„ฑ์˜ ์‹ค์„ธ๊ณ„ ๋น„์œ 

  • ์‹ค์„ธ๊ณ„์™€ ๊ฐ์ฒด ์ง€ํ–ฅ์„ 1:1๋กœ ๋งค์นญํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์‹ค์„ธ๊ณ„์˜ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    • ์—ญํ• : ์ธํ„ฐํŽ˜์ด์Šค
      ๊ตฌํ˜„: ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด

์˜ˆ์‹œ๋ฅผ ํ•œ ๋ฒˆ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šด์ „์ž - ์ž๋™์ฐจ

ํฌ๊ฒŒ ์šด์ „์ž ์—ญํ• ๊ณผ ์ž๋™์ฐจ ์—ญํ• ์ด ์žˆ๊ณ , ์ž๋™์ฐจ ์—ญํ•  ์•ˆ์— ์ž๋™์ฐจ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋™์ฐจ ์—ญํ• ์„ 3๊ฐœ์˜ ๋‹ค๋ฅธ ์ž๋™์ฐจ๊ฐ€ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์šด์ „์ž๋Š” K3๋ฅผ ํƒ€๋‹ค๊ฐ€ ์•„๋ฐ˜๋–ผ๋กœ ์ฐจ๋ฅผ ๋ฐ”๊พธ๋ฉด ์šด์ „ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ •๋‹ต์€ Yes!

์™œ๋ƒํ•˜๋ฉด ์ž๋™์ฐจ ์—ญํ• ์— ๋Œ€ํ•œ ๊ตฌํ˜„๋งŒ ๋ฐ”๋€Œ์—ˆ์„ ๋ฟ์ด๋‹ˆ๊นŒ์ฃ ~

 

๊ทธ๋ž˜์„œ ์ž๋™์ฐจ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์šด์ „์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค,

์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

์ด์œ ๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

์ž๋™์ฐจ ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค ๋”ฐ๋ผ์„œ ์ž๋™์ฐจ๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šด์ „์ž๋Š” ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์•Œ๊ณ  ์—ญํ• ์— ๋Œ€ํ•ด์„œ๋งŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

 

๊ทผ๋ฐ ์ค‘์š”ํ•œ๊ฑด ์ž๋™์ฐจ ์—ญํ• ์„ ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์€ ์šด์ „์ž๋ฅผ ์œ„ํ•ด์„œ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šด์ „์ž๋ฅผ ํด๋ผ์ด์–ธํŠธ๋ผ๊ณ  ์ง€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋™์ฐจ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋˜์ฃ ?

๊ทธ๋Ÿฌ๋ฉด ๊ตฌํ˜„์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ”๋€Œ๋”๋ผ๋„ ์ž๋™์ฐจ ์—ญํ• ๋งŒ ์ œ๋Œ€๋กœ ํ•˜๋ฉด ์šด์ „์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฑด ๊ตฌํ˜„์œผ๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„ํ–ˆ๊ธฐ์— ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ ๊ณต์—ฐ ๋ฌด๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์•ˆ์—๋Š” ๋กœ๋ฏธ์˜ค๋ผ๋Š” ์—ญํ• ๊ณผ ์ค„๋ฆฌ์—ฃ์ด๋ž€ ์—ญํ• ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋ฏธ์˜ค๋ž€ ์—ญํ• ์„ ๋ณ€์šฐ์„์ด ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์„œ๊ฐ•์ค€์ด ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์‹œ์›”์ด ๋ฐ๋ ค์™€์„œ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ .

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ค„๋ฆฌ์—ฃ์ด๋ž€ ์—ญํ• ๋„ ๊น€์œ ์ •์ด ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ•œ์†Œํฌ๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋‹จ์—ญ๋ฐฐ์šฐ๊ฐ€ ์™€์„œ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ž˜ ๋ชปํ•˜๋Š” ์ œ๊ฐ€ ์™€์„œ ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ .

 

๋ญ๊ฐ€ ๋๋“  ๋ฐฐ์šฐ๋Š” ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์—ฐ์€ ์ž˜ ๋ผ์•ผ ํ•˜๋‹ˆ๊นŒ!

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋กœ๋ฏธ์˜ค๋ฅผ ํด๋ผ์ด์–ธํŠธ, ์ค„๋ฆฌ์—ฃ์„ ์„œ๋ฒ„๋ผ๊ณ  ํ•˜๋ฉด ์ค„๋ฆฌ์—ฃ(์„œ๋ฒ„)์ด ๋ฐ”๋€๋‹ค๊ณ  ๋กœ๋ฏธ์˜ค(ํด๋ผ์ด์–ธํŠธ)์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ฃ .

์ด๊ฒƒ์ด ๋‹คํ˜•์„ฑ ์ž…๋‹ˆ๋‹ค.

 

3-2. ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ - ์žฅ์ 

์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉด ์„ธ์ƒ์ด ๋‹จ์ˆœํ•ด์ง€๊ณ , ์œ ์—ฐํ•ด์ง€๋ฉฐ ๋ณ€๊ฒฝ๋„ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.

<์žฅ์ >

- ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

ํ•ต์‹ฌ์€ ํด๋ผ์ด์–ธํŠธ!

 

3-3. ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ - ์ž๋ฐ” ์–ธ์–ด

  • ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์—ญํ•  = ์ธํ„ฐํŽ˜์ด์Šค
    • ๊ตฌํ˜„ = ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด
  • ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํž™๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ์„ค๊ณ„์‹œ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ๋จผ์ € ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • ํ•ต์‹ฌ์€ ๊ตฌํ˜„(๊ฐ์ฒด)๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค(์—ญํ• )๊ฐ€ ๋จผ์ €!
    • ์ˆ˜๋งŽ์€ ๊ฐ์ฒด ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์„œ๋ฒ„๋Š” ์„œ๋กœ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค!

 

3-4. ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ

์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋– ์˜ฌ๋ ค๋ด…์‹œ๋‹ค.

๋– ์˜ฌ๋ฆฌ๊ธฐ ์ „์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋ญ”์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณผ๊นŒ์š”?

  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ: ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ
  • ์˜ค๋ฒ„๋กœ๋”ฉ: ๋ฉ”์„œ๋“œ๋ฅผ ๋งŽ์ด ์ดˆ๊ณผ ์ •์˜ํ•˜์—ฌ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ

์ด ๊ทธ๋ฆผ์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ ์žฅ์ ์„ ์–˜๊ธฐํ•˜์ž๋ฉด ๋‹คํ˜•์„ฑ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฐ๋ก  ํด๋ž˜์Šค ์ƒ์† ๊ด€๊ณ„๋„ ๋‹คํ˜•์„ฑ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ๋Š” MemberRepository๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

๋‹คํ˜•์„ฑ์ด๊ธฐ์— ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ํ• ๋‹น ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

public class MemberService {
  private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
  private MemberRepository memberRepository = new JdbcMemberRepository();
}

MemoryMemberRepository์™€ JdbcMemberRepository๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ํด๋ž˜์Šค์ด์ง€๋งŒ, MemberRepository๋ผ๋Š” ๋™์ผํ•œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์„ ๊ฐ–๋„๋ก ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๋ถ€๋ชจ์™€ ์ „ํ˜€ ๊ด€๊ณ„ ์—†๋Š” ํด๋ž˜์Šค๋Š” ํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

MemberService๋ผ๋Š” ํด๋ผ์ด์–ธํŠธ์— MemberRepository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— MemoryMemberRepository๋ฅผ ๋„ฃ์œผ๋ฉด 2๋ฒˆ์งธ ๊ทธ๋ฆผ์ด ๋˜๋Š” ๊ฑฐ๊ณ , JdbcMemberRepository๋ฅผ ๋„ฃ์œผ๋ฉด 3๋ฒˆ์งธ ๊ทธ๋ฆผ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

3-5. ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ - ํ•œ๊ณ„

  • ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค) ์ž์ฒด๊ฐ€ ๋ณ€ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ๋ชจ๋‘์— ํฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™์ฐจ๋ฅผ ๋น„ํ–‰๊ธฐ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด? ๋Œ€๋ณธ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด? USB ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด? ๋‹ค ๋œฏ์–ด๊ณ ์ณ์•ผํ•˜๊ณ , ๊ธฐ์กด ๊ฒƒ์€ ๋” ์ด์ƒ ๋ชป ์”๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!!\
    • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊นจ์ง€๋ฉด ๋..ใ„ทใ„ท

 

3-6. ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ - ์ •๋ฆฌ

  • ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ํ˜‘๋ ฅ์ด๋ผ๋Š” ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!
  • ์‹ค์„ธ๊ณ„์˜ ์—ญํ• ๊ณผ ๊ตฌํ˜„์ด๋ผ๋Š” ํŽธ๋ฆฌํ•œ ์ปจ์…‰์„ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด ์„ธ์ƒ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

3-7. ์Šคํ”„๋ง๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ

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

 

์Šคํ”„๋ง์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‹คํ˜•์„ฑ ์™ธ์— ๋˜ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ SOLID!!


4. ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID)

ํด๋ฆฐ์ฝ”๋“œ๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™์„ ์ •๋ฆฌ

์ด๊ฑฐ ๋˜๊ฒŒ ๋ฉด์ ‘์—๋„ ์ž˜ ๋‚˜์™€์š”!! ์ค‘์š”!!

SOLID๋Š” ์ด 5๊ฐ€์ง€ ์›์น™์˜ ์•ž๊ธ€์ž๋ฅผ ๋”ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • SRP: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (single responsibility principle)
  • OCP: ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open/closed principle)
  • LSP: ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov substitution principle)
  • ISP: ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface segregation principle)
  • DIP: ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency inversion principle)

 

4-1. SRP ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

Single responsibility principle

SRP์˜ ์ •์˜๋Š” "ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค." ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ด ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด๋ผ๋Š” ๊ฒƒ์€ ์ฐธ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ฑ…์ž„์ด ํด ์ˆ˜ ์žˆ๊ณ  ์ž‘์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋ฌธ๋งฅ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด ๋ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด SRP ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, UI ๋ณ€๊ฒฝ๊ณผ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํ•˜๋‚˜ ๋ฐ”๊ฟ€ ๋Œ€ ์ด๊ฒƒ ์ €๊ฒƒ ๋‹ค ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋ฉด ์ž˜ ๋ชป ์ง  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

4-2. OCP ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (์ค‘์š”!!)

Open/closed principle

OCP์˜ ์ •์˜๋Š” "์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค." ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ ??

๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š”๋ฐ (๊ธฐ๋Šฅ ์ถ”๊ฐ€)

์ฝ”๋“œ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class MemberService {
	private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
	//private MemberRepository memberRepository = new MemoryMemberRepository(); //์ฝ”๋“œ ๋ณ€๊ฒฝ
	private MemberRepository memberRepository = new JdbcMemberRepository();
}

MemberRepository๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ Memory์—์„œ Jdbc๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์œ„ ์ƒํ™ฉ์€ MemberService ๋‚ด์—์„œ ์ฃผ์ž…ํ•  MemberRepository์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์˜€๋Š”๋ฐ ์ด๋Š” OCP ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.

 

OCP๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ฐ‘์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ MemberService๊ฐ€ MemberRepository์— ์ง์ ‘์ ์ธ ๊ตฌํ˜„์ฒด๋ฅผ new๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

public interface MemberRepository {
    void save(Member member);
}

public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }
}

public class JdbcMemberRepository implements MemberRepository {
    @Override
    public void save(Member member) {
        String sql = "insert into member(member_id, name) values(?, ?)";
        Connection con = con = getConnection();
        PreparedStatement pstmt = con.prepareStatement(sql);
        ...
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” MemberRepository๋ผ๋Š” ์ถ”์ƒํ™” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌ์ฒดํ™”๋œ ๊ตฌํ˜„์ฒด์ธ MemoryMemberRepository์™€ JdbcMemberRepsitory๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

public class MemberService {

    private MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” MemberService๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

MemberService memberService = new MemberService(new JdbcMemberRepository());
memberService.save(...);

Memory ๊ธฐ๋ฐ˜์˜ MemberRepository๋ฅผ ์‚ฌ์šฉํ•˜๋˜ MemberService๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ MemoryMemberRepository๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ JdbcMemberRepository๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” OCP๋ฅผ ์ง€์ผœ์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

4-3. LSP ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

Liskov substitution principle

LSP์˜ ์ •์˜๋Š” "ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค." ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•ด๋‚ด์•ผ ํ• ์ง€ ์ •ํ•ด์ ธ ์žˆ๊ณ , ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •ํ•œ ๊ทœ์•ฝ์„ ๋ฌด์กฐ๊ฑด ์ง€์ผœ์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—‘์…€์€ '์•ž์œผ๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค'ํ•˜๋Š” ๊ทœ์•ฝ์ด ์ •ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทผ๋ฐ ์ด ์—‘์…€์˜ ๊ธฐ๋Šฅ์„ ๋’ค๋กœ ๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•ด๋„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ, ์ปดํŒŒ์ผ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ๊ธฐ์กด์— ์žˆ๋Š” ๊ทœ์•ฝ์„ ์œ„๋ฐ˜ํ•˜๋ฉด LSP ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—‘์…€์˜ ๊ธฐ๋Šฅ์„ ๋А๋ฆฌ๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด ์•ž์œผ๋กœ ๊ฐ€๊ฒŒ ํ•ด์•ผ LSP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

4-4. ISP ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

Interface segregation principle

ISP์˜ ์ •์˜๋Š” "ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค" ์ž…๋‹ˆ๋‹ค.

์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ๋„ ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ์™€ ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•ด์„œ ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ๋ณ€ํ•ด๋„ ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ธฐ๋Šฅ์ด ๋งŽ์€ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

 

 

4-5. DIP ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (์ค‘์š”!!)

Dependency inversion principle

"์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค." ๋ผ๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ์–˜๊ธฐํ•ด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ถ”์ƒ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๋ผ๋ณด์ง€ ๋ง๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ฐ”๋ผ๋ณด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

์œ„์˜ ์˜ˆ์ œ๋กœ ๋”ฐ์ง€๋ฉด MemberService๊ฐ€ MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ฐ”๋ผ๋ณด๊ณ  MemoryMemberRepository์™€ JdbcMemberRepository์— ๋Œ€ํ•ด์„œ๋Š” ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

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

 

์ฝ”๋“œ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class MemberService {
	private MemberRepository memberRepository = new JdbcMemberRepository();
}

 

MemberRepository๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ Memory์—์„œ Jdbc๋กœ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์œ„ ์ƒํ™ฉ์€ MemberService ๋‚ด์—์„œ ์„ธ๋ถ€ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” JdbcMemberRepository๋ฅผ ์˜์กดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— DIP ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.

 

DIP๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ฐ‘์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

public interface MemberRepository {
    void save(Member member);
}

public class JdbcMemberRepository implements MemberRepository {
    @Override
    public void save(Member member) {
        // ... ์ €์žฅ ๋กœ์ง
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” MemberRepository๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

public class MemberService {

    private MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” MemberService๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

MemberService memberService = new MemberService(new JdbcMemberRepository());
memberService.save(...);

์œ„์˜ ์ฝ”๋“œ๋Š” MemberService๋ฅผ ์„ ์–ธํ•  ๋•Œ์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

MemberService๊ฐ€ ์„ธ๋ถ€์ ์ธ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” JdbcMemberRepository์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค์ธ MemberRepository๋งŒ ์˜์กดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— DIP๋ฅผ ์ง€์ผฐ์Šต๋‹ˆ๋‹ค.


5. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

5-1. ๋‹ค์‹œ ์Šคํ”„๋ง์œผ๋กœ

์Šคํ”„๋ง ์ด์•ผ๊ธฐ์— ์™œ ๊ฐ์ฒด ์ง€ํ–ฅ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”?

์Šคํ”„๋ง์€ ๋‹ค์Œ ๊ธฐ์ˆ ๋กœ ๋‹คํ˜•์„ฑ๊ณผ OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • DI (Dependency Injection): ์˜์กด๊ด€๊ณ„, ์˜์กด์„ฑ ์ฃผ์ž…
  • DI ์ปจํ…Œ์ด๋„ˆ ์ œ๊ณต
    • ์ž๋ฐ” ๊ฐ์ฒด๋“ค์„ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋„ฃ์–ด๋†“๊ณ  ์ด ์•ˆ์—์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์„ ํ™œ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ต์ฒดํ•˜๋“ฏ์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜›๋‚ ์— ์Šคํ”„๋ง ์—†๋˜ ์‹œ์ ˆ์— ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์„ ํ•˜๋ ค๊ณ  OCP, DIP ์›์น™์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋„ˆ๋ฌด ํ•  ์ผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž๋ฐ”๋กœ OCP, DIP ์›์น™๋“ค์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ฉด ๊ฒฐ๊ตญ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋” ์ •ํ™•ํžˆ๋Š” DI ์ปจํ…Œ์ด๋„ˆ)


๋งˆ์ง€๋ง‰์œผ๋กœ...

๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฑด ๋ชจ๋“  ์„ค๊ณ„์—๋Š” ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค!

์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ด์•ผ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋‹ค!

 

๋‹ค์Œ ์„น์…˜๋ถ€ํ„ฐ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฝ”๋“œ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์•ˆ๋‡ฝ~~