inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 부트 - 핵심 원리와 활용

스프링 컨테이너 등록

AppInitV1Servlet 사용시 질문

445

suyeonjung

작성한 질문수 2

1

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]

 

안녕하세요,

 

AppInitV1Servlet 를 사용할때,
02 pdf. 21쪽

 

HandlesTypes 를 사용하지도 않았는데, 어떻게 AppInitV1Servlet이 등록 된 것인가요..?

 

MyContainerInitV2에서는 서블릿컨테이너 초기화 시점에, @HandlesTypes(AppInit.class)를 통해 지정해 주어

set<Class<?>> c.... 를 통해 넣는 것은 이해가 되는데,

이 과정이 자동으로 일어난것인가요?

자동으로 일어났다고 보기에, Appinit은 직접 만든 인터페이스여서 이해가 되지 않습니다...

 

설명 부탁드립니당

spring spring-boot prometheus grafana

답변 2

1

김영한

안녕하세요. suyeonjung님

@HandlesTypes(AppInit.class)를 선언하게 되면 서블릿 컨테이너는 실행 시점에 AppInit 인터페이스를 구현한 모든 클래스를 찾아서 Set<Class<?>> c에 넣어줍니다.

직접 만든 인터페이스이지만 @HandlesTypes(AppInit.class)를 통해서 선언되었기 때문에 가능합니다.

@HandlesTypes(AppInit.class)

public class MyContainerInitV2 implements ServletContainerInitializer {

    @Override

    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {

        System.out.println("MyContainerInitV2.onStartup");

        System.out.println("MyContainerInitV2 c = " + c);

        System.out.println("MyContainerInitV2 container = " + ctx);

        for (Class<?> appInitClass : c) {

            try {

                //new AppInitV1Servlet()과 같은 코드

                AppInit appInit = (AppInit) appInitClass.getDeclaredConstructor().newInstance();

                appInit.onStartup(ctx);

            } catch (Exception e) {

                throw new RuntimeException(e);

            }

        }

    }

}

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

질문 내용을 보면 AppInitV1Servlet을 사용할 때, @HandlesTypes(AppInit.class) 어노테이션을 사용하지 않았는데도 서블릿 컨테이너 초기화 시점에 자동으로 등록이 되었다는 것이 궁금하신 것 같아요.

이 부분은 Servlet 3.0부터 추가된 자동 서블릿 발견 기능 때문입니다. 이 기능을 통해 서블릿 컨테이너는 클래스 경로에서 web.xml 파일이나 @WebServlet 어노테이션을 참조하지 않고도 모든 서블릿 클래스를 확인하고 인스턴스화 할 수 있습니다.

따라서 AppInitV1Servlet은 자동으로 발견되어 서블릿 컨테이너에 등록되었던 것입니다.

하지만 AppInitV1Servlet이 등록되기 위해서는 해당 서블릿에 대한 초기화 작업이 수행되어야 합니다. 이 때, 해당 서블릿이 AppInit 인터페이스를 구현하고 있다면, 이를 통해 서블릿 컨테이너는 AppInitV1Servlet의 초기화 작업을 수행하게 됩니다.

즉, 자동으로 등록되기 때문에 @HandlesTypes 어노테이션이나 web.xml 파일 등을 사용하여 따로 지정해 줄 필요가 없지만, 해당 서블릿이 특정 인터페이스를 구현하고 있어 초기화 작업이 필요한 경우, 해당 인터페이스를 서블릿 컨테이너가 인식하여 초기화 작업을 수행하는 것입니다.

초기화 작업이 수행되는 시점에 대한 자세한 내용이 궁금하시다면, Servlet 3.0 Specification 문서를 참고하시면 좋을 것 같습니다.

이해에 도움이 되었길 바라며, 추가적인 질문이 있으면 언제든지 댓글로 남겨주세요. 감사합니다.

보안이 엄격한 데이터

0

73

1

MyProperties 자체를 클라이언트 코드에서 사용

1

43

1

http://localhost:8080/actuator/prometheus

0

85

3

jar 추가에대한 질문드려도될까요?

0

64

1

build.gradle bom link 변경

0

65

2

@Counted 초기화

0

48

1

@Validated를 적용해도 빈 검증이 안되는 경우에 대한 조치 공유..

0

101

2

springboot에서 actuator없이 micrometer를 사용할수 있나요?

0

67

1

@Configuration 질문드립니다.

0

84

2

[공유] 터미널 말고 IDE 에서 jar 실행하기

0

101

1

localhost:8080/hello-servlet 404오류

0

123

2

내장톰캣2 서블릿 톰켓 실행이 안됩니다

1

154

2

최대 Tomcat 스레드 수를 확인하는 지표

0

160

1

mac m2에서 startup.sh 실행후 아무 반응이 없습니다.

0

94

2

내장 톰캣 실행 오류 관련 질문드립니다.

0

158

1

스프링 발전 과정들도 자세히 알아둬야하나요??

1

127

1

스프링부트 ioc 컨테이너 갯수

0

89

1

404 페이지

0

133

3

actuator 호출시 타임스탬프 질문

0

90

1

순수 라이브러리 사용하기 2 - memory-v1

0

125

1

외부설정 @ConfigurationProperties의 내부 클래스에서 static을 사용하는 이유를 알고 싶습니다.

0

105

1

서블릿 컨테이너 초기화1 강의 관련 질문입니다~

0

94

1

Thread Config Max 패널 설정 변경 질문

0

128

1

스프링 액츄에이터 shutdown 엔드포인트 활성화가 안됩니다.

0

108

1