작성
·
630
·
수정됨
0
[질문 내용]
처음 스프링을 배울 때 spring legacy 프로젝트로 배웠습니다. 따라서 root-context.xml, servlet-context.xml 방식으로 배웠습니다.
이전에 질문 드렸을때, "SpringApplication.run() 메서드는 기본적으로 @SpringBootApplication이 위치한 패키지와 하위 패키지를 시작점으로 모든 클래스를 스캔합니다 따라서 @Configuration, @Component, @Service, @Repository 등의 애노테이션이 있는 클래스를 찾아서 스프링 애플리케이션의 컨텍스트를 생성하는데 사용합니다." 라고 답변을 받았습니다.
하지만 legacy 프로젝트를 실행할때에는 @SpringBootApplication을 따로 적지 않았는데, 어떻게 해당 xml(root, servlet)에서 bean을 읽어오는지 의문이 듭니다.
추가로 xml로 작성하였을때도 SpringApplication.run() 메서드가 자동으로 읽는지도 문의드립니다.
답변 2
1
안녕하세요. asdf님
xml 방식으로 웹 애플리케이션을 실행하는 경우 생각하신 흐름이 맞습니다.
WAS 실행 > web.xml > ContextLoaderListener 생성 > 해당 xml (root-context.xml)로 스프링 컨테이너 구동 > <context:component-scan base-package=로 해당 패키지 하위 빈 등록
여기서 ContextLoaderListener에서 스프링을 생성하면서 xml파일을 읽어들입니다. 이때 ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContext 등을 사용합니다. 이것이 스프링 컨테이너 그 자체라고 생각하시면 됩니다. 그런데 스프링을 시작할 때 설정 파일을 xml로 사용하는 것들이지요. component-scan은 빈들을 편리하게 자동 등록하는 스프링이 제공하는 기능중에 하나입니다. xml에 이렇게 적으면 해당 기능을 활성화합니다.
@SpringBootApplication를 사용하는 경우 스프링이 WAS를 내장하고 직접 동작합니다. 그리고 최신 서블릿에서는 web.xml이 없어도 WAS를 구동할 수 있습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
Spring Legacy 프로젝트에서는 XML 설정 파일을 사용하여 빈(Bean)을 정의합니다. root-context.xml과 servlet-context.xml 파일 안에서
SpringApplication.run() 메서드는 @SpringBootApplication 애노테이션이 위치한 패키지와 하위 패키지를 스캔하여 빈을 등록하는 것이 기본 동작입니다. 또한, XML로 작성된 설정 파일도 자동으로 스캔하여 빈으로 등록할 수 있습니다. 하지만 Legacy 프로젝트에서는 XML 설정 파일을 사용하므로 SpringApplication.run() 메서드는 사용되지 않습니다.
따라서, Spring Legacy 프로젝트에서는 XML 설정 파일 안에서 등록된 빈을 사용하기 위해 해당 파일을 읽어오는 방식으로 동작합니다. XML 설정 파일을 읽어오는 방법으로는 ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContext 등이 있습니다.
이상입니다. 추가적으로 궁금한 점이 있으면 언제든지 댓글로 문의해주세요. 감사합니다.
답변 감사합니다.
답변을 읽다 보니 궁금한게 생겨 문의 드립니다.
제가 프로젝트를 진행할 때 답변 주신 ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContext 등을 사용하지 않았었는데, xml 내 "<context:component-scan base-package=" 이 설정이 해당 역할을 대신한다고 봐도 무방할까요?
또한 실행 순서가 아래와 같은지 문의드립니다.
WAS 실행 > web.xml > ContextLoaderListener 생성 > 해당 xml (root-context.xml)로 스프링 컨테이너 구동 > <context:component-scan base-package=로 해당 패키지 하위 빈 등록