
객체의 생성과 관리를 개발자가 아닌 Spring 컨테이너가 담당한다
public class OrderService {
private PaymentService paymentService;
private EmailService emailService;
public OrderService() {
this.paymentService = new PaymentService(); // 직접 생성
this.emailService = new EmailService(); // 직접 생성
}
}
###문제점
@Service
public class OrderService {
private final PaymentService paymentService;
// Spring이 객체를 생성해서 넣어줌
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
👉 이것이 IoC (제어의 역전)
객체를 생성하고, 연결하고, 관리하는 공간
→ ApplicationContext
Spring 컨테이너가 관리하는 객체
@Component // 일반 컴포넌트
@Service // 비즈니스 로직
@Repository // DB 접근
@Controller // 웹 요청 처리
// @Component → 클래스 자체를 Bean 등록
@Component
public class MyComponent {}
// @Bean → 메서드 반환 객체를 Bean 등록
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
IoC를 구현하는 방법으로, 필요한 객체를 외부에서 주입받는 것
public class OrderService {
private PaymentService paymentService; // 의존성
}
👉 OrderService는 PaymentService 없으면 동작 불가
@Service
public class OrderService {
private final PaymentService paymentService;
// 생성자가 하나면 @Autowired 생략 가능
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
@Service
@RequiredArgsConstructor
public class OrderService {
private final PaymentService paymentService;
}
@Service
public class OrderService {
private PaymentService paymentService;
@Autowired
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
}
###문제점
객체 생성 → 의존성 주입 → 초기화 → 사용 → 소멸
public class MyBean {
public MyBean() {
System.out.println("Bean 생성");
}
}
👉 아직 의존성 주입 안 된 상태
@Autowired
private MemberService memberService;
👉 이 단계 이후 정상 동작 가능
@PostConstruct
public void init() {
System.out.println("초기화 완료");
}
@Override
public void afterPropertiesSet() {
System.out.println("초기화");
}
@Bean(initMethod = "init")
public MyBean myBean() {
return new MyBean();
}
public void businessLogic() {
System.out.println("비즈니스 로직 실행");
}
👉 실제 서비스 로직 실행
@PreDestroy
public void destroy() {
System.out.println("Bean 소멸");
}
@Override
public void destroy() {
System.out.println("소멸");
}
@Bean(destroyMethod = "close")
public MyBean myBean() {
return new MyBean();
}
생성자 호출
↓
의존성 주입
↓
@PostConstruct
↓
(비즈니스 로직 실행)
↓
@PreDestroy
Spring Bean은 컨테이너에 의해 생성되고, 의존성 주입 후 초기화 과정을 거친 뒤 사용되며, 컨테이너 종료 시 소멸됩니다.
의존성 주입이 완료된 이후 실행됩니다.