You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@WebServlet 을 사용하면 애노테이션 하나로 서블릿을 편리하게 등록할 수 있다. 하지만 애노테이션 방식을 사용하
면 유연하게 변경하는 것이 어렵다. 마치 하드코딩 된 것 처럼 동작한다. 아래 참고 예시를 보면 /test 경로를 변경하고 싶으면 코드를 직접 변경해야 바꿀 수 있다.
반면에 프로그래밍 방식은 코딩을 더 많이 해야하고 불편하지만 무한한 유연성을 제공한다.
예를 들어서
/hello-servlet 경로를 상황에 따라서 바꾸어 외부 설정을 읽어서 등록할 수 있다.
참고
서블릿 컨테이너 초기화만 있어도 될 것 같은데, 왜 이렇게 복잡하게 애플리케이션 초기화라는 개념을 만들었을까?
편리함
서블릿 컨테이너를 초기화 하려면 ServletContainerInitializer 인터페이스를 구현한 코드를 만들어야 한다. 여기에 추가로 META-INF/services/jakarta.servlet.ServletContainerInitializer 파일에 해당 코드를 직접 지정해주어야 한다.
애플리케이션 초기화는 특정 인터페이스만 구현하면 된다.
의존성
애플리케이션 초기화는 서블릿 컨테이너에 상관없이 원하는 모양으로 인터페이스를 만들 수 있다. 이를 통해 애플리케이션 초기화 코드가 서블릿 컨테이너에 대한 의존을 줄일 수 있다. 특히 ServletContext ctx 가 필요없는 애플리케이션 초기화 코드라면 의존을 완전히 제거할 수도 있다
스프링 컨테이너 등록
이번에는 WAS와 스프링을 통합 진행
앞서 배운 서블릿 컨테이너 초기화와 애플리케이션 초기화를 활용하면 된다.
다음 과정 진행
스프링 컨테이너 만들기
스프링 MVC 컨트롤러를 스프링 컨테이너에 빈으로 등록하기
스프링 MVC를 사용하는데 필요한 디스패처 서블릿을 서블릿 컨테이너 등록하기
build.gradle - spring-webmvc 추가
implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0'
implementation 'org.springframework:spring-webmvc:6.0.4'
spring-webmvc 라이브러리를 추가하면 스프링 MVC 뿐 아니라 spring-core를 포함한 스프링 핵심 라이브러리들도 함께 포함된다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
서블릿 컨테이너 초기화1
스프링을 사용한다면 스프링 컨테이너를 만들고, 서블릿과 스프링을 연결하는 디스페처 서블릿도 등록해야 한다.
web.xml을 사용해서 초기화했지만, 지금은 서블릿 스펙에서 자바 코드를 사용한 초기화도 지원한다.서블릿 컨테이너와 스프링 컨테이너
서블릿 컨테이너 초기화 개발
ServletContainerInitializer라는 초기화 인터페이스를 제공한다. 이름 그대로 서블릿 컨테이너를 초기화 하는 기능을 제공한다.onStartup()을 호출해준다. 여기서 애플리케이션에 필요한 기능들을 초기화 하거나 등록할 수 있다.ServletContainerInitializer
Set<Class<?>> c: 조금 더 유연한 초기화를 기능을 제공한다.@HandlesTypes애노테이션과 함께 사용한다.ServletContext ctx: 서블릿 컨테이너 자체의 기능을 제공한다. 이 객체를 통해 필터나 서블릿을 등록할 수 있다.hello/container/MyContainerInitV1resources/METAINF/services/jakarta.servlet.ServletContainerInitializerhello.container.MyContainerInitV1이 파일에 방금 만든MyContainerInitV1클래스를 패키지 경로를 포함해서 지정해주었다.이렇게 하면 WAS를 실행할 때 해당 클래스를 초기화 클래스로 인식하고 로딩 시점에 실행한다.
서블릿 컨테이너 초기화2
HelloServlet이라는 서블릿을 서블릿 컨테이너 초기화 시점에 프로그래밍 방식으로 직접 등록해줄 것이다.서블릿을 등록하는 2가지 방법
@WebServlet애노테이션HelloServlet
애플리케이션 초기화
AppInit
HelloServlet서블릿을 서블릿 컨테이너에 직접 등록한다./hello-servlet을 호출하면HelloServlet서블릿이 실행된다.서블릿을 등록하는 2가지 방법
@WebServlet애노테이션참고 - 프로그래밍 방식을 사용하는 이유
@WebServlet을 사용하면 애노테이션 하나로 서블릿을 편리하게 등록할 수 있다. 하지만 애노테이션 방식을 사용하면 유연하게 변경하는 것이 어렵다. 마치 하드코딩 된 것 처럼 동작한다. 아래 참고 예시를 보면 /test 경로를 변경하고 싶으면 코드를 직접 변경해야 바꿀 수 있다.
/hello-servlet경로를 상황에 따라서 바꾸어 외부 설정을 읽어서 등록할 수 있다.참고 예시
MyContainerInitV2
초기화는 다음 순서로 진행된다.
참고
서블릿 컨테이너 초기화만 있어도 될 것 같은데, 왜 이렇게 복잡하게 애플리케이션 초기화라는 개념을 만들었을까?
스프링 컨테이너 등록
다음 과정 진행
HelloController
hello spring!출력한다.HelloConfig
AppInitV2Spring
스프링 컨테이너 생성
스프링 MVC 디스패처 서블릿 생성, 컨테이너 연결
디스패처 서블릿을 서블릿 컨테이너에 등록
주의! 서블릿을 등록할 때 이름은 원하는 이름을 등록하면 되지만 같은 이름으로 중복 등록하면 오류가 발생한다. 여기
서는 dispatcherV2 이름을 사용했는데, 이후에 하나 더 등록할 예정이기 때문에 이름에 유의하자
실행 과정 정리
/spring/hello-spring스프링 MVC 서블릿 컨테이너 초기화 지원
서블릿 컨테이너 초기화 과정은 상당히 번거롭고 반복되는 작업이다. 스프링 MVC는 이러한 서블릿 컨테이너 초기화 작업을 이미 만들어두었다. 덕분에 개발자는 서블릿 컨테이너 초기화 과정은 생략하고, 애플리케이션 초기화 코드만 작성하면 된다.
스프링이 지원하는 애플리케이션 초기화를 사용하려면 다음 인터페이스를 구현하면 된다.
WebApplicationInitializer
AppInitV3SpringMvc
참고
스프링 MVC가 제공하는 서블릿 컨테이너 초기화 분석
SpringServletContainerInitializer
그림 정리
정리
Beta Was this translation helpful? Give feedback.
All reactions