๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[DI] ์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ˆœํ™˜ ์˜์กด์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š”๊ฐ€

์ถœ์ฒ˜

ChatGPT

Gemini


์ˆœํ™˜ ์˜์กด์„ฑ Circular Dependency

๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์ด ์„œ๋กœ๋ฅผ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ. ๋งˆ์น˜ ๋ฑ€์ด ์ž์‹ ์˜ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ  ์žˆ๋Š” ๋ชจ์Šต๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ˆ๋‹ค.

 

์ˆœํ™˜ ์˜์กด์„ฑ์˜ ๋ฌธ์ œ์ 

1. ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€

ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ์–ด ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์ด๋‚˜ ํ™•์žฅ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.ํ•œ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์—ฐ์‡„์ ์œผ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์ณ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๋ณต์žกํ•ด์ง€๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

2. ํ…Œ์ŠคํŠธ์˜ ์–ด๋ ค์›€

๊ฐœ๋ณ„ ํด๋ž˜์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ , ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ปค์ง„๋‹ค.

3. ์ฝ”๋“œ ์ดํ•ด๋„ ์ €ํ•˜

์ฝ”๋“œ์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ ์œ ์ง€๋ณด์ˆ˜ ์ธ๋ ฅ์ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

4. ๊ฒฐํ•ฉ๋„ ์ฆ๊ฐ€

ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ ์‹œ์Šคํ…œ์˜ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.

 

์ˆœํ™˜ ์˜์กด์„ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

1. ์ž˜๋ชป๋œ ์„ค๊ณ„

์‹œ์Šคํ…œ ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ค‘๋ณต๋œ ๊ธฐ๋Šฅ

๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค์—์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๊ณผ๋„ํ•œ ์˜์กด์„ฑ

ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ํด๋ž˜์Šค์— ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ˆœํ™˜ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ๋ฆฌํŒฉํ† ๋ง / ๋””์ž์ธ ๊ฐœ์„ 

์ฝ”๋“œ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ  ๋ชจ๋“ˆํ™”๋ฅผ ๋†’์ธ๋‹ค.

ํด๋ž˜์Šค์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ์„ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. SOLID ์›์น™ ์ค‘ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP)์„ ์ ์šฉํ•ด ํด๋ž˜์Šค๋ฅผ ๋” ์ž‘๊ณ  ์‘์ง‘๋ ฅ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.

2. ์ค‘๊ฐ„์ž ํŒจํ„ด Mediator Pattern

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

 

์˜ˆ

class Mediator(val classA: ClassA, val classB: ClassB) {
    fun doSomething() {
        classA.doA()
        classB.doB()
    }
}

 

3. ์˜์กด์„ฑ ์—ญ์ „ ์›์น™ Dependency Inversion Principle

๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์ถ”์ƒํ™” ๊ณ„์ธต(์ธํ„ฐํŽ˜์ด์Šค)์„ ๋„์ž…ํ•œ๋‹ค.

4. ๋ชจ๋“ˆํ™”

์‹œ์Šคํ…œ์„ ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค.

 

์ƒ์„ฑ์ž ์ฃผ์ž…์ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

1. ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ˆœํ™˜ ์˜์กด์„ฑ์ด ์žˆ์„ ๋•Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. 

 

์˜ˆ

class ClassA(val classB: ClassB)

class ClassB(val classA: ClassA)

 

์œ„์˜ ์ฝ”๋“œ์—์„œ 'ClassA'์™€ 'ClassB'๋Š” ์„œ๋กœ ์ƒ์„ฑ์ž์—์„œ ์ฃผ์ž…๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœํ™˜ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

2. ์„ค๊ณ„ ๊ฐœ์„  ์œ ๋„

์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ๊ฐœ์„ ํ•˜๋„๋ก ์œ ๋„ํ•œ๋‹ค. ์ˆœํ™˜ ์˜์กด์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ์„ค๊ณ„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์˜์กด์„ฑ ์ฃผ์ž… ์ˆœ์„œ ๊ฒฐ์ •

์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์˜์กด์„ฑ ์ฃผ์ž… ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•œ๋‹ค. ๋ชจ๋“  ์˜์กด์„ฑ์€ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๊ธฐ์—, ์ˆœํ™˜ ์˜์กด์„ฑ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ DI ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž… ์ˆœ์„œ๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋„๋ก ๋•๋Š”๋‹ค.

 

๊ฒฐ๋ก 

์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์•ˆ์ „์„ฑ์„ ๋†’์ต๊ณ , ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๊ฐœ์„ ํ•œ๋‹ค.