[스프링부트 #2] IoC와 DI
Spring의 기본이 되는 제어의 역전과 의존성 주입에 대해 학습하고 핵심 어노테이션을 공부하고 정리하였습니다.
Aug 01, 2025
![[스프링부트 #2] IoC와 DI](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%25232%255D%2BIoC%25EC%2599%2580%2BDI%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
1. IoC (Inversion of Control) - 제어의 역전
개념
- 기존 방식: 개발자가 필요한 객체를 직접
new
키워드로 생성해서 사용한다.
- IoC 방식: 객체의 생성과 생명 주기를 개발자가 아닌 프레임워크(SPRING) 가 관리한다.
즉, "어떤 객체를 언제 만들고 누가 관리할 것인가"에 대한 제어 권한을 개발자 → 스프링 컨테이너로 위임한 것이다.
"역전"이라는 말은 개발자가 원래 하던 역할을 스프링이 대신 해준다는 뜻.
IoC 컨테이너 = 객체를 생성하고 보관해두는 창고 같은 것.
스프링 애플리케이션에서는 대부분의 객체를 IoC 컨테이너에 등록해놓고 필요할 때 꺼내 쓴다.
2. 의존성 주입 (DI, Dependency Injection)
개념
- 어떤 객체가 필요한 의존 객체(=다른 객체)를 스스로 만들지 않고, 스프링이 대신 넣어주는 것.
- 예:
OrderService
가OrderRepository
를 필요로 하면, 직접new OrderRepository()
하는 게 아니라, 스프링이OrderRepository
를 생성해서OrderService
에 넣어준다.
종류
- 생성자 주입 → 가장 권장됨, 생성자에 매개변수 적기만 하면 주입이 됨.
- 필드 주입 (지양하는 편)
- 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