빈이 생성되고 존재하고 적용되는 범위. @Scope 애노테이션으로 지정하고 기본값은 싱글톤이다.
싱글톤, 프로토타입, 웹 스코프
싱글톤은 스프링 프레임워크의 기본 스코프다. 컨테이너 시작부터 종료까지 객체 하나로 유지되고 스프링이 시작할 때 만들어진다.
프로토타입은 빈의 생성, 의존관계 주입, 초기화까지만 관여하고 그 뒤로는 컨테이너가 관리하지 않는다. 요청할 때마다 새로 만들어지고, 스레드끼리 공유하지 않으므로 상태를 가져도 된다. 컨테이너가 손을 뗐으니 소멸 콜백도 불리지 않는다.
웹 스코프는 셋으로 나뉜다. request는 요청이 들어오고 나갈 때까지, session은 세션이 생성되고 종료될 때까지, application은 서블릿 컨텍스트와 같은 생명주기를 갖는다. 서블릿 컨텍스트는 웹 애플리케이션 안의 모든 서블릿을 관리하며 정보를 공유하게 해주는 것으로, 톰캣 컨테이너가 실행될 때 애플리케이션 하나당 하나 생기고 보통 톰캣의 시작과 종료에 수명을 맞춘다.
상태를 가지면 안 되는 싱글톤
싱글톤 스코프의 빈은 상태를 가지면 안 된다. 빈이 value라는 상태를 갖고 있고 스레드 1이 그 값을 증가시키는 사이 스레드 2가 같은 값을 가져다 쓴다면, 빈의 상태를 예측할 수 없어 의도한 결과가 나온다고 보장할 수 없다. 서블릿에 상태를 두면 안 되는 것과 같은 이야기다.
구현체가 둘 이상일 때
의존성을 자동 주입해야 하는 인터페이스에 구현체가 둘 이상이어도 충돌한다.
@Repository
public class InMemoryStationDao implements StationDao { }
@Repository
public class JdbcStationDao implements StationDao { }이 상태로 StationService가 StationDao를 생성자로 받으면 스프링은 어느 것을 넣어야 할지 모른다. 주입할 구현체가 하나로 정해져 있으면 @Primary로 우선순위를 주고, 상황에 따라 다른 구현체가 들어가야 하면 @Qualifier로 이름을 지정한다.