날아라쩡글이의 블로그입니다.
web.xml, spring Container 본문
web.xml, spring Container
날아라쩡글이 2021. 12. 29. 19:26
기본적으로 Spring Container는 2개로 만들 수 있다.
하나는 Root Spring Container 와 Child Spring Container이다.
ServletContext는 web이 시작되는 시점에 만들어진다.
웹서버가 시작될 떄, 웹서버가 종료될 때 실행할 작업을 구현한다.
- ServletContextListener 인터페이스를 구현한 사용자 정의 ServletContextListener를 정의한다.
- ServletContextListener의 ContextInitialized()는 ServletContext의 초기화가 완료되면 실행되는 메소드다
- ServletContext의 초기화는 서버가 시작될 때 완료 된다.
- ServletContextListener의 ContextDestroyed()는 ServletContext가 폐기될 때 실행되는 메소드다
- ServletContext의 폐기는 서버가 종료될 때 처리된다.
- ContextLoaderListener가 상속받았다.
- 서버가 켜질 때 springContext가 실행되고 서버가 꺼질 때까지 지속된다.
- web서버가 켜질 때 <context-param>으로 설정해두면 ServletContext에 설정정보에 저장된다.
public void ContextInitialized(ServletContextEvent sce)에서 초기화 될 때 매개변수로 들어가게 된다.- <context-param>
<param-name>contextConfigLocation</param-name>//Root Container이름
<param-value>/WEB-INF/context-root.xml</param-value> //Root Container에 생성보관객체정의
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> //Event가 발생시 사용할 class이다.
- <context-param>
Root Spring Container 생성을 위한 설정 시작
- Root Spring Container에서 관리하는 주요 객체
- Conntection Pool
- Database Access에 필요한 객체(JdbcTemplate, xxxDaoImpl)
- 업무로직 실행에 필요한 객체(xxxServiceImpl)
- 선언적 트랜잭션처리를 지원하는 객체
- HTTP 요청을 직접 처리하지 않는 객체들이 생성/조립/보관된다.
- Root Spring Container를 생성하는 주체
- ContextLoaderListener다. ContextLoaderListener은 ServletContextListener인터페이스를 구현한 객체이다.
- ServletContextListener인터페이스의 메소드(contextInitialized메소드, contextDestroyed메소드)들은 각각 서버가 시작될 떄, 서버가 종료될 때 실행된다.
- Listener은 특정이벤트와 관련된 주체이다.
- ContextLoaderListener의 contextInitialized메소드에서는 Root Spring Container를 생성하고
- <context-param />태그에 설정된 스프링 빈 설정파일을 읽어서 객체를 생성/조립/보관한다.
DisPatcherServlet
- 클라이언트의 요청이 오면 모든 요청을 접수하는 객체
- 요청을 처리할 컨트롤러와 요청 핸들러 메소드를 실행한다.
- @Controller : 요청을 처리할 컨트롤러
- @RequestMapping : 요청 핸들러 메소드
- 요청처리가 완료되면 jsp페이지로 내부이동 혹은 재요청URL로 응답한다.
- <servlet>
<servlet-name>action</servlet-name> //servlet의 이름 (3)
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
// servlet의 class DispatcherServlet에 클라이언트요청처리에 대한 다양한 부하들이 정의 됨 (4)
//servlet으로 초기화시 객체를 생성한다. 요청을 접수한다. 컨트롤러와 요청핸들러 메소드를 실행한다.
<init-param> (5)
<param-name>contextConfigLocation</param-name> //보관하는 곳 이름
<param-value>/WEB-INF/context-web.xml</param-value> //Controller에 대한 객체 생성/보관
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping> //요청 url이 오면 실행했으면 좋겠다.
<servlet-name>action</servlet-name>//servlet 이름 (2)
<url-pattern>*.do</url-pattern> //요청 url이 오면 실행할 (1)
</servlet-mapping> - Child spring Container가 생성되었다.
Dispacher -> child -> 클라이언트와 function
Context ->Root ->클라이언트와 상관없이 컨테이너만 생성한다.
child는 Root를 참조할 수 있지만 Root는 child를 참조할 수 없다.
어떤 역활을 하는지 살펴봤다.
home.do요청이 오면 DisPatcherServlet은 요청을 접수하고, 사령관없무처럼 childSpringContainer에서 해당 어노테이션과 컨트롤러를 실행한다. 그리고 return값으로 viewRolver가 실행된다.
1. 요청 URL은 요청핸들러 확인
2. 요청 핸들러 메소드 실행
3. return 값을 수행한다.
프레임워크와 라이브러리의 차이점
- 라이브러리
- 라이브러리에서 정의된 것을 사용한다.
- 라이브러리에서 정의된 속성값이나 사용법을 이용해서 사용해야한다.
- 미리 만들어진 기능이 존재하고 그 기능을 사용하는 것이다.
- 기능을 모르면 사용할 수 없다.
- jQuery의 Select함수에서 속성을 사용하는 것과 동일하다
- 프레임워크
- 설계도가 있어서 그 모양대로 class를 만들고 사용해야한다.
- 사용자가 규칙을 따르고, 룰을 따르는 것이다.
- 장치가 준비되어있어서, 장치 내에 내가 만든것을 돌아가게 만드는 것이다.
- 룰을 지켜야한다.
- 라이브러리는 만들어진 기능을 가져가다가 쓰고,
- framwork는 규칙이 정해져있어서 규칙대로 사용하는 것이다.
- 지원을 받으려면 그 규칙에 맞게 해야하고, 내부적으로는 협동하는 방식을 사용해야한다. 템플릿보다는 좀더 확장된 개념이다.
Context-root.xml
Context-web.xml 은 spring이 구성하고, 이 파일은 rule에 맞게 작성, 필요한 것들은 연결해 놓았다.
filter
- spring MVC가 클라이언트의 요청을 처리하는 마지막이다.
- 여러개의 필터를 거치고, 응답도 마찬가지로 실행된다.
- 전처리, 후처리를 담당한다.
- filter에 적은 순서대로 실행순서가 정해진다.
- 필수적인 것은 아니다.
- filter을 전부 담고있는 것을 filterChain이라고 한다.
- filter의 순서대로 저장되어있고, 배열과 리스트를 가지고 있다.
- 서블릿과 JSP의 실행 전처리/ 후처리를 담당하는 객체다.
- filter는 여러개 등록할 수 있고, web.xml에 등록된 순서대로 실행된다.
- 후처리에서는 반대로 실행된다.
- 등록된 모든 필터와 실행할 서블릿/JSP는 filterChain객체가 관리한다.
- 요청이 올때마다 매번 해당하는 chain이 관리하게 된다.
- 요청이 올때마다 해당하는 filter/jsp를 실행한다.
- 필터를 이용한 전처리의 작업의 예시
- 요청파라미터 값에 대한 인코딩처리
- 사용자 인증과 권한 체크
- 로그인 한사람과 안한사람
- spring security framwork
- filter를 이용해서 만들어 놓은 프레임워크
- 메세지 복호화
- 암호화된 메세지를 평문으로 변환한다.
- web에서는 filter를 통해서 할 수 있다.
- 압축된 데이터에 대한 압축해제 등의 작업
- 필터를 이용한 후처리 작업의 예시
- 메세지 암호화
- (평문을 암호화된 메세지로 변환)
- 응답데이터 압축(data가 크면 압축한다. )
- filter 지원, spring에서도 지원하는 filter가 존재한다.
- 메세지 암호화
- 자주사용하는 filter는 spring에서 지원한다.
- public class CustomFilter implements Filter{
void init(FilterConfig filterconfig){
//초기화 작업 구현
}
void destroy(){
//폐기시 실행할 작업 구현
}
void doFilter(ServletRequest reg, ServletResponse resp, FilterChain chain){
//전처리 코드는 여기에 작성한다.
chain.doFilter(reg,resp);//순차적으로 필터를 실행할 메소드,꼭 실행해야한다.
//후처리 코드는 여기에 작성한다.
}
} - web.xml
- <filter>
<filter-name>encodingFilter</filter-name>//필터이름 실행한다.
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>//filter에서 꺼내갈 수 있다.
<param-name>encoding</param-name>//encoding을 진행
<param-value>utf-8</param-value>//utf-8로 한글이 깨지지 않게 한다.
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>//필터이름
<url-pattern>*.do</url-pattern>
</filter-mapping>//요청 url오면 실행할 - 요청객체에 대한 캐릭터 인코딩 방식을 UTF-8로 지정하는 필터다.
- 클라이언트의 요청이 올 때마다 ,필터의 doFilter()메소드가 실행되고,
doFilter()메소드에서 한글이 깨지지 않게 request.setCharaEncoding("utf-8")을 실행한다. - 요청파라미터에 포함된 값을 조회했을 때 한그링 깨지지 않게 한다.
- 톰캣 버젼 10.0부터는 한글을 지원한다.
- filter의 setCharacterEncoding(encoding) -> getEncoding()값을 가져온다.
param-name에서 encoding의 값을 가져온다. utf-8을 가져온다.
- <filter>
Filter는 spring과 상관이 없다. Servlet의 전처리와 후처리를 담당한다.
인터셉터는 spring Bean으로 등록되며,의존성 주입을 받을 수 있다. Controller의 전처리와 후처리를 담당한다.
- 필터는 서블릿/JSP에 대한 전처리, 후처리를 담당하는 객체이다.
- 인터셉터는 컨트롤러에 대한 전처리, 후처리를 담당하는 객체다.
- 인터셉터는 스프링의 객체이기 때문에 스프링컨테이너의 빈으로 등록된다.
- 전처리, 후처리 작업에 필요한 객체를 의존성 주입을 통하여 전달할 수 있다.
- Controller의 전처리와 후처리를 담당한다.
- springMVC의 주요 API를 사용할 수 있다.
- model view등 사용이 가능하다.
Model1은 클래스 1개가 요청URL을 1개 처리했으면,
Spring Model2방식은 메소드 1개가 요청 URL을 1개를 처리한다.
Mapping방법이 단순화된다.
클래스 + URL이 메소드 + URL의 접두사처럼 처리 된다.
절대경로와 실제경로는 상관없이 경로라는 것을 나타내기 위해서 앞에 /을 붙인다.
'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글
어노테이션 설정하기 (0) | 2021.12.29 |
---|---|
Spring 쿼리스트링 값, form값 읽어오기 (0) | 2021.12.29 |
DB Access 방법 (CRUD) (0) | 2021.12.28 |
느슨한 결합, DB 연결 (0) | 2021.12.27 |
의존성 주입의 수동 주입 방법 (0) | 2021.12.27 |