728x90
Spring Bean이란?
- Spring Bean은 Spring IoC(제어의 역전) 컨테이너에 의해 관리되는 Java 객체입니다.
- IoC 컨테이너는 Bean의 생성, 설정, 소멸을 책임지는 아키텍처의 중추 역할을 합니다.
- 이러한 객체는 단순한 데이터 홀더에서 복잡한 비즈니스 로직을 처리하는 컴포넌트까지 다양할 수 있습니다.
- Spring의 강점은 이 Bean들의 생성, 설정, 생명주기를 관리하는 데 있습니다.
왜 Spring Bean 생명주기를 이해해야 할까요?
- Spring Bean의 생명주기를 이해하면 Spring 애플리케이션의 내부 작동 방식을 알 수 있습니다.
- 이 과정을 잘 이해하면 Bean을 더 효과적으로 관리하고, 리소스를 효율적으로 사용하며, 애플리케이션의 성능을 최적화할 수 있습니다.
Spring Bean 생명주기의 이점
- 리소스 관리: 생명주기의 각 단계를 거치며 리소스를 효율적으로 관리할 수 있습니다.
- 커스터마이징: 생명주기의 특정 지점에 사용자 정의 로직을 주입하여 애플리케이션을 유연하게 만들 수 있습니다.
- 의존성 주입: Bean 초기화 단계에서 의존성 주입의 마법을 경험하고 Bean 간의 상호작용을 이해하게 됩니다.
- 디버깅: 생명주기를 이해하면 Bean이 어떤 단계에서 문제가 발생하는지 쉽게 추적할 수 있어 디버깅이 쉬워집니다.
Spring Bean 생명주기 단계
- 1단계 : Bean의 인스턴스화
- 이 단계에서 Spring 컨테이너는 Bean의 새로운 인스턴스를 생성합니다. 생성자는 Bean의 기본 속성을 설정하는 중요한 역할을 합니다.
public class Character {
public Character() {
System.out.println("인스턴스화: 새로운 캐릭터가 생성되었습니다.");
}
}
- 2단계 : 속성 설정
- 생성된 Bean에 속성과 의존성을 주입하는 단계입니다.
public class Character {
private Weapon weapon;
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
System.out.println("속성 설정: " + weapon.getName() + "을(를) 장착했습니다.");
}
}
- 3단계 : BeanNameAware 인터페이스
- 이 단계에서 Bean은 자신이 Spring 컨테이너에서 할당받은 이름을 알게 됩니다.
public class Character implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware: Bean 이름 설정: " + name);
}
}
- 4단계 : ApplicationContextAware 인터페이스
- Bean은 자신이 속한 ApplicationContext에 접근할 수 있게 됩니다. 이를 통해 다른 Bean과 상호작용할 수 있습니다.
public class Character implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
System.out.println("ApplicationContextAware: ApplicationContext 설정.");
}
}
- 5단계 : BeanPostProcessor 인터페이스
- Bean이 초기화되기 전후에 사용자 정의 로직을 추가할 수 있습니다.
public class MagicBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("BeanPostProcessor: 초기화 전에 처리 로직 실행");
return bean;
}
}
- 6단계 : @PostConstruct
- Bean이 초기화된 직후에 사용자 정의 로직을 실행할 수 있는 어노테이션입니다.
import jakarta.annotation.PostConstruct;
public class Character {
@PostConstruct
public void init() {
System.out.println("@PostConstruct: 캐릭터가 준비 중입니다.");
}
}
- 7단계 : InitializingBean 인터페이스
- Bean이 모든 속성 설정을 마치고 나서 추가적인 초기화 작업을 수행할 수 있습니다.
public class Character implements InitializingBean {
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean: 초기화 작업 완료.");
}
}
- 8단계 : @PreDestroy
- Bean이 소멸되기 직전에 호출되는 메서드를 정의하는 어노테이션입니다.
import jakarta.annotation.PreDestroy;
public class Character {
@PreDestroy
public void preDestroyCleanup() {
System.out.println("@PreDestroy: 캐릭터가 종료 준비를 하고 있습니다.");
}
}
- 9단계 : DisposableBean 인터페이스
- Bean이 소멸될 때 호출되어 자원을 정리하는 메서드를 제공합니다.
public class Character implements DisposableBean {
@Override
public void destroy() {
System.out.println("DisposableBean: 캐릭터가 소멸되었습니다.");
}
}
정리
- Spring Bean의 생명주기를 이해하면 Spring 애플리케이션을 더 잘 관리하고 최적화할 수 있습니다.
- 각각의 생명주기 단계는 Bean의 초기화와 종료 과정에서 사용자 정의 로직을 삽입할 수 있는 중요한 지점이므로, 이를 통해 더 나은 애플리케이션을 만들 수 있습니다.
- 생성자 주입을 통해 Bean을 초기화하세요.
- 과도한 커스터마이징은 피하고, 가능한 한 간결하게 유지하세요.
- @PostConstruct와 @PreDestroy를 활용해 초기화와 소멸을 처리하세요.
- 리소스 사용을 모니터링하고 Bean 생명주기를 테스트하세요.
728x90
반응형
'Develop' 카테고리의 다른 글
[k8s] kubeadm 개념 및 명령어 정리 (0) | 2024.10.02 |
---|---|
[k8s] 구성 요소별 관련 명령어 (3) | 2024.10.02 |
[k8s] Kubernetes 주요 구성 요소 (0) | 2024.10.02 |
[Spring] IoC(Inversion of Control)와 DI(Dependency Injection) 이해하기 (0) | 2024.09.10 |
[Flutter] Uri를 활용한 SMS 보내기 기능 구현 (0) | 2024.08.29 |
[SMTP] 수신 메일에서의 hover, onmouse 기능 미지원 이슈 (4) | 2024.08.28 |
[Java] params URLEncoder 처리 (0) | 2024.07.30 |
[CI/CD] Spring Boot .jar 서버 배포 스크립트 개선 (0) | 2024.07.25 |