backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  1. 스프링
  2. Spring Boot

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();
    }

Previous스프링 빈 자동설정 보충자료Next빈 생명주기 보충자료

Last updated 6 months ago