새발블로그

[Spring] 의존성 주입 (Dependency Injection) 본문

Server/Spring

[Spring] 의존성 주입 (Dependency Injection)

EUG 2025. 7. 8. 23:00

DI란?

객체 간의 의존 관계를 프로그래머가 아닌 프레임워크가 주입해주는 설계 방식. 스프링은 이 DI를 통해 객체 생성과 관리 책임을 분리시킨다.

DI 방법 비교

방식 특징 장점 단점
필드 주입 @Autowired로 필드에 바로 주입 코드 간단 테스트/유지보수 어려움
생성자 주입 생성자를 통해 주입 불변성 확보, 테스트 용이 코드 길어질 수 있음
Setter 주입 Setter 메서드를 통한 주입 선택적 의존성 주입 가능 누락 시 런타임 에러 가능성

어노테이션 정리

@Autowired
private UserService userService;

@Autowired
public OrderService(UserService userService) {
    this.userService = userService;
}

@Autowired
public void setUserService(UserService userService) {
    this.userService = userService;
}
  • @Autowired: 스프링 컨테이너가 Bean을 자동 주입
  • @Qualifier: 같은 타입 Bean 여러 개 있을 때 지정
@Autowired
@Qualifier("userServiceV2")
private UserService userService;

 

예전 방식의 단점

UserService userService = new UserServiceImpl(); // 강한 결합
  • 직접 생성 → 테스트 어려움
  • 변경 시 코드 수정 필요
  • 외부 설정 불가

DI의 이점 (테스트 & 유지보수 관점)

  • Mock 객체 주입 가능 → 테스트 유연성
  • 클래스 간 결합도 낮음 → 변경 용이
  • 설정만 바꾸면 로직 변경 없이 동작 수정 가능