Spring/스프링 핵심 원리 - 기본편

[빈 스코프] 싱글톤 스코프 빈 & 프로토타입 스코프 빈 조회하기

alsruds 2024. 1. 2. 22:12
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

💡싱글톤 스코프 빈 조회하기

☑️ 스프링 컨테이너 생성 시점에 빈 초기화 메서드 실행

☑️ 같은 인스턴스 빈 조회

☑️ 종료 메서드 정상 호출

 

· test/java/hello.core/scope/SingletonTest

public class SingletonTest {

    @Test
    void singletonBeanFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class);

        // 빈 조회하기
        SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
        SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);
        System.out.println("singletonBean1 = " + singletonBean1);
        System.out.println("singletonBean2 = " + singletonBean2);
        assertThat(singletonBean1).isSameAs(singletonBean2); // 같은 인스턴스 객체인지 검증

        ac.close();
    }

    @Scope("singleton")
    static class SingletonBean {
        // 초기화 메서드 호출
        @PostConstruct
        public void init() {
            System.out.println("SingletonBean.init");
        }

        // 종료 메서드 호출
        @PreDestroy
        public void destroy() {
            System.out.println("SingletonBean.destroy");
        }
    }
}

 

 

💡프로토타입 스코프 빈 조회하기

☑️ 스프링 컨테이너에서 빈 조회 시, 초기화 메서드 실행

☑️ 2번 조회 → 서로 다른 스프링 빈 생성 & 초기화 메서드 2번 실행

☑️ 종료 메서드 호출 안됨

 

· test/java/hello.core/scope/PrototypeTest

public class PrototypeTest {

    @Test
    void prototypeBeanFind() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);

        // 첫 번째 객체 조회
        System.out.println("find prototypeBean1");
        PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
        
        // 두 번째 객체 조회
        System.out.println("find prototypeBean2");
        PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);
        
        // 객체 비교
        System.out.println("prototypeBean1 = " + prototypeBean1);
        System.out.println("prototypeBean2 = " + prototypeBean2);
        assertThat(prototypeBean1).isNotSameAs(prototypeBean2); // 다른 인스턴스 객체인지 검증

        ac.close();
    }

    @Scope("prototype")
    static class PrototypeBean {
        // 초기화 메서드
        @PostConstruct
        public void init() {
            System.out.println("PrototypeBean.init");
        }

        // 종료 메서드
        @PreDestroy
        public void destroy() {
            System.out.println("PrototypeBean.destroy");
        }
    }
}

 

프로토타입 빈 특징 정리
- 스프링 컨테이너에 요청할 때마다 새로운 빈 객체 생성
- 스프링 컨테이너가 관여하는 부분 : 빈 생성 & 의존 관계 주입 & 초기화
- 종료 메서드 호출 X
- 빈 조회 & 종료 메서드 호출 → 클라이언트가 직접 실행