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