🚂 Spring 파일들의 실행 순서
web.xml 👉🏻root-context.xml👉🏻servlet-context.xml
root-context.xml
서버 구동과 동시에 읽혀지는 web.xml 파일에 의해 거쳐져서 바로 로딩되는 문서 (즉, 2번째로 읽혀지는 파일)
서버 구동 직후에 바로 세팅해야 하는 내용들을 기술하는 공간
예) DB 연동 설정, 트랜잭션 처리 설정, 내외부 모듈 설정, ...
root-context.xml 파일의 설정 방법
✔️ beans : 접두어의 개념
beans 태그로 감싸져 있음
bean 태그들을 하나하나씩 등록시켜 주면 됨
bean: "도구" (자바 객체)
그동안은 우리가 자바 객체가 필요할 경우 일일이 new 구문을 이용해서 객체를 생성해 줬지만
이제는 스프링이 알아서 객체를 생성해 주고 관리할 수 있게끔 함
👉🏻 어느 타입의 (자바 클래스) 어느 이름의 객체 (객체명)을 앞으로 사용할 건지 등록
즉, 내가 등록만 해 주면 스프링이 알아서 객체 생성해서 스프링의 방식으로만 사용할 수 있게끔 해 줌
👉🏻 프레임워크의 강제성
🚂 Spring 파일들의 실행 순서
web.xml 👉🏻 root-context.xml 👉🏻 servlet-context.xml
servlet-context.xml
스프링의 가장 핵심 부품인 DispatcherServlet과 관련된 설정을 기술하는 파일
즉, 요청에 대한 환경설정을 주로 기술
👉🏻 beans: 이제부터 bean 태그를 사용할 수 있음
👉🏻 context: 이곳에서 context라는 내용을 사용할 수 있음
servlet-context.xml 파일의 설정 방법
접두어:태그명 => xmlns: 접두어로 등록된 태그믈만 사용 가능
mvc 라는 접두어는 생략 가능
1) DispatcherServlet Context: defines this servlet's request-processing infrastructure
2) Enables the Spring MVC @Controller programming model
@Controller, @Service와 같은 어노테이션을 사용할 수 있게 해 주는 설정(어노테이션을 사용할 수 있게 활성화하겠음)
이 설정을 해야 하는 이유: 스프링이 알아서 객체로 만들어 관리해 줄 수 있도록 해 주는 방법 중 하나이기 때문
3) Handles HTTP GET requests for /resources/** by eficiently serving up static resources in the ${webappRoot}/resources directory
스프링에서 bean 등록 방법
1. xml 파일로 등록
내가 직접 코드를 수정하거나 볼 수 없는 클래스일 경우 (jar파일에 있는 클래스를 객체로 만들고 싶은 경우)
👉🏻 예시) jar 파일에 있는 것들은 이미 컴파일되었기 때문에 수정할 수 없으므로 xml 파일로 등록하는 방법을 써야 함
2. 어노테이션을 붙여서 등록
내가 직접 만든 클래스일 경우(Controller, Service, Dao, ...)
👉🏻 예시) 내가 직접 만든 클래스라면 클래스 상단에 어노테이션 타이핑이 가능하기 때문에 어노테이션을 기재하고 import 하는 방법을 사용하는 게 좋음
<annotation-driven />
webapp/resources 폴더에 대한 경로
👉🏻 webapp/resources: 정적 외부 자원에 대해서 보관하는 폴더 (이미지, css, js, 폰트, ...)
- mapping: resources 폴더 내부의 모든 폴더, 파일에 대해서 접근할 주소 지정
- locaton: 파일의 실제 위치
이 설정을 하면 DispatcherServlet을 거치지 않고 곧바로 url 주소상으로 파일을 열람할 수 있음
<resources mapping="/resources/**" location="/resources/" />
4) Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory
주소 자동 완성 도구(ViewResolver) 에 대한 설정
이 설정을 해야 하는 이유: 응답 페이지 "포워딩" 시 필요함
=> 응답 페이지명만 적었을 때 바로 해당 페이지를 찾아서 포워딩시켜 줌
- prefix: 접두어(/WEB-INF/views/)
- suffix: 접미어(.jsp)
"/WEB-INF/views/" + 응답페이지명 + ".jsp"
이런 식으로 코드가 줄어드는 원리
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!--
내부적으로
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/views/");
internalResourceViewResolver.setSuffix(".jsp");
-->
위에서 설정한 annotation-driven 태그와 짝꿍인 설정
base-package 속성에서 설정된 패키지와 그 하위에 있는 모든 패키지를 감시하겠음
base-package 속성에서 설정된 패키지 내부에 있는 모든 클래스에 대해서 어노테이션이 붙은 클래스들은 자동으로 다 bean으로 등록하겠음
<context:component-scan base-package="com.kh.spring" />
*Spring에서는 객체 생성의 주도권이 Spring한테 있음
객체를 생성한다 == bean을 등록한다 == 도구를 추가하겠다
내부적으로 Spring에서는 만들어진 도구들을 보관할 수 있는 창고(Spring Container)를 가지고 있음
👉🏻 스프링에 의해 생성된 객체들은 Spring Container에 담겨 있음!
👉🏻 Navigator 탭 옆에 위치시켜 놓은 Spring Explorer 탭을 통해 등록된 bean 확인 가능함
</beans:beans>