제어의 역행(IOC)으로 특정 객체에 필요한 다른 객체를 외부에서 결정해서 연결시키는 것.
설정만 해준다면(applicationContext.xml) 스프링은 그 설정 정보를 참고해서 객체를 생성,관리하고 그 관계를 맺어준다.
핵심은 개발자가 new 연산자 등을 통해 객체를 생성할 필요가 없다는 것이다(제어의 역행-IoC).
개발자 입장에서는 스프링 컨테이너에게 그 참조변수만 일러준다면(@Autowired나 setter주입 등) 스프링이 알아서 객체를 생성해주고, 관계를 맺어준다.
이를 의존성 주입(DI : dependency Injection)이라고 하며 개발자는 자신의 코드에 필요한 객체를 스프링을 통해 주입받는 구조로 코드를 작성한다.
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 핵심 로직과 부가 기능(공통 기능)을 분리하여, 코드의 재사용성과 유지보수성을 높이는 프로그래밍 기법입니다.
Spring AOP는 트랜잭션 관리, 로깅, 보안 등의 기능을 핵심 로직과 분리하여 적용하는 데 사용됩니다.
관점 지향 프로그래밍이라 불린다.
AOP는 분리된 횡단 관심사를 Aspect라는 모듈 형태로 만들어서 설계하고 개발을 한다.
Aspect 모듈에는 부가 기능(횡단 관심사)을 내포하고 있으며 자체적으로 부가 기능을 여러 객체의 핵심기능에 교차로 적용을 시켜주기 때문에 추상화를 통해 분리하는 작업도 필요가 없어짐으로 횡단 관심사 모듈을 효율적으로 관리할 수 있게 된다.
AOP의 메커니즘은 프로그램을 핵심 관심사와 횡단 관심사로 분리하고 분류된 관심사는 각각의 모듈성을 가져야 한다는 게 AOP의 핵심이고 목표이다.
핵심 관심사 → Object 기반으로 모듈화
횡단 관심사 → Aspect 기반으로 모듈화

IOC(Inversion of Control, 제어의 역전)는 객체의 생성 및 의존 관계 관리를 개발자가 직접 하지 않고, 외부 컨테이너(예: 스프링 IOC 컨테이너)가 대신 처리하도록 하는 설계 패턴입니다.
즉, 객체가 자신의 의존성을 직접 생성하거나 관리하지 않고, 필요한 객체를 외부에서 주입(Dependency Injection, DI)받아 사용하는 방식입니다.
IOC는 객체의 생성과 생명 주기 관리를 개발자가 아닌 외부 컨테이너(예: Spring Container)가 담당하도록 하는 개념입니다.
즉, 객체의 제어권을 개발자가 직접 가지지 않고 외부 컨테이너에 위임하는 것을 의미합니다.
IOC 컨테이너의 역할
1. 빈(Bean) 인스턴스 생성
• 개발자가 직접 객체를 생성하는 것이 아니라, 스프링 컨테이너가 대신 생성합니다.
2. 의존 관계 설정 (Dependency Injection, DI)
• 생성된 빈(Bean)들 간의 의존성을 자동으로 주입해 줍니다.
3. 빈(Bean) 제공 및 관리
• 스프링 컨테이너는 빈을 저장하고 필요할 때 제공하며, 생명 주기(lifecycle)도 관리합니다.
스프링에서 IOC 컨테이너가 생성하고 관리하는 객체를 “빈(Bean)”이라고 합니다.
즉, 스프링 컨테이너가 관리하는 객체는 모두 빈(Bean)으로 간주됩니다.
빈을 설정하는 방법
1) XML 기반 설정
XML 파일에서 bean 태그를 사용하여 빈을 등록하고 의존성을 설정
<bean id="car" class="com.example.Car">
<constructor-arg ref="engine"/>
</bean>
<bean id="engine" class="com.example.Engine"/>
2) Java 기반 설정 (어노테이션 방식)
@Configuration과 @Bean을 사용하여 Java 코드로 빈을 등록
@Configuration
public class AppConfig {
@Bean
public Engine engine() {
return new Engine();
}
@Bean
public Car car() {
return new Car(engine());
}
}
3) 어노테이션 기반 설정 (@Component, @Autowired)
@Component로 빈 등록, @Autowired로 의존성 자동 주입
@Component
public class Engine {
public void start() {
System.out.println("Engine started");
}
}
@Component
public class Car {
private final Engine engine;
@Autowired // 의존성 자동 주입
public Car(Engine engine) {
this.engine = engine;
}
}
Spring 컨테이너에서 Bean(객체)의 생성부터 소멸까지의 과정을 의미합니다.
✅ Spring Bean의 라이프사이클 단계
1. 객체 생성 (Instantiation)
2. 의존성 주입 (Dependency Injection)
3. 초기화 (Initialization, @PostConstruct / init-method)
4. 사용 (Ready to use)
5. 소멸 (Destruction, @PreDestroy / destroy-method)
✅ 라이프사이클 콜백 예시
@Component
public class ExampleBean {
@PostConstruct
public void init() {
System.out.println("빈 초기화 완료");
}
@PreDestroy
public void destroy() {
System.out.println("빈 소멸 전 작업");
}
}
1. 객체 간 결합도 감소 → 유지보수 및 테스트 용이
2. 의존성 관리 자동화 → 객체 생성 및 주입을 스프링이 담당
3. 객체 생명 주기 관리 가능 → 자동으로 초기화 및 소멸 처리
4. 애플리케이션 확장성 증가 → DI를 통해 다양한 구현체를 쉽게 교체 가능

✅ 사용 예시
@Autowired
private Engine engine; // 타입 기반 주입
@Resource(name = "engine")
private Engine engine; // 이름 기반 주입
@Inject
private Engine engine; // 타입 기반 주입
✅ 사용 예시
@Configuration
public class AppConfig {
@Bean
public Engine engine() {
return new Engine();
}
}
@Component
public class Car {
@Autowired
private Engine engine; // 자동 주입
}
