스프링 부트 - 핵심 원리와 활용 - 섹션2. 웹 서버와 서블릿 컨테이너
CS/김영한 스프링 강의

스프링 부트 - 핵심 원리와 활용 - 섹션2. 웹 서버와 서블릿 컨테이너

예전엔 스프링 실행하려면 서버를 만들고 빌드해서 나온 war 파일을 이 서버 위에 올려서 실행하는 거였다. 근데 부트가 나오면서 서버가 안으로 들어가 빌드해서 나온 jar 파일을 실행하기만 하면 즉, 그냥 main() 실행하면 알아서 안에 서버가 실행되고 빌드한 코드가 실행된다.

 

이렇게 자동으로 부트가 해주는 원리를 이해하기 위해 부트 없이 쌩으로 해보는거다.

 

 

 

톰캣을 다운받고 정말 boot가 아닌 종속성이 아무것도 없는 형태의 프로젝트를 실행한다. plugins로 war가 있어서 파일을 빌드한 뒤 나온 war를 톰캣에다가 줄거다.

 

hello world를 보기위한 최소한의 코드만 작성해보자.

 

 

이제 빌드해서 war파일을 만든다.

 

그럼 플러그인에 war가 있기 때문에 war가 빌드 결과로 나온다.

압축을 풀 필요는 없지만 구조를 알기위해 풀어보자.

 

 

war는 웹 애플리케이션 서버 위에서 실행되지만 물론 자바가 그 밑에 있고..

폴더 구조는 문법이다.

 

어쨋든 톰캣서버를 끄고, 빌드해서 나온 war파일을 ROOT.war로 이름을 바꾼 뒤 톰캣 설치폴더의 webapps에 넣어준다.

 

그리고 서버를 다시 실행하면 된다.

 

 

보면 지가 알아서 압축 풀어서 분석했다.

 

 

이 과정이 귀찮으니 보통 IDE는 이걸 자동화하게 만들었다. 걍 알아서 하자.

 

 

 

 

최종적으로 이런 그림이 나온다. 뒤로 갈수록 너무 복잡해져서 미리 보고 가자.

 

 

 

이제 서블릿 컨테이너를 직접 만들어서 해볼거다.

이게 무슨말이냐면 아까 했던 어노테이션으로 url /test 같은걸 직접 해보는거임.

이럴려면 해당 servlet을 어떻게 처리해야 하는가는 저장하는 서블릿 컨테이너에 만들어 클래스와 연결해주는거다.

 

META-INF에 초기화할 클래스를 알려줘야 한다. 즉 WAS에게 알려주는 것.

 

일단 서블릿 컨테이너를 초기화하여 실행했을 때 연결되어 있는 클래스가 없다는 걸 볼 수 있다.

이제 다른방식으로 컨테이너를 만들고 여기에 서블릿을 등록해볼거다. 서블릿을 등록하는 방법은 위에서 사용한 @WebServlet 어노테이션을 써서 등록하는 것과 프로그래밍 방식 2가지가 있다. @WebServlet은 해봤으니 프로그래밍 방식을 해볼거다.

 

일단 컨테이너에 들어갈 HttpServlet를 만든다. 이 다음은 위에서 했던 것처럼 컨테이너를 초기화시켜 이 서블릿을 넣을건데 appinit 방식으로 초기화를 해보자.

 

중요한건 클래스를 그냥 연결시키는게 아니라 new로 인스턴스를 만든걸 주는 것. 저렇게 url을 매핑했다.

 

아까 만든 AppInit을 상속해서 만든 서블릿을 클래스를 순회하며 서블릿 컨테이너가 담긴 ctx도 함께 전달한다.

 

 

 

 

 

 

서블릿 컨테이너는 해봤으니 이제 스프링 컨테이너를 등록해보자.

일단 스프링부터 설치하고..

여기선 빈으로 직접 등록함

 

이제 이 스프링 컨테이너 만들었으니 이걸 서블릿 컨테이너에 등록한다.

이게 url 하나만 저장하는거다보니 생성한걸 연결하고 생성한걸 연결하고 해서 많이 복잡해보인다.

그럼 등록한 컨트롤러가 잘 실행된다.

 

 

 

이제 이걸 스프링이 지원하는 애플리케이션 초기화를 사용해서 만들어보자.

 

 

 

 

라이브러리를 들여다보면 사실 스프링이 지원하는 걸 사용하는것도 보면 지원 없이 쌩으로 만들고 등록했던 과정을 똑같이 따라하고 있다.

 

 

 

 

 

 

다음 섹션에선 이 과정들이 부트로 넘어가며 세대교체가 된다.