@Configuration 설정 클래스의 @Bean 설정과 싱글톤 객체에 대한 이야기를 다뤄보도록 하겠다. 스프링으로 빈 객체를 다루면서 생길 수 있는 궁금증을 해소해보자.
@Bean 애노테이션을 붙인 메서드에서 객체를 생성하면 빈 객체로 등록된다. 그렇다면 예를 들어 상황을 가정해보자. memberDao() 메서드를 실행하는 memberRegSvc(), changePwdSvc() 메서드가 있다. 그렇다면 이 두 메서드가 받아온 MemberDao 객체는 서로 다른 객체 아닐까?
스프링 컨테이너가 생성한 빈은 싱글톤 객체다. 싱글톤이라는 것은 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다. 즉 다른 설정 메서드에서 MemberDao()를 몇 번 호출하든 반환하는 객체는 항상 같은 객체라는 것이다.
스프링에서 우리가 작성한 설정 클래스를 그대로 사용하지 않기 때문이다.
스프링은 설정 클래스를 상속하는 새로운 설정 클래스를 만들어 사용한다. 한 번 생성한 객체를 보관했다가 이후부터는 동일한 객체를 반환하도록 한다.
싱글톤 범위가 아닌 프로토타입 범위의 빈을 설정하고 싶은 경우 어떻게 할 수 있을까? 속성 값으로
"prototype"
을 가지는@Scope
애노테이션을 사용하면 된다.예시✔️
@Configuration public class AppStxWithPrototype { @Bean @Scope("prototype") public Client client() { Client client = new Client(); client.setHost("host"); return client; } }
이렇게 되면 해당 빈은 프로토타입 범위를 가지는 빈이 되므로, 완전한 라이프사이클을 가지지 않는다. 따라서, 빈 객체의 소멸 처리를 코드에서 직접 해야할 필요가 있다.
라이프 사이클이란?✏️
스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.
객체 생성
>의존 설정
>초기화
>소멸
스프링 컨테이너가 생성한 빈은 별도의 설정을 하지 않으면 싱글톤 객체이므로, memberRegSvc(), changePwdSvc() 메서드에서의 MemberDao 객체는 항상 같다.
- 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 | 최범균님 저