https://yuni-spring.tistory.com/41
이전 글에서 web.xml의 정의와 대표적으로 설정되는 서블릿, 컨텍스트로더리스너, 필터 등 간단한 개념을 알아보고
하나하나 비교한다고 해놓고 이제서야 글을 쓰게 되었다.
3월 말부터 이번주까지 앱 개발과 큰 행사들이 겹쳐서 야근을 반복하다 보니 불금에 이러고 있네...
스프링 레거시 프로젝트 web.xml의 기본 구조를 보자 하고 프로젝트를 만들었더니..
아 맞다 설정은 셀프지..
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
web.xml에서 root-context.xml, servlet-context.xml을 명시한 바와 같이
web.xml 하나로 모든 설정이 마쳐지진 않는다. 그냥 DD이니까..(배포정의 서라는 뜻 ㅋㅋ)
우선 servlet-context.xml은 웹 계층 (서블릿 콘텍스트)에 관한 스프링 빈 설정을 한다. (스프링 빈 설정이라는 뜻 ㅋㅋ)
그 외 db설정이나 전역적인 빈 설정을 root-context.xml 이 맡아서 한다.
그런데 서블릿 컨텍스트가 뭘까?
서블릿 컨테이너와 통신하기 위해 사용되는 메서드를 지원하는 인터페이스
사용자 <------> 웹 서버 <---------> WAS <---------> DB
WAS
웹 컨테이너(JSP) ---> 스레드 -> 서블릿 ---> DB
어떤 동작이 일어나면 스레드가 서블릿을 호출하여 일을 합니다.
서블릿이 모여있는 그릇을 서블릿 컨텍스트라고 합니다.
그 인터페이스에 설정을 해주는 것이 servlet-context.xml 이시다~ 이말이야
서블릿 컨텍스트의 역할
1. 웹 서버와의 통신 지원
2. 서블릿 생명주기 관리
3. 멀티스레드 지원 및 관리
4. 보안 관련 소스 코드 구현, 재컴파일 불필요
그럼 서블릿은 뭘까?
클라이언트의 요청을 처리하는 servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.
서블릿 역할, 특징
1. 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트 html을 사용하여 요청에 응답한다.
2. Java Thread를 이용하여 동작한다.
3. MVC 패턴에서 Controller로 이용된다.
4. HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.
5. HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.
컨트롤러에서 자주 사용되는 파라미터 객체인 HttpServletRepuest, HttpServletResponse 도 사실
서블릿이다.
웹 서버에서 사용되며 java언어로 이루어져있으며..뭔가 퍼즐이 맞춰지는 기분이구만
이제 서블릿, 서블릿 콘텍스트에 대해 알게 되었으니 servlet-context.xml 에는 어떤 내용을 작성할까?
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<context:component-scan base-package="kr.board.controller" />
</beans:beans>
뷰 리졸버와 컴포넌트 스캔을 하는 설정을 기본적으로 한다.
뷰 리졸버(View Resolver)는 MVC 패턴에서 컨트롤러가 처리를 마친 후 어떤 뷰로 응답을 생성할지 결정하는 역할을 한다.
prefix를 통해 어떤 경로의 view를 찾을지(WEB-INF/views), suffix를 통해 어떤 형식의 view를 찾을지 (jsp) 결정해 준다.
컴포넌트 스캔(Component Scan)
스프링에서는 설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능이 있는데
kr.board.controller 하위 패키지 클래스들은 bean으로 등록된다라고 생각하면 된다.
스프링 부트에서는 어떻게 대체되고 있을까?
1. 뷰 리졸버 (application.properties)
# Thymeleaf 설정
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.cache=false
# Mustache 설정
spring.mustache.prefix=classpath:/templates/
spring.mustache.suffix=.html
spring.mustache.expose-request-attributes=true
spring.mustache.expose-session-attributes=true
spring.mustache.expose-spring-model=true
2. 컴포넌트 스캔 (내장)
SpringBootApplication (처음 프로젝트를 실행할 때의 class) 내부를 보면
@ComponentScan 어노테이션이 붙어있고 여기서부터 빈의 등록이 시작된다.
스레드 참고글
https://velog.io/@totw5701/WAS%EC%9D%98-%EB%8F%99%EC%8B%9C-%EC%B2%98%EB%A6%AC
서블릿 참고글
https://mangkyu.tistory.com/14
오늘은 servlet-context.xml을 web.xml에서 어떻게 적용시키고, 서블릿 설정은 대표적으로 무엇을 하는지, 스프링 부트에서는 어떤 식으로 대체하는지 알아보았다.
확실히 레거시보다 부트가 코드도 간결하거나 아예 내장되어 있음을 알 수 있다.
다음 글에서는 root-context.xml 에서는 어떤 내용을 작성하고 부트에서는 어떤 방식으로 연결하는지 알아봐야겠다.
'스프링' 카테고리의 다른 글
[인텔리제이] 프로젝트 세팅이 귀찮을 때 꿀팁 방출 : 프로젝트 복사 쉽게하는 법 (1) | 2024.10.16 |
---|---|
[Spring Boot -5] 스프링 부트가 개발자에게 직접적으로 주는 장점[3] root-context.xml (0) | 2024.04.11 |
[Spring Boot -3]스프링 부트가 개발자에게 직접적으로 주는 장점[1] Web.xml (0) | 2024.03.27 |
[Spring Boot -2]스프링 부트 톰캣은 어디서 실행될까? (0) | 2024.03.26 |
[Spring Boot -1] 스프링 부트 장점과 그 이유 (2) | 2024.03.26 |