CS 공부

# DI(의존성주입)과 전략패턴의 차이

박태정 입니다. 2025. 2. 20. 23:02
반응형



# 🤔 의존성 주입(DI) vs 전략 패턴(Strategy Pattern), 뭐가 다를까?

오늘은 **의존성 주입(Dependency Injection, DI)** 과 **전략 패턴(Strategy Pattern)** 의 차이를 정리해보려고 한다.  
둘 다 **유연성을 높이고, 쉽게 교체할 수 있도록 설계하는 패턴**이라는 점에서 공통점이 있다. 하지만 분명한 차이도 존재한다.  

## 🎭 전략 패턴(Strategy Pattern) - 행동을 바꾸고 싶다면?

전략 패턴은 **"행동(Strategy)"을 교체할 수 있도록 설계하는 패턴**이다.  
즉, **동일한 기능을 수행하는 여러 개의 구현체**를 만들고, **런타임에 동적으로 선택할 수 있도록 구성**하는 것이 핵심이다.  

예를 들어, `Sorter`라는 정렬 인터페이스가 있다고 해보자.  
전략 패턴을 적용하면 `BubbleSort`, `QuickSort`, `MergeSort` 등의 클래스를 각각 구현한 뒤, 실행 시점에 원하는 정렬 알고리즘을 선택해서 사용할 수 있다.  

```java
// 전략 인터페이스
public interface Sorter {
    void sort(int[] numbers);
}

// 전략 구현체 (버블 정렬)
public class BubbleSort implements Sorter {
    @Override
    public void sort(int[] numbers) {
        System.out.println("버블 정렬 수행!");
    }
}

// 전략 구현체 (퀵 정렬)
public class QuickSort implements Sorter {
    @Override
    public void sort(int[] numbers) {
        System.out.println("퀵 정렬 수행!");
    }
}

// 컨텍스트 (전략을 주입받아 사용)
public class SortContext {
    private Sorter sorter;

    public SortContext(Sorter sorter) {
        this.sorter = sorter;
    }

    public void executeSort(int[] numbers) {
        sorter.sort(numbers);
    }
}
```

그리고 실제 실행할 때 **원하는 전략을 주입해서 사용하면 된다.**  
```java
Sorter sorter = new QuickSort();  // 전략 선택
SortContext context = new SortContext(sorter);
context.executeSort(new int[]{5, 3, 8, 1});
```

✔ **핵심 정리**  
- 동일한 동작을 수행하는 **여러 개의 구현체**를 만든다.  
- **인터페이스를 기반으로 다양한 전략을 정의**하고, 필요할 때 변경할 수 있도록 한다.  
- 실행 중간에 전략을 **동적으로 변경 가능**하다.  

## 🔌 의존성 주입(DI) - 객체를 바꾸고 싶다면?

의존성 주입은 **객체 간의 결합도를 낮추고, 유연한 설계를 가능하게 하는 패턴**이다.  
쉽게 말해, **필요한 객체를 직접 생성하는 대신 외부에서 주입(Injection)받도록 만드는 것**이 핵심이다.  

만약 `UserService`가 `UserRepository`를 사용한다고 해보자.  
일반적으로 `UserService` 내부에서 직접 `UserRepository`를 생성하면 **강한 결합**이 발생한다.  

```java
public class UserService {
    private UserRepository userRepository = new UserRepository(); // 강한 결합

    public void saveUser(User user) {
        userRepository.save(user);
    }
}
```
하지만 의존성 주입을 활용하면 **UserRepository를 직접 생성하지 않고 외부에서 주입**받도록 변경할 수 있다.  

```java
public class UserService {
    private final UserRepository userRepository;

    // 생성자를 통한 의존성 주입
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }
}
```
이렇게 하면 **UserRepository의 구현을 쉽게 교체할 수 있다.**  
테스트 환경에서는 가짜(Fake) 저장소를 주입해서 사용할 수도 있다.  

✔ **핵심 정리**  
- 특정 객체의 **생성과 주입을 분리**하는 개념이다.  
- 의존성이 내부가 아니라 **외부에서 주입**된다.  
- **스프링과 같은 프레임워크에서 자동으로 객체를 주입하는 기능**을 제공한다.  

## ⚖️ 전략 패턴 vs 의존성 주입, 차이점은?

|  | 전략 패턴 | 의존성 주입 |
|---|---|---|
| 목적 | 동일한 행동을 수행하는 여러 개의 구현을 유연하게 선택 | 객체의 생성과 의존성을 분리 |
| 개념 | 인터페이스 기반으로 다양한 전략을 정의 | 객체를 외부에서 주입받아 사용 |
| 변경 가능성 | 실행 중간에 전략을 바꿀 수 있음 | 실행 중간에 객체를 바꾸지는 않음 |
| 예제 | 정렬 알고리즘 선택 (`BubbleSort`, `QuickSort` 등) | 데이터베이스 저장소 교체 (`MySQLRepository`, `MockRepository` 등) |

## 🤨 그럼 의존성 주입도 전략 패턴과 비슷한 거 아닌가?

맞다! 둘 다 **유연한 설계**를 위해 객체를 교체할 수 있도록 하는 개념이라는 점에서 공통점이 있다.  
하지만 중요한 차이점이 있다.  

- **전략 패턴**은 실행 중간에도 전략을 변경할 수 있지만,  
- **의존성 주입**은 애플리케이션이 실행될 때 의존성을 주입하고 이후에는 변경하지 않는다.  

즉, **"전략 패턴은 동작(행동)을 바꾸는 것", "의존성 주입은 객체의 생성과 의존성을 관리하는 것"**이라고 이해하면 된다!  

반응형

'CS 공부' 카테고리의 다른 글

# 네트워크란?  (0) 2025.02.22
# 컨텍스트 란?  (0) 2025.02.20
# Flux 패턴  (0) 2025.02.20
# MVC, MVP, MVVM 패턴  (0) 2025.02.20
# 프록시 패턴  (0) 2025.02.20