• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

AppInitV1Servlet 사용시 질문

23.06.15 14:27 작성 조회수 306

0

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


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은 직접 만든 인터페이스여서 이해가 되지 않습니다...

 

설명 부탁드립니당

답변 2

·

답변을 작성해보세요.

0

안녕하세요. 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 인턴

2023.06.17

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

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

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

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

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

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

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

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

채널톡 아이콘