Java

[Spring] 의존성 주입(DI, Dependency Injection) 방식

bornsoon 2025. 5. 4. 19:50
  1. 필드 주입
  2. 생성자 주입
  3. setter 주입

 

1. 필드 주입 (@Autowired 사용)

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    public String getData() {
        return myRepository.fetch();
    }
}

 

장점

  • 코드가 간결하다.

단점

  • final 키워드 사용 불가 (불변성 떨어짐).
  • 테스트 시 mock 객체 주입이 어렵다. (테스트 어려움)
  • 순환 참조 문제를 컴파일 타임에 잡기 힘듦.

 

 

2. 생성자 주입

@Service
public class MyService {

    private final MyRepository myRepository;

    // 생성자 하나 → @Autowired 생략 가능 (Spring 4.3 이상)
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public String getData() {
        return myRepository.fetch();
    }
}

 

장점

  • final로 불변성 보장.
  • 테스트 시 주입이 쉬움 (생성자 파라미터로 mock 객체 주입 가능).
  • 순환 참조 시 컴파일 타임에 오류를 파악하기 쉬움.
  • 코드 명시성이 좋아서 협업 시 가독성도 좋음.

단점

  • 생성자에 인자가 많을 경우 코드가 길어진다 (but, RequiredArgsConstructor로 보완 가능)

 

 

3. setter 주입

@Service
public class MyService {

    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public String getData() {
        return myRepository.fetch();
    }
}

 

 

장점

  • 의존성을 나중에 변경할 수 있어 옵셔널한 의존성에 유리함.
  • 테스트나 프레임워크 내부에서 동적으로 주입하고 싶은 경우 사용.

단점

  • final 사용 불가.
  • 객체가 생성된 이후 주입되므로, 주입이 안 될 위험도 있음.

 

항목 필드 주입 생성자 주입 세터 주입
사용 편의성 ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐
테스트 용이성 ❌ 어려움 ✅ 좋음 보통
불변성 보장 (fianl) ❌ 불가능 ✅ 가능 ❌ 불가능
순환 참조 잡기 ❌ 어려움 ✅ 쉬움 ❌ 어려움
선택적 주입 ❌ 어려움 ❌ 어려움 ✅ 가능
스프링 권 권장 특정 상황에 가능
728x90

'Java' 카테고리의 다른 글

[Java] int와 Integer과 null  (0) 2025.05.03
[Java] 시간 초과  (0) 2025.05.03
[Java] RuntimeException  (0) 2025.05.03
[Java] Queue의 add/offer, remove/poll, element/peek 의 차이  (0) 2025.05.03
[Java] 접근 제어자  (0) 2025.05.03