Home > CS > 2024 > ๐Ÿ’พ [CS] DIP์˜ ์ •์˜์—์„œ ๋งํ•˜๋Š” '์ถ”์ƒํ™”๋œ ๊ฒƒ'๊ณผ '์ถ”์ƒํ™”'์˜ ๊ฐœ๋…์˜ ์ฐจ์ด์ .

๐Ÿ’พ [CS] DIP์˜ ์ •์˜์—์„œ ๋งํ•˜๋Š” '์ถ”์ƒํ™”๋œ ๊ฒƒ'๊ณผ '์ถ”์ƒํ™”'์˜ ๊ฐœ๋…์˜ ์ฐจ์ด์ .
CS

โ€œ๐Ÿ’พ [CS] DIP์˜ ์ •์˜์—์„œ ๋งํ•˜๋Š” โ€˜์ถ”์ƒํ™”๋œ ๊ฒƒโ€™๊ณผ โ€˜์ถ”์ƒํ™”โ€™์˜ ๊ฐœ๋…์˜ ์ฐจ์ด์ .โ€

  • DIP(Dependency Inversion Principle) ์—์„œ ๋งํ•˜๋Š” โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ โ€œ์ถ”์ƒํ™”โ€ ๊ฐœ๋…์€ ์„œ๋กœ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๊ฐœ๋…์ด์ง€๋งŒ, ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๊ฐ•์กฐ์ ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ DIP์—์„œ ๋งํ•˜๋Š” โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€

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

๐Ÿ™‹โ€โ™‚๏ธ DIP์˜ ์ •์˜์—์„œ ๋งํ•˜๋Š” โ€˜์ถ”์ƒํ™”๋œ ๊ฒƒโ€™์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?
๐Ÿ™‹โ€โ™‚๏ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ์˜ ๋ชจ๋“ˆ
๐Ÿ™‹โ€โ™‚๏ธ ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ ˆ๊ณ  ๋ธ”๋ก์— ๋น„์œ ํ•ด๋ณด๋ฉด?!
๐Ÿ™‹โ€โ™‚๏ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Business Logic)์ด๋ž€?

์˜ˆ์‹œ

// "์ถ”์ƒํ™”๋œ ๊ฒƒ"์ธ ์ธํ„ฐํŽ˜์ด์Šค
interface NotificationService {
    void sendNotification(String message);
}
  • ์œ„์˜ NotificationService ์ธํ„ฐํŽ˜์ด์Šค๋Š” DIP์˜ ๋ฌธ๋งฅ์—์„œ ๋งํ•˜๋Š” โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€์ž…๋‹ˆ๋‹ค.
  • ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ๊ณผ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ด ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ผ๋ฐ˜์ ์ธ โ€œ์ถ”์ƒํ™”โ€ ๊ฐœ๋….

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

์˜ˆ์‹œ.

abstract class Shape {
    abstract void draw();
}
  • ์œ„์˜ Shape ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ์ถ”์ƒํ™”์˜ ์˜ˆ๋กœ, ๋‹ค์–‘ํ•œ ๊ตฌ์ฒด์ ์ธ ๋„ํ˜•(์›, ์‚ฌ๊ฐํ˜• ๋“ฑ)์˜ ์„ธ๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ถ”๊ณ  draw()๋ผ๋Š” ๊ณตํ†ต๋œ ๋™์ž‘์„ ์ •์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ฐจ์ด์ .

  • DIP์—์„œ์˜ โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€
    • DIP์—์„œ ๋งํ•˜๋Š” โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€์€ ๊ตฌํ˜„์ด ์•„๋‹Œ ๊ณ„์•ฝ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
      • ์ด ๊ณ„์•ฝ์— ์˜์กดํ•จ์œผ๋กœ์จ ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ๊ณผ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.
    • ์ฆ‰, ๊ตฌํ˜„์ด ์•„๋‹Œ, ์ถ”์ƒ์ ์ธ ๊ณ„์•ฝ์— ์˜์กดํ•จ์œผ๋กœ์จ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ์—ญ์ „์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ โ€œ์ถ”์ƒํ™”โ€
    • ์ผ๋ฐ˜์ ์ธ โ€œ์ถ”์ƒํ™”โ€ ๋Š” ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐœ๋…์œผ๋กœ, ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๊ฐ์ถ”๊ณ  ๋ณธ์งˆ์ ์ธ ๊ฐœ๋…๋งŒ ๋“œ๋Ÿฌ๋‚ด๋Š” ์„ค๊ณ„ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
      • ์ถ”์ƒ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ณต์žกํ•œ ๋กœ์ง์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๊ณตํ†ต์ 

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

5๏ธโƒฃ ๊ฒฐ๋ก 

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

๊ฒฐ๊ตญ, DIP์—์„œ ๋งํ•˜๋Š” โ€œ์ถ”์ƒํ™”๋œ ๊ฒƒโ€์€ ์ผ๋ฐ˜์ ์ธ โ€œ์ถ”์ƒํ™”โ€์˜ ์ธก์ •ํ•œ ์ ์šฉ ์‚ฌ๋ก€๋ผ๊ณ  ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
DIP๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.