Spring IoC (Inversion of Control) & DI (Dependency Injection) 개념 정리

백엔드&인프라 추종자·2025년 2월 26일

스프링 공부

목록 보기
14/35

📌 Spring IoC (Inversion of Control) & DI (Dependency Injection) 개념 정리


🚀 1. IoC (Inversion of Control) - 제어의 역전

정의

  • 프로그램의 흐름을 개발자가 직접 제어하는 것이 아니라, Spring Container가 대신 관리하는 개념
  • 객체의 생성 및 생명주기를 Spring Framework가 관리

IoC 전후 비교

🔹 IoC 이전 (일반적인 객체 생성)

개발자가 직접 객체를 생성하고, 의존 관계를 설정해야 함

public class UserService {
    private UserRepository userRepository = new UserRepository(); // 직접 객체 생성
}

🔹 IoC 이후 (Spring Container가 객체 관리)

@Service
public class UserService {
    private final UserRepository userRepository;
    
    public UserService(UserRepository userRepository) { // DI를 통해 자동 주입
        this.userRepository = userRepository;
    }
}

UserRepository 객체의 생성과 주입을 Spring이 관리


🔄 2. DI (Dependency Injection) - 의존성 주입

정의

  • 객체가 필요한 의존성을 직접 생성하는 것이 아니라, Spring이 주입(Injection)해 주는 개념
  • 유지보수성과 확장성이 향상됨

DI의 종류

  1. 생성자 주입 (Constructor Injection)

    • final 필드를 활용 가능 (권장 방식)
    • 테스트가 용이함 (필수 의존성 강제 가능)
    @Service
    public class UserService {
        private final UserRepository userRepository;
    
        @Autowired
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    }
  2. 필드 주입 (Field Injection)

    • @Autowired를 필드에 직접 적용
    • Spring Context 외부에서 사용하기 어렵고, 테스트가 어려움
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    }
  3. Setter 주입 (Setter Injection)

    • @Autowired를 Setter 메서드에 적용
    • 선택적인 의존성을 주입할 때 사용
    @Service
    public class UserService {
        private UserRepository userRepository;
    
        @Autowired
        public void setUserRepository(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    }

🎯 정리

개념설명
IoC (제어의 역전)객체의 생성과 관리를 개발자가 아닌 Spring Container가 담당
DI (의존성 주입)객체를 직접 생성하는 대신, Spring이 자동으로 주입해주는 방식
DI 방식생성자 주입(권장), 필드 주입, Setter 주입

결론

  • IoCSpring Container가 객체의 생명주기를 관리하는 개념
  • DISpring이 객체를 주입하여 결합도를 낮추는 방식
  • 유지보수성과 테스트 용이성을 위해 생성자 주입을 권장 🚀
profile
AI 답변 글을 주로 올립니다.

0개의 댓글