인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

스프링 핵심 원리 - 기본편

섹션 9 빈 스코프 질문입니다.

작성

·

206

·

수정됨

0

1.프로토타입 스코프 11분 28초에 preDestory같은 메소드가 실행되지 않는다고 했는데요.ac.close(); 이건 preDestory가 아닌가요?

 

2.프로토타입 스코프 11분 28초싱글톤 빈은 하나의 빈으로 종료까지 관여 하는거고 프로토타입스코프는 여러개의 빈이 생성되고 초기화까지만 관여하는걸로 이해해 도 되나요?

3.프로토타입 스코프 10분 강의 똑같이 따라 쳤는데 아래와 같은 에러가나옵니다. 뭐가 문제인건가요?

package hello.core.scope;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class PrototypeTest {
    @Test
    void prototypeBeanFind(){
        AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(PrototypeBean.class);
        PrototypeBean prototypeBean1=ac.getBean(PrototypeBean.class);
        PrototypeBean prototypeBean2=ac.getBean(PrototypeBean.class);
        System.out.println("prototypeBean2 = " + prototypeBean2);
        System.out.println("prototypeBean1 = " + prototypeBean1);
        Assertions.assertThat(prototypeBean2).isNotSameAs(prototypeBean1);//똑같은 인스턴스가 출력됨.
        ac.close();
    }


    @Scope("Prototype")

    static class PrototypeBean{
        @PostConstruct
        public void init(){
            System.out.println("Prototype.init");
        }
        @PreDestroy
        public void destory(){
            System.out.println("Prototype.destory");
        }
    }

}

java.lang.IllegalStateException: No Scope registered for scope name 'Prototype'

이런에러가 나오는데 뭐가문제인가요?

4.파란색선인 프로토타입이닛보다 빨간색프로토타입 빈2가 더빨리 나와야 하는거 아닌가요?println이 더 먼저 있는데요.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

  1. ac.close(); 명령어는 스프링 컨테이너를 종료하는 명령어입니다. 프로토타입 스코프의 경우, 스프링 컨테이너는 빈의 생성과 초기화 (init)까지만 관여하고, 이후 소멸 과정은 관여하지 않기 때문에 @PreDestroy와 같은 소멸 메서드는 실행되지 않습니다.

  2. 맞습니다. 싱글톤 스코프의 빈은 스프링 컨테이너에 의해 생성, 초기화, 관리, 그리고 종료까지 책임집니다. 반면에 프로토타입 스코프의 빈은 스프링 컨테이너가 생성과 초기화만 수행하며, 그 이후에는 컨테이너가 빈을 관리하지 않습니다. 따라서 프로토타입 스코프의 빈에 대한 생명주기는 개발자가 직접 관리해야 합니다.

  3. 에러 메시지와 함께 제시된 코드를 보면, @Scope 애노테이션의 값에 오타가 있습니다. 'Prototype'이 아니라 'prototype'이라고 소문자로 작성해야 합니다. 정확한 사용법은 @Scope("prototype") 이렇게 소문자로 명시하는 것입니다.

  4. 관련된 이미지 확인이 불가능하므로 정확한 답변을 드리기 어렵습니다. 하지만 일반적으로 println 명령어가 먼저 있어도 실제 출력 순서는 JVM이나 시스템의 상황에 따라 달라질 수 있습니다. 코드 실행 중 스레드 스케줄링이나 기타 요인으로 실행 순서가 바뀔 수 있기 때문입니다.

도움이 되셨기를 바랍니다, ekek님. 추가적인 질문이 있으시다면 언제든지 질문해주세요!

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

질문하기