Spring DI에 관해

break 없는 while loop·2025년 3월 3일
post-thumbnail

1. Spring DI란?

Spring DI(Dependency Injection)는 Spring Framework의 핵심 기능 중 하나로, 객체 간의 의존성을 외부에서 주입하여 관리하는 디자인 패턴이다 이로 인해 코드 간 결합도가 낮아지고 모듈화와 테스트 용이성이 크게 향상된다.

2. Dependency Injection

  • 정의:
    • Dependency Injection은 객체가 필요한 의존 객체(다른 객체)를 스스로 생성하거나 찾지 않고, 외부에서 주입받도록 하는 패턴이다. 즉, 객체의 생성과 관리 책임을 외부 컨테이너(예: Spring IoC Container)가 대신 해준다.
  • Inversion of Control(IoC):
    • DI는 IoC의 한 형태이다. 전통적인 프로그래밍에서는 객체가 직접 의존 객체를 생성하지만, IoC에서는 객체의 제어 흐름(생성, 관리)을 컨테이너가 담당하게 된다.

3. Spring에서 DI가 작동하는 방식

  • Bean 등록:
    • Spring은 애플리케이션 시작 시, XML, 자바 설정 파일, 혹은 어노테이션(@Component, @Service, @Repository, @Controller 등)을 통해 Bean으로 등록할 클레스를 스캔한다.
  • 의존성 주입:
    • 등록된 Bean들은 서로의 의존성을 주입받을 수 있다. 이 때, Spring 컨테이너가 객체를 생성하고, 필요한 의존 객체를 찾아 자동으로 주입해준다.
  • 어노테이션 기반 주입:
    • @Autowired: 해당 필드, 생성자, 또는 메소드에 맞는 Bean을 컨테이너에서 찾아 주입한다.
    • @Qualifier: 여러 Bean이 존재할 때, 특정 Bean을 지정하여 주입받을 수 있다.
    • @Inject@Resource 같은 어노테이션도 사용 가능하다.

4. Spring DI의 주입 방식

  • 생성자 주입 (Constructor Injection):

    • 생성자를 통해 필요한 의존성을 주입받는 방식. 객체 생성 시점에 모든 의존성이 확실히 주입되므로, 불변성을 보장할 수 있으며 테스트 작성에도 유리하다.
    @Service
    public class UserService {
        private final UserRepository userRepository;
    
        @Autowired
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
        // Business methods using userRepository...
    }
  • 세터 주입 (Setter Injection):

    • Setter 메소드를 통해 의존성을 주입받는 방식이다. 객체 생성 후에도 의존성을 변경할 수 있어 유연하지만, 의존성이 누락될 위험이 있을 수 있다.
    @Service
    public class UserService {
        private UserRepository userRepository;
    
        @Autowired
        public void setUserRepository(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
        // Business methods using userRepository...
    }
  • 필드 주입 (Field Inection):

    • 필드에 직접 주입하는 방식으로 코드가 간결해지지만, 테스트나 재사용 측면에서는 단점이 있다. 일반적으로는 권장되지 않는다.
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        // Business methods using userRepository...
    }

5. Spring DI의 장점

  • 낮은 결합도:
    • 객체들이 직접 서로를 생성하지 않기 때문에, 서로의 구현에 영향을 덜 받는다. 이는 유지보수와 확장을 용이하게 한다.
  • 테스트 용이성:
    • DI를 사용하면 모의 객체(mock)를 쉽게 주입할 수 있어 단위 테스트 작성이 간편하다.
  • 유연한 구성:
    • 애플리케이션의 구성이나 의존성이 변경되어도, 중앙에서 관리되는 컨테이너를 통해 쉽게 조정할 수 있다.
  • 코드 가독성 및 유지보수성 향상:
    • 의존성이 명시적으로 드러나며, 객체의 역할과 관계가 분리되어 코드의 구조가 명확해진다.
profile
프로그래밍 지식 아카이브용

0개의 댓글