0. 목차
- JAVA 객체의 Life Cycle
- Spring Bean의 Life Cycle
- References
1. JAVA 객체의 Life Cycle
객체의 Life Cycle에 대해 알아보자.
아래와 같이 크게 5단계로 나눌 수 있다.
- 객체생성
- 초기화
- 사용중
- Finalized
- 소멸
1-1. 객체 생성
객체를 위한 메모리 공간을 Heap 영역에 할당, 클래스(설계도)로 부터 객체(완제품)을 new 키워드를 사용하여 생성
1-2. 초기화
객체가 생성되면 해당 객체의 인스턴스 변수들이 기본값으로 초기화 되며 생성자를 통해 인스턴스 변수를 원하는값으로 설정할 수 있다.
1-3. 사용중
초기화된 객체는 다른 객체에 의해 참조되어 있는 상태이다.
메서드 호출, 변수 조작 등과 같은 작업을 통해 객체를 활용할 수 있고 이 단계에서 여러기능을 수행하고 다양한 상태를 가질수 있다.
Garbage Collector의 대상이 되지 않는다
* Garbage Collector(이하 GC)
GC란 JVM내에서 메모리 관리를 담당하는 주요 구성요소이다.
동적으로 할당한 객체들 중에서 더이상 사용되지않는 객체를 찾아내고, 해당 객체들이 사용한 메모리를 자동으로 회수한다.
개발자는 명시적으로 메모리를 해제할 필요가 없으며 GC가 자동으로 더 이상 참조되지 않는 객체를 탐지하여 회수한다.
1-4. Finalized
finalizer를 통해 finalize가 실행된 후의 상태,
객체의 finalize()가 정의되어 있을 경우 실행된다.
finalize()가 정의되어 있지 않을경우 GC의 stack에 추가된다
1-5. 소멸
객체가 더이상 사용되지 않을때 GC에 의해서 소멸(메모리의 반환) 된다.
1-6. 결론
JAVA의 객체는 new 키워드를 통해 Heap영역에 객체를 생성하며 객체내 변수들을 초기화 하고, 사용되며 사용이 끝날시 GC에 의해 소멸된다.
2. Spring Bean의 Life Cycle
Bean 객체의 Life Cycle에 대해 알아보자.
아래와 같이 크게 4단계로 나눌수 있다.
- 인스턴스화
- 의존성주입
- 초기화
- 사용중
- 소멸
2-1. 인스턴스화
Bean 객체의 인스턴스를 생성, Bean 클래스의 기본생성자를 호출하여 객체를 생성한다.
2-2. 의존성 주입(DI / Dependency Injection)
생성된 Bean 객채에 대해 의존성을 주입한다.
과정은 아래와 같다.
- Spring IoC 컨테이너 생성
- 어노테이션과 설정파일을 읽어 IoC컨테이너 안에 Bean으로 등록
의존성 주입은 2가지 방법으로 나뉜다
- 생성자 주입
- Setter 주입
2-2-1. 생성자 주입
객체의 생성과 의존관계 주입이 동시에 일어남
* 생성자 주입으로 인한 이점
1) null을 주입하지 않는 한 NullPointerException은 발생하지 않는다.
2) 의존관계를 주입하지 않은 경우 객체를 생성할 수 없다.
- 의존관계에 대한 내용을 외부로 노출시킴으로써 컴파일 타임에 오류를 잡아낼 수 있다.
2-2-2. Setter 주입
객체의 생성 -> 의존관계 주입으로 라이프 사이클이 나누어져 있음
2-3. 초기화
Bean객체는 초기화되기 전에 초기화 콜백 메서드를 호출할 수 있다.
InitializingBean 인터페이스를 구현하거나 @PostConstruct 어노테이션을 사용하여 초기화 콜백 메서드를 지정할 수 있다.
이 단계에서 Bean객체를 초기화하고 필요한 설정을 수행할 수 있다.
2-4. 사용중
Bean객체들과 협력하여 비즈니스 로직을 수행하거나 필요한 작업을 수행함
2-5. 소멸
Bean객체가 더 이상 필요하지 않게 되면 소멸한다.
DisposableBean 인터페이스를 구현하거나 @PreDestroy 어노테이션을 사용하여 소멸 콜백메서드를 지정할 수 있다.
이 단계에서 리소스 해제 또는 정리작업을 수행할 수 있다
2-6. 결론
Spring 프레임워크는 Bean객체의 Life Cycle을 자동으로 관리해주며 Bean객체를 초기화하고, 필요한 의존성을 주입한다.
애플리케이션이 종료될때 Spring은 등록된 Bean객체들의 소멸 메서드를 호출하여 리소스를 정리하고 필요에 따라 초기화와 소멸단계에서 추가적인 로직을 구현할 수 있다.
3. References
3-1. Blog 1
https://lemontia.tistory.com/649
3-2. Blog 2
https://dev-coco.tistory.com/170
'JAVA' 카테고리의 다른 글
23-07-10 객체 지향 프로그래밍 (OOP / Object-Oriented Programming) (0) | 2023.07.10 |
---|---|
23-03-02(2) JAVA (스레드 (0) | 2023.03.02 |
23-02-02(2) JAVA (set인터페이스, Hash, Tree) (0) | 2023.02.02 |
23-02-01(2) JAVA (Calender클래스, DecimalFormat 클래스, SimpleDateFormat, 컬렉션 프레임워크, List 인터페이스) (0) | 2023.02.01 |
23-01-31 (2) JAVA (StringBuffer, Math 클래스, Wrapper 클래스 (0) | 2023.01.31 |