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

* ์ธํ”„๋Ÿฐ '๊น€์˜ํ•œ'๋‹˜์˜ ์Šคํ”„๋ง ๊ฐ•์ขŒ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž„์„ ๋ฐํž˜

1. ์ด์•ผ๊ธฐ - ์ž๋ฐ” ์ง„์˜์˜ ์ถ”์šด ๊ฒจ์šธ๊ณผ ์Šคํ”„๋ง์˜ ํƒ„์ƒ

EJB (Enterprise Java Beans) 

-> ์Šคํ”„๋ง / ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(->JPA) ๋งŒ๋“ฆ


2. ์Šคํ”„๋ง์ด๋ž€? 

์Šคํ”„๋ง ์ƒํƒœ๊ณ„

[ํ•„์ˆ˜]

* ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

- ํ•ต์‹ฌ ๊ธฐ์ˆ  : ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ, AOP, ์ด๋ฒคํŠธ, ๊ธฐํƒ€

- ์›น ๊ธฐ์ˆ  : ์Šคํ”„๋ง MVC, ์Šคํ”„๋ง WebFlux

- ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ  : ํŠธ๋žœ์žญ์…˜, JDBC, ORM ์ง€์›, XML ์ง€์›

- ๊ธฐ์ˆ  ํ†ตํ•ฉ : ์บ์‹œ, ์ด๋ฉ”์ผ, ์›๊ฒฉ์ ‘๊ทผ, ์Šค์ผ€์ค„๋ง

- ํ…Œ์ŠคํŠธ : ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์›

- ์–ธ์–ด : ์ฝ”ํ‹€๋ฆฐ, ๊ทธ๋ฃจ๋น„

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

 

* ์Šคํ”„๋ง ๋ถ€ํŠธ

- ์Šคํ”„๋ง์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์› (๊ธฐ๋ณธ)

- ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‰ฝ๊ฒŒ ์ƒ์„ฑ

- Tomcat ๊ฐ™์€ ์›น์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋จ

- ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ ์ œ๊ณต

- ์Šคํ”„๋ง๊ณผ 3rd path(์™ธ๋ถ€)๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ๊ตฌ์„ฑ

- ๋ฉ”ํŠธ๋ฆญ, ์ƒํƒœ ํ™•์ธ, ์™ธ๋ถ€ ๊ตฌ์„ฑ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ๊ธฐ๋Šฅ ์ œ๊ณต (๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ)

- ๊ด€๋ก€์— ์˜ํ•œ ๊ฐ„๊ฒฐํ•œ ์„ค์ • (๋””ํดํŠธ ์„ค์ •, ๋ฉ”๋‰ด์–ผ) -> ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ customizing

 

[์„ ํƒ]

- ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ : DB CRUD ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ

- ์Šคํ”„๋ง ์„ธ์…˜ : ์„ธ์…˜ ๊ธฐ๋Šฅ ํŽธ๋ฆฌ

- ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ : ๋ณด์•ˆ

- ์Šคํ”„๋ง Rest Docs : API ๋ฌธ์„œ ํŽธ๋ฆฌํ•˜๊ฒŒํ•ด์ฃผ๋Š”๊ฒƒ

- ์Šคํ”„๋ง ๋ฐฐ์น˜ : ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์น˜ ์ž‘์—… (์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ค‘ ๋ช‡๊ฑด ํผ์˜ฌ๋ ค์„œ ์ €์žฅ ๋ฐ˜๋ณต)

- ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ : ํด๋ผ์šฐ๋“œ ํŠนํ™”๋œ ๊ธฐ์ˆ 

 

 

* ์Šคํ”„๋ง ํ•ต์‹ฌ ๊ฐœ๋…

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


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

๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์ง• : https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

1) ์ถ”์ƒํ™”

2) ์บก์Šํ™”

3) ์ƒ์†

4) ๋‹คํ˜•์„ฑ

 

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

- ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ น์–ด์˜ ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋‹จ์œ„ = ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ

- ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ˜‘๋ ฅ)

- ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋œ๋‹ค.

 

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

-> ๋ ˆ๊ณ  ๋ธ”๋Ÿญ ์กฐ๋ฆฝํ•˜๋“ฏ์ด

-> ํ‚ค๋ณด๋“œ ๋งˆ์šฐ์Šค ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด

-> ์ปดํ“จํ„ฐ ๋ถ€ํ’ˆ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด

-> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

 

๋‹คํ˜•์„ฑ

๋‹คํ˜•์„ฑ์˜ ์‹ค์„ธ๊ณ„ ๋น„์œ 

- ์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„

ex1)

ex2)

- ์ž๋™์ฐจ์˜ ์—ญํ•  / ์ž๋™์ฐจ ๊ตฌํ˜„ ๊ตฌ๋ถ„

- ์ƒˆ๋กœ์šด ์ž๋™์ฐจ๊ฐ€ ๋‚˜์™€๋„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์Œ

 

[์žฅ์ ]

> ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

> ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

> ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

> ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

 

์ž๋ฐ”์—์„œ๋Š” ์–ด๋–ป๊ฒŒ?

- ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉ 

  ์—ญํ•  = ์ธํ„ฐํŽ˜์ด์Šค

  ๊ตฌํ˜„ = ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค (๊ตฌํ˜„ ๊ฐ์ฒด)

- ๊ฐ์ฒด ์„ค๊ณ„์‹œ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ๋จผ์ € ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

    = ์ธํ„ฐํŽ˜์ด์Šค(์—ญํ• )๊ฐ€ ์ค‘์š”! 

 

'๊ฐ์ฒด์˜ ํ˜‘๋ ฅ' ๊ด€๊ณ„๋ฅผ ๋จผ์ € ์ƒ๊ฐ

- ํด๋ผ์ด์–ธํŠธ = ์š”์ฒญ / ์„œ๋ฒ„ = ์‘๋‹ต

- ์ˆ˜ ๋งŽ์€ ๊ฐ์ฒดํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์„œ๋ฒ„๋Š” ์„œ๋กœ ํ˜‘๋ ฅํ•˜๋Š” ๊ด€๊ณ„

 

์ž๋ฐ” ์–ธ์–ด๊ฐ€ ๋‹คํ˜•์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€?

์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) : ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ 

์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) : ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉ

 

ex) ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ๋ฉค๋ฒ„์„œ๋น„์Šค์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๊ฐ€ ๋ญ”์ง€์—๋”ฐ๋ผ ๊ฐ ํ•จ์ˆ˜์— ํฌํ•จ๋œ ํŠน์ •ํ•จ์ˆ˜(ex.save)๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹

ํด๋ผ์ด์–ธํŠธ(๋ฉค๋ฒ„์„œ๋น„์Šค)๊ฐ€ ์„œ๋ฒ„(๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ)๋ฅผ ์˜์กดํ•  ๋•Œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„œ๋ฒ„ ํ˜ธ์ถœ๊ฐ€๋Šฅ

 

ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ

 

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

- ๋‹คํ˜•์„ฑ์ด ๊ฐ€์žฅ ์ค‘์š”

- ์Šคํ”„๋ง์€ ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ด์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ

- ์Šคํ”„๋ง์—์„œ ์ œ์–ด์˜ ์—ญ์ „(Ioc), ์˜์กด๊ด€๊ณ„์ฃผ์ž…(DI)์€ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด์„œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›


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

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

2) OCP : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open/closed Principle)

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

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

5) DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)

 

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

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

- ํ•˜๋‚˜์˜ ์ฑ…์ž„ = ๋ชจํ˜ธํ•˜๊ธดํ•จ (ํด์ˆ˜๋„ ์ž‘์„์ˆ˜๋„, ๋ฌธ๋งฅ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)

- ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ -> ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ (UI ๋ณ€๊ฒฝ, ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ ๋ถ„๋ฆฌ)

 

2) OCP : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open/closed Principle) **

- ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผํ•œ๋‹ค.

- ์ฝ”๋“œ์— ๋ณ€๊ฒฝ์—†์ด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค -> ๋‹คํ˜•์„ฑ

- ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค! (๋ฉค๋ฒ„ ์„œ๋น„์Šค)

- ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค (= ์Šคํ”„๋ง์˜ ์—ญํ• )

 

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

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

- ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ, ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์›์น™, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋Š” ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์›์น™์ด ํ•„์š”ํ•˜๋‹ค.

- ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ๋Š” ์ด์•ผ๊ธฐ

- ex) ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์•…์…€์€ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ / ๋’ค๋กœ ๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด LSP์œ„๋ฐ˜, ๋Š๋ฆฌ๋”๋ผ๋„ ์•ž์œผ๋กœ ๊ฐ€์•ผํ•จ.

 

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

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

- ex) ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค - ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค  / ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ

         ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ - ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ / ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ ๋ถ„๋ฆฌ

         ->  ๋ถ„๋ฆฌํ•˜๋ฉด ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ๋ณ€ํ•ด๋„ ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ

- ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ  ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง

 

5) DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)**

- ์˜์กด์„ฑ ์ฃผ์ž… -> ์ถ”์ƒํ™”์— ์˜์กด O ๊ตฌ์ฒดํ™”์— ์˜์กด X (์›์น™)

- ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป!

- ์—ญํ• ์— ์˜์กดํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋œป! (๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ)

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

   ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๋ฉด ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

 

- ๊ทธ๋Ÿฐ๋ฐ OCP์—์„œ ์„ค๋ช…ํ•œ ๋ฉค๋ฒ„์„œ๋น„์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ, ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค.

- ๋ฉค๋ฒ„์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒ 

MemberRepository m = new MemoryMemberRepository();

-> ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌrepo ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ๋ฉค๋ฒ„repo ๊นŒ์ง€ ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ

     = ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค

     = ๋ฉค๋ฒ„ ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ (๋ฉค๋ฒ„์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค(๋ฉ”๋ชจ๋ฆฌ๋ฉค๋ฒ„๋ ˆํฌ) ์„ ํƒ/์˜์กด)

-> DIP ์œ„๋ฐ˜ (์ถ”์ƒํ™”์—๋งŒ ์˜์กดํ•ด์•ผํ•˜๋Š”๋ฐ ๊ตฌ์ฒดํ™”๊นŒ์ง€ ์˜์กด)

-> ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•˜๋ผ๋Š” ๊ฑฐ์•ผ?!

-> ๋ฐฉ๋ฒ•์ด ์žˆ์Œ

 

[์ •๋ฆฌ]

- ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ = ๋‹คํ˜•์„ฑ

BUT
- ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์—†๋‹ค.

- ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.

- ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” OCP / DIP ๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.

= WE NEED MORE!


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

๋‹ค์‹œ ์Šคํ”„๋ง์œผ๋กœ
- ์Šคํ”„๋ง์€

> DI (dependency injection, ์˜์กด๊ด€๊ณ„, ์˜์กด์„ฑ ์ฃผ์ž…)  

> DI ์ปจํ…Œ์ด๋„ˆ ์ œ๊ณต

์œผ๋กœ OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›

 

- ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ ํ™•์žฅ

- ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ต์ฒดํ•˜๋“ฏ์ด ๊ฐœ๋ฐœ

 

- ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„์„ ๋‚˜์ค‘์— ์ •ํ•˜๋ฉด, ๊ตฌํ˜„ ๊ธฐ์ˆ ์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์–ด์„œ ๋ณ€๊ฒฝ์˜ ๋ฒ”์œ„ ์ž‘๊ณ  ์œ ์—ฐํ•ด์ง

 

 

์‹ค๋ฌด๊ณ ๋ฏผ?

๋ฌด๋ถ„๋ณ„ ๋‚จ๋ฐœ -> ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒ (๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด์•ผํ•จ)

                   -> ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์œผ๋ฉด ๊ตฌ์ฒด ํด๋ž˜์Šค ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์Œ! (๋‚˜์ค‘์— ๋ฆฌํŒฉํ„ฐ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…)

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ