08 빈 생명주기
p106(좌측이미지) - src/main/java/spring/basic/lifecycle/LifeCycleBeanWithConfiguration
public class LifeCycleBeanWithConfiguration {
public LifeCycleBeanWithConfiguration() {
System.out.println("생성자 호출: LifeCycleBeanWithConfiguration 객체 생성");
}
public void init() {
System.out.println("LifeCycleBeanWithConfiguration init 호출: 빈 초기화 작업 실행");
}
public void destroy() {
System.out.println("LifeCycleBeanWithConfiguration destroy 호출: 빈 자원 정리 작업 실행");
}
public void doSomething() {
System.out.println("LifeCycleBeanWithConfiguration 비즈니스 로직 실행");
}
}
p106(우측이미지) - src/main/java/spring/basic/lifecycle/LifeCycleBeanWithConfiguration
@Configuration
@ComponentScan(
basePackages = "spring.basic"
)
public class ScanAppConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public LifeCycleBeanWithConfiguration lifeCycleBeanWithConfiguration(){
return new LifeCycleBeanWithConfiguration();
}
}
p107 - src/test/spring/basic/lifecycle/LifeCycleBeanTest
class LifeCycleBeanTest {
@Test
void lifecycleTest() {
// ApplicationContext를 설정 파일에서 로드 (ScanAppConfig는 @Configuration을 가진 설정 클래스)
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// 빈이 정상적으로 생성되었는지 확인
LifeCycleBean lcb = ac.getBean(LifeCycleBean.class);
assertNotNull(lcb, "LifeCycleBean 빈이 성공적으로 생성되지 않았습니다.");
// doSomething() 메서드를 호출하여 비즈니스 로직 실행 확인
lcb.doSomething();
// 컨텍스트 종료를 통해 @PreDestroy 메서드 호출 테스트
((AnnotationConfigApplicationContext) ac).close();
}
@Test
void lifecycleWithConfigurationTest() {
// ApplicationContext를 설정 파일에서 로드 (ScanAppConfig는 @Configuration을 가진 설정 클래스)
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// 빈이 정상적으로 생성되었는지 확인
LifeCycleBeanWithConfiguration lcb = ac.getBean(LifeCycleBeanWithConfiguration.class);
assertNotNull(lcb, "LifeCycleBean 빈이 성공적으로 생성되지 않았습니다.");
// doSomething() 메서드를 호출하여 비즈니스 로직 실행 확인
lcb.doSomething();
// 컨텍스트 종료를 통해 @PreDestroy 메서드 호출 테스트
((AnnotationConfigApplicationContext) ac).close();
}
@Test
void lifecycleTestReal() {
// 애플리케이션 컨텍스트 생성
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// LifeCycleBean 빈 가져오기
LifeCycleBeanReal lcb = ac.getBean(LifeCycleBeanReal.class);
// 비즈니스 로직 실행 (파일에 데이터 쓰기)
lcb.writeToFile("테스트 데이터 1");
lcb.writeToFile("테스트 데이터 2");
// 애플리케이션 컨텍스트 종료 (PreDestroy 호출)
ac.close();
}
}
p109 - src/main/java/spring/basic/lifecycle/LifeCycleBean
@Component
public class LifeCycleBean {
public LifeCycleBean() {
System.out.println("생성자 호출: LifecycleBean 객체 생성");
}
// 빈이 생성된 후, 의존성 주입이 완료된 후 호출되는 메서드
@PostConstruct
public void init() {
System.out.println("PostConstruct 호출: 빈 초기화 작업 실행");
}
// 애플리케이션이 종료되기 전에 호출되는 메서드
@PreDestroy
public void destroy() {
System.out.println("PreDestroy 호출: 빈 자원 정리 작업 실행");
}
public void doSomething() {
System.out.println("비즈니스 로직 실행");
}
}
p110 - src/test/java/spring/basic/lifecycle/LifeCycleBeanTest
class LifeCycleBeanTest {
@Test
void lifecycleTest() {
// ApplicationContext를 설정 파일에서 로드 (ScanAppConfig는 @Configuration을 가진 설정 클래스)
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// 빈이 정상적으로 생성되었는지 확인
LifeCycleBean lcb = ac.getBean(LifeCycleBean.class);
assertNotNull(lcb, "LifeCycleBean 빈이 성공적으로 생성되지 않았습니다.");
// doSomething() 메서드를 호출하여 비즈니스 로직 실행 확인
lcb.doSomething();
// 컨텍스트 종료를 통해 @PreDestroy 메서드 호출 테스트
((AnnotationConfigApplicationContext) ac).close();
}
@Test
void lifecycleWithConfigurationTest() {
// ApplicationContext를 설정 파일에서 로드 (ScanAppConfig는 @Configuration을 가진 설정 클래스)
ApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// 빈이 정상적으로 생성되었는지 확인
LifeCycleBeanWithConfiguration lcb = ac.getBean(LifeCycleBeanWithConfiguration.class);
assertNotNull(lcb, "LifeCycleBean 빈이 성공적으로 생성되지 않았습니다.");
// doSomething() 메서드를 호출하여 비즈니스 로직 실행 확인
lcb.doSomething();
// 컨텍스트 종료를 통해 @PreDestroy 메서드 호출 테스트
((AnnotationConfigApplicationContext) ac).close();
}
@Test
void lifecycleTestReal() {
// 애플리케이션 컨텍스트 생성
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// LifeCycleBean 빈 가져오기
LifeCycleBeanReal lcb = ac.getBean(LifeCycleBeanReal.class);
// 비즈니스 로직 실행 (파일에 데이터 쓰기)
lcb.writeToFile("테스트 데이터 1");
lcb.writeToFile("테스트 데이터 2");
// 애플리케이션 컨텍스트 종료 (PreDestroy 호출)
ac.close();
}
}
p111 - src/main/java/spring/basic/lifecycle/LifeCycleBeanReal
@Component
public class LifeCycleBeanReal {
private BufferedWriter writer;
public LifeCycleBeanReal() {
System.out.println("생성자 호출: LifeCycleBean 객체 생성");
}
// 빈이 생성된 후, 의존성 주입이 완료된 후 호출되는 메서드
// 여기서는 파일을 열어서 초기화 작업을 수행
@PostConstruct
public void init() {
System.out.println("PostConstruct 호출: 파일 쓰기 작업 준비 중...");
try {
// 파일 열기
writer = new BufferedWriter(new FileWriter("output.txt"));
System.out.println("파일 열기 완료: output.txt");
} catch (IOException e) {
System.err.println("파일 열기 실패: " + e.getMessage());
}
}
// 비즈니스 로직: 파일에 데이터를 기록하는 작업
public void writeToFile(String data) {
System.out.println("파일에 데이터 쓰기 중...");
try {
writer.write(data);
writer.newLine();
System.out.println("데이터 쓰기 완료: " + data);
} catch (IOException e) {
System.err.println("데이터 쓰기 실패: " + e.getMessage());
}
}
// 애플리케이션이 종료되기 전에 호출되는 메서드
// 여기서는 파일을 닫아서 자원을 정리
@PreDestroy
public void destroy() {
System.out.println("PreDestroy 호출: 파일 닫기 작업 시작...");
try {
if (writer != null) {
writer.close();
System.out.println("파일 닫기 완료: output.txt");
}
} catch (IOException e) {
System.err.println("파일 닫기 실패: " + e.getMessage());
}
}
}
p112 - src/test/java/spring/basic/lifecycle/LifeCycleBeanTest
@Test
void lifecycleTestReal() {
// 애플리케이션 컨텍스트 생성
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ScanAppConfig.class);
// LifeCycleBean 빈 가져오기
LifeCycleBeanReal lcb = ac.getBean(LifeCycleBeanReal.class);
// 비즈니스 로직 실행 (파일에 데이터 쓰기)
lcb.writeToFile("테스트 데이터 1");
lcb.writeToFile("테스트 데이터 2");
// 애플리케이션 컨텍스트 종료 (PreDestroy 호출)
ac.close();
}
Last updated