[스프링부트 #2] IoC와 DI

Spring의 기본이 되는 제어의 역전과 의존성 주입에 대해 학습하고 핵심 어노테이션을 공부하고 정리하였습니다.
도경원's avatar
Aug 01, 2025
[스프링부트 #2] IoC와 DI

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

개념

  • 기존 방식: 개발자가 필요한 객체를 직접 new 키워드로 생성해서 사용한다.
  • IoC 방식: 객체의 생성과 생명 주기를 개발자가 아닌 프레임워크(SPRING) 가 관리한다.
즉, "어떤 객체를 언제 만들고 누가 관리할 것인가"에 대한 제어 권한을 개발자 → 스프링 컨테이너로 위임한 것이다.
"역전"이라는 말은 개발자가 원래 하던 역할을 스프링이 대신 해준다는 뜻.
IoC 컨테이너 = 객체를 생성하고 보관해두는 창고 같은 것.
스프링 애플리케이션에서는 대부분의 객체를 IoC 컨테이너에 등록해놓고 필요할 때 꺼내 쓴다.

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

개념

  • 어떤 객체가 필요한 의존 객체(=다른 객체)를 스스로 만들지 않고, 스프링이 대신 넣어주는 것.
  • 예: OrderServiceOrderRepository를 필요로 하면, 직접 new OrderRepository() 하는 게 아니라, 스프링이 OrderRepository를 생성해서 OrderService에 넣어준다.

종류

  1. 생성자 주입 → 가장 권장됨, 생성자에 매개변수 적기만 하면 주입이 됨.
  1. 필드 주입 (지양하는 편)
  1. Setter 주입

3. 핵심 어노테이션 정리

어노테이션
역할
@Component
클래스 객체를 스프링 컨테이너에 등록
@Service, @Repository, @Controller
@Component의 특수화. 역할을 구분하기 위한 것
@Autowired
DI 수행 (필드, 생성자, setter 가능)
@Configuration
설정 클래스를 명시
@Bean
개발자가 직접 객체를 생성해서 등록하고 싶을 때 사용

4. 예시 코드

@Component + 생성자 주입

@Component public class OrderRepository { public void save() { System.out.println("Order Saved!"); } }
@Component public class OrderService { private final OrderRepository orderRepository; // 생성자에 매개변수만 적으면 Spring이 알아서 주입해줌 public OrderService(OrderRepository orderRepository) { this.orderRepository = orderRepository; } public void order() { orderRepository.save(); } }

실행 예 (스프링 부트 기준)

@SpringBootApplication public class App { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(App.class, args); OrderService orderService = context.getBean(OrderService.class); orderService.order(); // Order Saved! } }

5. 자주 헷갈리는 질문 요약

 
질문
답변
IoC 컨테이너는 몇 개만 띄울 수 있어?
보통 1개지만, 특별한 경우 여러 개 만들 수도 있음. 단, 애플리케이션 실행 시 대부분 하나의 ApplicationContext만 쓴다.
객체가 자동으로 new 되는 조건은?
@Component, @Service, @Repository, @Controller 중 하나를 붙여야 함
new 여러 개 띄워야 하는 경우는?
동적으로 객체를 만들거나 수동으로 관리해야 할 경우. 이때는 @Bean 등을 활용하거나 직접 new 한다.
Share article

Gyeongwon's blog