์˜์กด์„ฑ๊ณผ ๊ฒฐํ•ฉ๋„์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•ด๋ณธ๋‹ค.

์˜์กด์„ฑ(Dependency)

  • A ๋ชจ๋“ˆ์ด ๋™์ž‘ํ•˜๋ ค๋ฉด B ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • OO์—์„œ ๋ชจ๋“ˆ == ํด๋ž˜์Šค
  • ํด๋ž˜์Šค A๊ฐ€ ํด๋ž˜์Šค B์— ์˜์กด

์˜์กด์„ฑ์ด ์žˆ์œผ๋ฉด ์ž˜๋ชป๋œ OO ์„ค๊ณ„๋‹ค? (code smell)

  • ์ž˜๋ชป๋œ ๋ง์ด๋‹ค.
  • ์˜์กด์„ฑ์ด ์žˆ์–ด์•ผ ์ข‹์€ ์„ค๊ณ„
  • ๊ฐ ํด๋ž˜์Šค์˜ ๋ชฉ์ ์ด ๋šœ๋ ทํ•˜๋‹ค๋Š” ๋ง
  • ์บก์Šํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ง
  • ํด๋ž˜์Šค ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ง
  • ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ์—†์• ๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ํ•จ์ˆ˜ํ•˜๋‚˜์— ์ž‘์„ฑํ•˜๋ฉด ๋จ

์™œ ์˜์กด์„ฑ์ด ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ• ๊นŒ?

  1. ๊ฒฐํ•ฉ๋„๋ผ๋Š” ์šฉ์–ด์™€ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉ
  2. ์šฉ์–ด ์ž์ฒด์˜ ์˜๋ฏธ๋ฅผ ์ƒ๋žตํ•ด์„œ ์ž˜๋ชป ์‚ฌ์šฉ

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

๊ฒฐํ•ฉ๋„(Coupling)

  • ๋‘ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ ๊ฐ„์— ์ƒํ˜ธ ์˜์กด์„ฑ ์ •๋„
    • ์ƒํ˜ธ ์ฐธ์กฐ
    • ๊ฐ๊ฐ์ด ๋…์ž ์ƒ์กด์ด ๋ถˆ๊ฐ€

OO์—์„œ ๋…ผํ•˜๋Š” ๊ฒฐํ•ฉ๋„

A๊ฐ€ B๋ฅผ ์˜์กดํ•˜๋Š” ์ƒํ™ฉ์—์„œ B๋ณ€๊ฒฝ์‹œ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

  1. A์˜ ๋‚ด๋ถ€๋ฅผ ๋ณ€๊ฒฝ์•ˆํ•ด๋„ ๋จ
    • A๊ฐ€ B์— ์˜์กดํ•˜๋‚˜ ์ •๋„๊ฐ€ ๋†’์ง€ ์•Š์Œ (A depends lightly on B)
    • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์Œ (loose coupling)
  2. A์˜ ๋‚ด๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
    • ์˜์กด๋„๊ฐ€ ๋†’์Œ (A depends heavily on B)
    • ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์Œ (tight coupling)

์ •๋ฆฌ: B ์ฝ”๋“œ ๋ณ€๊ฒฝ์‹œ, A ์ฝ”๋“œ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๋‹ค.

๋†’์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ‘œํ˜„๋“ค

  1. A์™€ B๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค. (A and B are coupled.)
    • โ€œ๊ฒฐํ•ฉโ€ ์ž์ฒด๋Š” ๋‚˜์œ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์ง€ ์•Š์Œ
    • โ€œ๊ฒฐํ•ฉ == ์˜์กดโ€์˜ ์˜๋ฏธ๋ฅผ ํ•„์—ฐ์ ์œผ๋กœ ๋‚ดํฌํ•˜๊ธฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ
      • ์˜์กด ์ž์ฒด๋„ ๋‚˜์œ ๊ฒƒ์ด ์•„๋‹˜
    • ๋†’์€ ๊ฒฐํ•ฉ๋„๋Š” ๋‚˜์œ ๊ฒƒ.
    • ํ•˜์ง€๋งŒ, ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ง๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํ†ต ๋†’์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ๋งํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  2. A๊ฐ€ B์— ์˜์กดํ•œ๋‹ค. (A depends on B.)
  3. A์™€ B์‚ฌ์ด์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค. (There is a dependency between A and B.)

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

  1. A๊ฐ€ B์— ์‹ฌํ•˜๊ฒŒ ์˜์กดํ•œ๋‹ค. (A depends heavily on B.)
  2. A์™€ B์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๋‹ค. (A and B are tightly coupled.)

๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ‘œํ˜„๋“ค

  1. A์™€ B๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. (A and B are decoupled.)

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

  1. A์™€ B์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค. (A and B are loosely coupled.)
  2. A๊ฐ€ B์— ๋ฏธ๋ฏธํ•˜๊ฒŒ ์˜์กดํ•œ๋‹ค. (A depends lightly on B.)

๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ํ‘œํ˜„๋“ค

  1. A์™€ B์˜ ๊ฒฐํ•ฉ๊ด€๊ณ„๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. (Decouple A and B.)
  2. A์™€ B์˜ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค. (Break dependencies between A and B.)

์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

  1. A์™€ B์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ธ๋‹ค. (Reduce coupling between A and B.)

์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)

  • ํด๋ž˜์Šค ๊ฐ„์— ์˜์กด์„ฑ์€ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, ์ด ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๊ฒŒ ์—ฎ์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ ์ข‹์ง€ ์•Š๋‹ค.
  • A๊ฐ€ B์— ์˜์กดํ•  ๋•Œ, B์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ A๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ข‹์ง€ ์•Š๋‹ค.
  • ๋ณดํ†ต ์ด๋Ÿฐ ๊ฒฝ์šฐ A๊ฐ€ B์— ์˜์กดํ•  ๋•Œ, B์ž์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ฆ‰, ์˜์กด์„ฑ์„ ์ž์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ด ์˜์กด์„ฑ ์ž์ฒด๋ฅผ ๋ฐ”๊นฅ์—์„œ ๋ฐ›์•„์˜ฌ ์ˆ˜๋Š” ์—†์„๊นŒ?
  • ๊ทธ๊ฒƒ์ด ์˜์กด์„ฑ ์ฃผ์ž…์ด๋‹ค.

DI ์šฉ์–ด ์ฃผ์˜

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์˜๋ฏธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)
  2. ์˜์กด์„ฑ ์ฃผ์ž… ์ปจํ…Œ์ด๋„ˆ (DI Container)
  3. ์˜์กด์„ฑ ์—ญ์ „ (Dependency Inversion)

์˜์กด์„ฑ ์ฃผ์ž… ์ข…๋ฅ˜

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…
  2. setter ์ฃผ์ž…
    • setter ํ•จ์ˆ˜ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹

setter ์ฃผ์ž…์˜ ๋ฌธ์ œ

  • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์—†์•จ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜..
  • ๊ฐœ์ฒด์˜ ์œ ํšจํ•œ ์ƒํƒœ์— ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐœ์ฒด๋Š” ์ƒ์„ฑ์‹œ ๋ถ€ํ„ฐ ์œ ํšจํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • setter๊ฐ€ ๋งˆ๊ตฌ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด? ์บก์Šํ™”๊ฐ€ ๊นจ์งˆ ์ˆ˜๋„..

์˜์กด์„ฑ ์ฃผ์ž…์˜ ๋ถˆํŽธํ•จ

  • ๋กœ๋ด‡์„ ๋งŒ๋“œ๋Š”๋ฐ, ๋จธ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•ด์ค˜์•ผ๋งŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค.
  • ์ฆ‰, ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋กœ๋ด‡() ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ  ์‹ถ์€๋ฐ,
  • ๋จธ๋ฆฌ๋Š” ๋ญ๊ณ , ๋‹ค๋ฆฌ๋Š” ๋ญ๊ณ  ์ด๋Ÿฐ์‹์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•˜๋‹ค.
  • ํ•˜๋‚˜์˜ ์™„์ œํ’ˆ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ์“ฐ๊ณ  ์‹ถ๋‹ค!

DI๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฒƒ๊ณผ ์žƒ์€ ๊ฒƒ

  • ์–ป์€ ๊ฒƒ
    • ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
    • Head์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ Robot์„ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์Œ
    • Head๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ์ด ํด๋ž˜์Šค๋งŒ ๋”ฐ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • ์žƒ์€ ๊ฒƒ
    • ํŽธ์˜์„ฑ - ๋กœ๋ด‡์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จธ๋ฆฌ๋„ ์•Œ์•„์•ผ ํ•จ
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์›๋ž˜ ์˜๋„๋ฅผ ์ž˜ ๋ณด์—ฌ์ฃผ๋Š” ํด๋ž˜์Šค
      • ๋จธ๋ฆฌ ๋„ฃ์„ ํ•„์š”์—†์ด ์™„์ œํ’ˆ์ด์•ผ~ ๋ผ๋Š” ์˜๋„๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์—†์Œ

์žฅ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค. ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์•ผ ํ•œ๋‹ค๋Š” ์ฃผ์žฅ์€ ์žˆ์„ ์ˆ˜ ์—†๋‹ค. ํ•œ ๋ฐฉ์‹์ด ๋ฌด์กฐ๊ฑด ์˜ณ๋‹ค๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค.

๋ณต์žกํ•œ ์‹œ์Šคํ…œ์—์„œ ๋ฌธ์ œ์ธ ์ปคํ”Œ๋ง

  • ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ์—์„œ๋Š” DI์˜ ์‹ค์ต์ด ํฌ์ง€ ์•Š๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹ค๋ฅด๋‹ค.

๋””์ปคํ”Œ๋ง์€ ์œ ์—ฐ์„ฑ/์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„

  • ์ถ”์ƒํ™”๋Š” ์œ ์—ฐ์„ฑ/์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„
  • ๋””์ปคํ”Œ๋ง๋„ ๋งˆ์ฐฌ๊ฐ€์ง€
  • ๋ฏธ๋ž˜์˜ ๋ณ€ํ™”์— ๋Œ€๋น„๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ
  • ํ•˜์ง€๋งŒ ๊ทธ๋กœ ์ธํ•œ ๋‹จ์ ๋„ ์žˆ๋‹ค.

๋‹จ์ 

  1. ์ง๊ด€์ ์ด์ง€ ๋ชปํ•˜๋‹ค.
  2. ๋‚ด๋ถ€๋ฅผ ์•Œ์•„์•ผ ์ข‹์€ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
import java.util.Collection;
 
public final class DataSource {
    public void mergeTo(Collection<Data> dataset) {
        // source๋กœ ๋ถ€ํ„ฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ "์ค‘๋ณต ์—†์ด" dataset์— ๋ฐ˜์˜
    }
}
  • ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด๋ผ๋ฉด, ์ด dataset์ด ์–ด๋–ค ํด๋ž˜์Šค๋ƒ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.
    • Set: ์ค‘๋ณต ์ฒดํฌ ํ•„์š”์—†์Œ, add๋งŒ ํ˜ธ์ถœ
    • ArrayList: contains๋กœ ์ค‘๋ณต๊ฒ€์‚ฌ, ์•„๋‹Œ ๊ฒฝ์šฐ๋งŒ add
    • ์ •๋ ฌ๋œ ArrayList: ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ค‘๋ณต ๊ฒ€์‚ฌ, ์•„๋‹Œ ๊ฒฝ์šฐ๋งŒ add
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ๋“ค์„ ๋ชจ๋‘ ์•„์šฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ๋Š๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    • contains๋กœ ์ค‘๋ณต๊ฒ€์‚ฌ, ์•„๋‹Œ ๊ฒฝ์šฐ๋งŒ add
  • ์ฆ‰, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜ํ™”/์ถ”์ƒํ™”๊ฐ€ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ตฌ์ฒด ํƒ€์ž…์ด ๋“ค์–ด์˜ค๋ฉด ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅ
  1. ๊ตฌํ˜„์„ ์•Œ์•„์•ผ ๋ฌธ์ œํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅ
    • ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์•Œ๊ณ ๋ณด๋‹ˆ ๋‚ด๋ถ€ ๊ตฌํ˜„์‚ฌํ•ญ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

Reference