λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[DI] DIμ—μ„œ μƒμ„±μž μ£Όμž…κ³Ό setter μ£Όμž… 쀑 더 μ„ ν˜Έλ˜λŠ” 방식

좜처 

ChatGPT


 

μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection, DI)μ—μ„œλŠ” μƒμ„±μž μ£Όμž…κ³Ό μ„Έν„° μ£Όμž…μ΄ κ°€μž₯ 일반적인 방법이닀. 이 두 가지 방법은 각각의 μž₯단점이 있으며, 상황에 따라 μ μ ˆν•œ 방법을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. μ–΄λ–€ 방법이 더 μ„ ν˜Έλ˜λŠ”μ§€λŠ” 개발 μƒν™©μ΄λ‚˜ ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬ 사항에 따라 λ‹€λ₯Ό 수 μžˆμ§€λ§Œ, 일반적으둜 λ‹€μŒκ³Ό 같은 이유둜 μƒμ„±μž μ£Όμž…μ΄ 더 μ„ ν˜Έλœλ‹€.


μƒμ„±μž μ£Όμž… Constructor Injection

μž₯점

1. λΆˆλ³€μ„± 보μž₯

객체가 생성될 λ•Œ λͺ¨λ“  μ˜μ‘΄μ„±μ΄ μ£Όμž…λ˜λ―€λ‘œ, 객체의 μƒνƒœκ°€ λΆˆλ³€ν•˜κ²Œ μœ μ§€λœλ‹€. μ΄λŠ” μŠ€λ ˆλ“œ μ•ˆμ •μ„±κ³Ό κ΄€λ ¨λœ 문제λ₯Ό 쀄일 수 μžˆλ‹€. 

2. λͺ…ν™•ν•œ μ˜μ‘΄μ„± ν‘œν˜„

클래슀의 μƒμ„±μžλ₯Ό 톡해 ν•„μš”ν•œ λͺ¨λ“  μ˜μ‘΄μ„±μ„ λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€. μ΄λŠ” ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λͺ¨λ“  μ˜μ‘΄μ„±μ„ λͺ…μ‹œμ μœΌλ‘œ μ•Œλ¦¬λŠ” λ° 도움이 λ©λ‹ˆλ‹€.

3. ν•„μˆ˜ μ˜μ‘΄μ„± μ£Όμž… κ°•μ œ

μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•„μˆ˜ μ˜μ‘΄μ„±μ„ λ°˜λ“œμ‹œ μ£Όμž…ν•˜λ„λ‘ κ°•μ œν•  수 μžˆλ‹€. μ˜μ‘΄μ„±μ΄ μ—†μœΌλ©΄ 객체가 μƒμ„±λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό 컴파일 νƒ€μž„ μ—λŸ¬λ‘œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. ν…ŒμŠ€νŠΈ μš©μ΄μ„±

μ˜μ‘΄μ„±μ΄ λͺ…ν™•ν•˜λ―€λ‘œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹œ Mocking이 μš©μ΄ν•˜λ‹€. ν…ŒμŠ€νŠΈμ—μ„œ μ‰½κ²Œ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜κ³  객체의 행동을 검증할 수 μžˆλ‹€.

5. μˆœν™˜ μ˜μ‘΄μ„± 방지

μƒμ„±μž μ£Όμž…μ€ μˆœν™˜ μ˜μ‘΄μ„±μ„ ν”Όν•˜λŠ” 데 도움이 λœλ‹€. μˆœν™˜ μ˜μ‘΄μ„±μ΄ μ‘΄μž¬ν•˜λ©΄ 객체가 생성될 수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ 쑰기에 λ°œκ²¬λœλ‹€.


단점

1. μ˜μ‘΄μ„± 수 증가 μ‹œ λ³΅μž‘μ„± 증가

ν•„μš”ν•œ μ˜μ‘΄μ„±μ΄ λ§Žμ„ 경우 μƒμ„±μžμ˜ νŒŒλΌλ―Έν„° μˆ˜κ°€ 증가할 수 μžˆμ–΄ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€. 이둜 인해 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.

2. μ˜μ‘΄μ„± λ³€κ²½μ˜ 어렀움

객체가 μƒμ„±λœ μ΄ν›„μ—λŠ” μ˜μ‘΄μ„±μ„ λ³€κ²½ν•  수 μ—†λ‹€. λ§Œμ•½ μ˜μ‘΄μ„±μ„ λ™μ μœΌλ‘œ λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우라면 μ œμ•½μ΄ 될 수 μžˆλ‹€.


μ„Έν„° μ£Όμž… Setter Injection 

μž₯점

1. μœ μ—°μ„±

 κ°μ²΄κ°€ μƒμ„±λœ 이후에도 μ˜μ‘΄μ„±μ„ λ³€κ²½ν•  수 μžˆμœΌλ―€λ‘œ, μ˜μ‘΄μ„±μ΄ κ°€λ³€μ μ΄κ±°λ‚˜ μ˜΅μ…˜μΌ λ•Œ μœ μš©ν•˜λ‹€. 이λ₯Ό 톡해 동적인 μ˜μ‘΄μ„± μ£Όμž…μ΄ κ°€λŠ₯ν•˜λ‹€.

2. 가독성

적은 수의 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•  λ•Œ, μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  가독성이 μ’‹λ‹€. μƒμ„±μžμ— λΉ„ν•΄ λ©”μ„œλ“œμ˜ 선언이 κ°„λ‹¨ν•˜λ‹€.

3. 선택적 μ˜μ‘΄μ„±

일뢀 μ˜μ‘΄μ„±μ΄ μ„ νƒμ μ΄κ±°λ‚˜ 기본값이 μžˆλŠ” 경우, μ„Έν„° μ£Όμž…μ„ 톡해 이λ₯Ό μ„€μ •ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 μœ μ—°ν•œ ꡬ성이 κ°€λŠ₯ν•˜λ‹€.


단점

1. λΆˆμ™„μ „ν•œ μƒνƒœ κ°€λŠ₯μ„±

 κ°μ²΄κ°€ μ™„μ „νžˆ μ΄ˆκΈ°ν™”λ˜κΈ° 전에 μ‚¬μš©ν•  경우 λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€. μ΄λŠ” ν•„μˆ˜ μ˜μ‘΄μ„±μ˜ λˆ„λ½μœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

2. μˆœμ„œ 문제

 μ£Όμž… μˆœμ„œκ°€ μ€‘μš”ν•  경우, 잘λͺ»λœ μˆœμ„œλ‘œ μ£Όμž…ν•˜μ—¬ 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€. μ΄λŠ” 객체의 일관성을 ν•΄μΉ  수 μžˆλŠ” μš”μΈμž…λ‹ˆλ‹€.

3. ν…ŒμŠ€νŠΈμ˜ λ³΅μž‘μ„±

 κ°μ²΄μ˜ μƒνƒœκ°€ λ³€ν•  수 있기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈκ°€ λ³΅μž‘ν•΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 객체의 μƒνƒœ λ³€ν™”λ₯Ό 좔적해야 ν•˜λŠ” λ¬Έμ œλ₯Ό μ•ΌκΈ°ν•©λ‹ˆλ‹€.


비ꡐ 및 ꢌμž₯ 사항

  • μƒμ„±μž μ£Όμž…μ€ λΆˆλ³€μ„±κ³Ό λͺ…ν™•ν•œ μ˜μ‘΄μ„±μ„ 보μž₯ν•˜κΈ° λ•Œλ¬Έμ— 일반적으둜 μ„ ν˜Έλœλ‹€.
  • μ„Έν„° μ£Όμž…μ€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ―€λ‘œ, μ˜μ‘΄μ„±μ΄ μ„ νƒμ μ΄κ±°λ‚˜ λ³€κ²½ κ°€λŠ₯ν•œ κ²½μš°μ— μœ μš©ν•˜λ‹€.
  • μ˜μ‘΄μ„±μ΄ ν•„μˆ˜μ μΈ 경우 μƒμ„±μž μ£Όμž…μ„, μ˜μ‘΄μ„±μ΄ μ„ νƒμ μ΄κ±°λ‚˜ μ΄ˆκΈ°ν™” ν›„ λ³€κ²½ κ°€λŠ₯ν•΄μ•Ό ν•˜λŠ” 경우 μ„Έν„° μ£Όμž…μ„ κ³ λ €ν•  수 μžˆλ‹€.


예제 μ½”λ“œ

Java 예제

// μƒμ„±μž μ£Όμž… 예제
public class Car {
    private final Engine engine;

    // μƒμ„±μžλ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ£Όμž…
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

// μ„Έν„° μ£Όμž… 예제
public class Car {
    private Engine engine;

    // μ„Έν„°λ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ£Όμž…
    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        if (engine == null) {
            throw new IllegalStateException("Engine not set");
        }
        engine.start();
    }
}



Kotlin 예제

// μƒμ„±μž μ£Όμž… 예제
class Car(private val engine: Engine) {

    fun start() {
        engine.start()
    }
}

// μ„Έν„° μ£Όμž… 예제
class Car {
    private var engine: Engine? = null

    // μ„Έν„°λ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ£Όμž…
    fun setEngine(engine: Engine) {
        this.engine = engine
    }

    fun start() {
        engine?.start() ?: throw IllegalStateException("Engine not set")
    }
}

 

κ²°λ‘ 

μƒμ„±μž μ£Όμž…κ³Ό μ„Έν„° μ£Όμž… 쀑 μ–΄λ–€ 것을 μ„ νƒν• μ§€λŠ” ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬ 사항과 μ½”λ“œμ˜ νŠΉμ„±μ— 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€. ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 μƒμ„±μž μ£Όμž…μ΄ ꢌμž₯λœλ‹€. μ΄λŠ” 객체의 μƒνƒœλ₯Ό μ΄ˆκΈ°λΆ€ν„° λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜κ³ , λΆˆν•„μš”ν•œ μƒνƒœ λ³€ν™”λ₯Ό 방지할 수 있기 λ•Œλ¬Έμ΄λ‹€.