Repository navigation
Bean 생명주기 #44
Replies: 2 comments
1. Bean의 생명주기는 어떤 단계로 이루어져 있나요?Spring Bean 기준, 일반적인 생명주기는 다음 순서이다.
단, prototype 범위의 Bean은 생성과 초기화까지만 컨테이너가 관리하며, 소멸 단계는 자동으로 처리하지 않는다. 2. 생명주기 콜백(초기화/소멸 메서드)은 어떤 방식으로 등록하고 실행할 수 있나요?
예를 들어 Bean 클래스의 메서드에 한 Bean에 여러 방식을 함께 지정하면 실행 순서는 다음과 같다.
3. Bean의 스코프(싱글턴, 프로토타입 등)는 생명주기에 어떤 영향을 미치나요?Bean 스코프는 스프링이 Bean 객체를 몇 개 만들고, 언제까지 유지할 지 정하는 설정이다. 이에 따라 생명주기도 달라진다.
초기화 콜백은 위 스코프 모두에서 Bean이 생성될 때 생성된다. 핵심 예외는 prototype의 소멸 콜백이다. 스프링은 prototype Bean을 생성·초기화 해 전달한 뒤에는 그 인스턴스를 계속 관리하지 않는다. 또한 singleton에 prototype Bean을 일반적인 방식으로 주입하면, singleton을 만들 때 생성된 prototype 인스턴스 하나가 주입된다. 사용할 때마다 새 인스턴스가 필요하다면 그때마다 Bean을 조회하는 방식을 써야한다. |
1. Bean의 생명주기는 어떤 단계로 이루어져 있나요?스프링 컨테이너가 뜨면서 설정 정보를 읽고, 어떤 빈을 만들어야 하는지 파악한다. 그다음 생성자를 호출해서 빈 객체를 만들고, 그 빈이 필요로 하는 다른 빈들을 주입해준다. 주입까지 끝나면 빈이 일할 준비를 하는 초기화 작업이 실행되고, 이후 애플리케이션에서 빈을 사용한다. 마지막으로 컨테이너가 종료될 때, 빈이 정리 작업을 하는 소멸단계를 거쳐 사라진다. 2. 생명주기 콜백(초기화/소멸 메서드)은 어떤 방식으로 등록하고 실행할 수 있나요?먼저 생명주기 콜백이란 빈의 생명주기 중 특정 시점이 되면 스프링이 대신 호출해주는 메서드를 말한다. 초기화 콜백은 빈이 만들어지고 의존관계 주입까지 끝나서 이제 이제 일할 준비가 된 시점에 호출된다. 여기서 DB연결이나 설정값 불러오기 같은 작업을 한다. 소멸 콜백은 스프링 컨테이너가 종료되면서 빈이 사라지기 직전에 호출된다. 여기서 DB연결을 끊거나 열어둔 파일을 닫는 등의 정리 작업을 한다. 생명주기 콜백을 등록하고 실행하는 방식에는 3가지가 있다. 첫번째는 스프링이 제공하는 InitializingBean,DisposableBean인터페이스를 구현하는 방식이다. 이 방식은 코드가 스프링에 묶이고, 메서드 이름을 바꿀 수 없고 내가 고칠 수 없는 외부 라이브러리에는 적용할 수 없다는 단점이 있다. 스프링 초기에 쓰던 방식이다. 두번째는 @bean어노테이션에 initMethod랑 destroyMethod를 지정하는 방식이다. 메서드 이름을 자유롭게 정할 수 있고, 빈 코드가 스프링에 의존하지 않는다. 가장 큰 장점은 외부라이브러리에서도 적용할 수 있다. 또 destroyMethod는 따로 지정하지 않아도 close나 shutdown이라는 이름의 메서드가 있으면 스프링이 알아서 호출해준다. 세번째는 @PostConstruct와 @PreDestroy를 메서드에 붙이는 방식이다. 가장 간단하고 권장하는 방식이다. 스프링 전용이 아닌 자바 표준 어노테이션이어서 다른 환경에서도 동작한다. 다만 외부라이브러리 코드에는 어노테이션을 붙일 수 없기 때문에 이럴 땐 두번째 방식을 사용한다. 3. Bean의 스코프(싱글턴, 프로토타입 등)는 생명주기에 어떤 영향을 미치나요?빈의 스코프는 빈이 언제 만들어지고, 얼마나 오래 살아 있고, 누구와 같이 쓰이는지를 정하는 즉 스프링컨테이너가 만든 객체의 생애라고 생각하면 된다. 같은 빈이라도 스코프에 따라 하나만 만들어서 모두가 같이 쓸지(싱글턴), 필요할 때마다 새로 만들지(프로토타입)가 달라진다. 싱글톤은 컨테이너가 시작될 때 딱 하나만 만들어지고, 컨테이너가 종료될 때까지 스프링이 처음부터 끝까지 관리해서 초기화 콜백과 소멸 콜백이 모두 정상적으로 호출된다. 반면 프로통타입은 빈을 요청할 때마다 새로 만들어지기 때문에, 스프링은 빈을 만들고, 의존성주입 하고, 초기화하는 데까지만 책임진다. 빈을 요청한 쪽에 넘겨준 뒤에는 더이상 관리하지 않기 때문에 소멸 콜백이 호출되지 않는다. |
Uh oh!
There was an error while loading. Please reload this page.
📆 일자: 26년 9월 27일(일)
오늘의 질문
스프링에서 객체(Bean)는 개발자가 직접 생성하고 관리하는 것이 아니라 컨테이너가 대신 생성, 초기화, 소멸까지 책임집니다.
Bean이 정확히 어떤 단계를 거쳐 생성되고 사라지는지 이해하고 그 과정에 개발자가 어떻게 개입할 수 있는지 알아보기 위해 발제했습니다.
1. Bean의 생명주기는 어떤 단계로 이루어져 있나요?
2. 생명주기 콜백(초기화/소멸 메서드)은 어떤 방식으로 등록하고 실행할 수 있나요?
3. Bean의 스코프(싱글턴, 프로토타입 등)는 생명주기에 어떤 영향을 미치나요?
All reactions