bean scope는 컨테이너가 인스턴스를 몇 개 만들고 얼마나 오래 유지하는지를 제어합니다. 생명주기 콜백은 bean이 생성된 직후와 소멸되기 직전에 코드를 실행할 수 있게 합니다.
bean scope는 컨테이너가 인스턴스를 몇 개 만들고 얼마나 오래 유지하는지를 제어합니다. 생명주기 콜백은 bean이 생성된 직후와 소멸되기 직전에 코드를 실행할 수 있게 합니다.
@Service // singleton by default — one shared OrderService for the whole app
public class OrderService { }
@Component
@Scope("prototype") // fresh instance on every getBean/inject
public class ReportBuilder { }
전형적인 함정: prototype을 singleton에 주입하는 것. singleton은 한 번만 연결되므로 단일 prototype 인스턴스를 영원히 유지합니다 — "매번 새로"라는 약속이 깨집니다. @Lookup, ObjectProvider<ReportBuilder>, 또는 scoped-proxy로 해결하세요.
@Component
public class ConnectionPool {
@PostConstruct // runs after dependencies are injected, before use
public void open() { /* open sockets, warm caches */ }
@PreDestroy // runs on graceful container shutdown (singletons only)
public void close() { /* release resources */ }
}
중요: Spring은 prototype bean에 대해 @PreDestroy를 호출하지 않습니다 — 넘겨준 뒤 추적을 멈추므로, 그 정리는 여러분의 몫입니다.
이것은 Spring을 마법으로 취급하는 사람과 컨테이너를 이해하는 사람을 가릅니다. singleton이 prototype을 붙들고 있는 버그는 미묘하면서 실제 프로덕션 버그를 일으키기 때문에 면접에서 애용되는 시나리오입니다. singleton이 무상태(stateless)이고 스레드 안전(thread-safe)해야 한다는 것(모든 요청 스레드에 걸쳐 공유되므로)을 아는 것이 면접관이 듣고 싶어 하는 실무적 교훈입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기