스프링부트로 스프링을 접해서 몰랐는데 레거시 스프링을 접하게 되면서 정말 스프링부트는 미쳤다는 걸 체감하고 있다.
서블렛 컨테이너 등록 VS 내장 서블렛 컨테이너
레거시는 별도의 서블렛 컨테이너(웹 애플리케이션 서버)를 미리 준비하고 그 위에 스프링 프로젝트를 올린다.
이후 빌드할 때도 war파일을 서블렛 컨테이너에 올려야 한다.
스프링부트는 기본적으로 서블렛 컨테이너가 내장되어 있어 별도의 서버 설치 없이 실행할 수 있다.
빌드시에도 jar 파일만으로 배포할 수 있다.
web.xml
spring legacy 프로젝트 생성시 자동으로 생성되긴 하지만 web.xml에 ContextLoaderListener를 통해 Dispatcher Servlet을 서블렛 컨테이너(톰캣)에 올리는 것을 명시한다. POST 요청 내에 한글 처리를 위한 UTF-8 필터도 수동으로 달아줘야한다.
root-context, servlet-context
servlet-context에 controller, viewResolver, resource 매핑같이 web과 관련된 빈을 등록하고, 컴포넌트 스캔을 xml로 진행한다. interceptor나 multipartResolver와 같이 웹에서 필요한 빈들도 수동으로 등록해야한다.
root-context.xml은 web과 관련없는 빈들을 위한 컴포넌트 스캔, datasource 빈 등록을 진행한다.
스프링부트에서는 많은 설정 빈들이 내장되어 있고 application 설정파일과 어노테이션으로 대체된다.
Resource, View
webapp 밑의 다양한 설정파일은 추상화되어 사라지고, JSP가 있던 views는 템플릿엔진을 사용하는 resources.templates로 바뀐다.
의존성 관리
레거시 스프링도 maven이나 gradle로 의존성 관리는 할 수 있지만 스프링과 연결되는 라이브러리의 버젼들을 따로 설정해야해 버젼 충돌이 잦을 수 있지만, 스프링부트는 스프링부트 버젼에 따라 연관된 라이브러리 버젼을 알아서 관리해준다.
정리
스프링부트는 GOAT다