티스토리 뷰

라이프사이클이란?

-우리말로 해석하면 생명주기입니다. 사람이 태어나서 성장하고 활동하다가, 마지막으로 소멸되듯이, 마찬가지로 빈도 생성되어 초기화되어 사용된 후 소멸됩니다. 이처럼 빈이 생성되고 소멸되기까지의 과정을 라이프사이클이라고 합니다. 빈의 생명주기에서 빈 초기화와 빈 소멸만 직접 구현할 수 있습니다.

 

빈의 라이프사이클

  • 빈 생성
    - 스프링 컨테이너에 빈을 생성합니다. 이 단계에서는 빈의 인스턴스를 생성하는 작업이 수행됩니다. 
    이때 빈 객체의 생성자를 통해 객체가 생성됩니다.

  • 의존성 주입
    -생성된 빈에 필요한 의존성을 주입합니다. 이 단계에서는 @Autowired 어노테이션을 사용해 필드, 생성자, 메서드를 통해 의존성을 주입하는 작업이 수행됩니다.

  • 초기화
    -의존성 주입을 한후 빈을 초기화합니다. 이단계에서는 사용자가 직접 인터페이스를 구현해서 초기화를 진행 할 수도있고, 자동으로 초기화를 진행할 수도 있습니다.

  • 사용
    -빈은 사용 가능한 상태가 되며, 다른 빈이나 필요한 부분에서 빈을 참조하여 사용할 수 있습니다.

  • 소멸
    -빈을 소멸시킵니다.이단계에서는 사용자가 직접 인터페이스를 구현해 초기화를 진행 할 수도 있고, 자동으로 초기화를 진행할 수도 있습니다.

 

 

초기화가 필요한 이유

-스프링 빈을 생성자를 사용해 생성할때, 해당 스프링 빈이 생성이 되게 됩니다. 생성자는 주로 필수적이고 가벼운 정보들을 받아와 객체를 생성하게 되는데,만약 해당 스프링 빈이 외부 커넥션(데이터베이스 연결, 외부 데이터 로드...)작업을 하게 될때 생성자를 사용하게 되면 코드가 복잡해지게 됩니다.
따라서, 외부 커넥션 같은 무거운 작업들은 따로 초기화작업을 통해서 구분하는게 유지보수 관점에서 좋습니다.

 

 

 

빈 초기화, 소멸자 예시

 

@Component
public class DatabaseConnector implements InitializingBean, DisposableBean {
    private Connection connection;
    
    @Value("${database.url}")
    private String databaseUrl;
    
    @Value("${database.username}")
    private String databaseUsername;
    
    @Value("${database.password}")
    private String databasePassword;
    
    @Override    //초기화 코드
    public void afterPropertiesSet() throws Exception {
        // 데이터베이스 연결 초기화 작업 수행
        connection = DriverManager.getConnection(databaseUrl, databaseUsername, databasePassword);
        // 추가적인 초기화 작업 수행 가능
    }
    
    // 데이터베이스 연결을 사용하는 메서드들...
    
    @Override    //소멸 코드
    public void destroy() throws Exception {
        // 데이터베이스 연결 종료 작업 수행
        connection.close();
    }
}

 

 

빈 초기화 

- 빈초기화 방식에는 두가지 방식이 있습니다.

 

  • InitializingBean 인터페이스 사용
public class MyBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 초기화 작업 수행
        // ...
    }
}

InitializingBean인터페이스를 사용하고 afterPropertiesSet 메서드를 오버라이드해 초기화 작업을 구현할 수 있습니다. 해당 메서드 내부에 빈 초기화 로직을 정의하여 직접 초기화를 진행 할 수 있습니다.

 

  • @ PostConstruct 애노테이션 사용
public class MyBean {

    @PostConstruct
    public void init() {
        // 초기화 작업 수행
    }
    // ...
}

초기화 메서드를 작성하고 해당 메서드에 @PostConstruct 애노테이션을 추가합니다. 이 애노테이션을 추가하면 빈이 생성된후 자동으로 호출되어  초기화 작업을 진행하게 됩니다.

 

 

  • InitMethod옵션 사용
@Bean(initMethod = "init")
public MyBean mybean(){
     //초기화 작업 수행
}

@Bean으로 직접등록할때 initMethod 옵션을 통해서 초기화를 할 수 있습니다. "init"은 초기화 메서드 이름이며, 다른 이름으로 지정해도 가능합니다. 해당 빈 클래스 내부에 초기화 메서드가 구현되어 있어야합니다.

 

 

 

 

 

빈 소멸

-빈 소멸 방식에는 두가지 방식이 있습니다.

 

  • DispoableBean 인터페이스 사용
public class MyBean implements DisposableBean {

    @Override
    public void destroy() throws Exception {
        // 소멸 작업 수행
        // ...
    }
}

DisposableBean 인터페이스를 사용하고 destroy 메서드를 오버라이드해 초기화 작업을 구현할 수 있습니다. 해당 메서드 내부에 소멸에 필요한 로직을 작성해 소멸을 진행 할 수 있습니다.

 

  • @PreDestroy 애노테이션 사용
public class MyBean {

    @PreDestroy
    public void destroy() {
        // 소멸 작업 수행
    }
}

소멸 메서드를 작성하고 해당 메서드에 @PreDestroy 애노테이션을 추가합니다. 이 애노테이션을 추가하면 빈이 소멸되기 전에 자동으로 호출되어 소멸 작업을 진행하게 됩니다.

 

 

  • DestroyMethod옵션 사용
@Bean(destoryMethod = "destroy")
public MyBean mybean(){
     //소멸 작업 수행
}

@Bean으로 직접등록할때 destroyMethod 옵션을 통해서 빈 소멸을 할 수 있습니다. "destory"은 초기화 메서드 이름이며, 다른 이름으로 지정해도 가능합니다. 해당 빈 클래스 내부에 초기화 메서드가 구현되어 있어야합니다.

 

 

빈 스코프

-빈 인스턴스의 유효 범위를 관리하는 개념으로 빈이 어디서 부터 어디까지 사용 가능한지를 결정하는 것입니다. 이를 활용하여 빈의 관리범위를 다르게하여 한 애플리케이션에서 빈을 어떻게 관리할 지 정할 수 있습니다.

 

  • 싱글톤(Singleton) 스코프
    -기본으로 설정되어있으며 스프링의 기본 동작방식입니다.
    -애플리케이션 전체에서 단일 인스턴스를 생성하고, 이를 전체가 전역변수처럼 공유하여 사용합니다.
    -모든 빈이 싱글톤 스코프로 관리되며, 어디에서 호출하든 해당 빈은 하나로만 유지됩니다.
    -스프링 컨테이너가 자동으로 초기화하고 소멸을 하며, 컨테이너가 삭제될때 같이 소멸합니다.

  • 프로토타입(prototype) 스코프
    -매번 요청시 새로운 인스턴스를 생성합니다.
    -요청할때마다 다른 빈 인스턴스를 반환하므로, 같은 이름의 빈이라도 호출이 다르면 다른 빈 입니다.
    -스프링 컨테이너가 소멸을 관리하지 않으므로, 사용자가 직접 소멸시키는 작업이 필요합니다.
    -Scope("prototype")의 코드를 사용하여 프로토타입 스코프를 사용할 수 있습니다.
@Component
@Scope("prototype")
public class PrototypeBean {
    private String message;
}

+ 이외에도 Request스코프 , Session스코프 , Application 스코프 , WebSocket 스코프가 있습니다.

'자바 > 스프링' 카테고리의 다른 글

HTTP 데이터 삽입 방법  (0) 2023.07.01
스프링 컨트롤러 Mapping  (0) 2023.06.29
@Autowired 자동주입  (0) 2023.06.26
빈(Bean) 등록 심화  (0) 2023.06.26
컴포넌트 스캔  (0) 2023.06.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함