출처 : https://victorydntmd.tistory.com/161?category=698080 를 읽고 정리
< 톰캣을 실행 할 때 >
1. 톰캣을 실행하기 전에 개발자는 톰캣의 설정파일인 web.xml 파일에 <context-param>으로 전역 파라미터를 설정한다.
파라미터의 이름은 contextConfigLocation이고
어떤 객체들을 미리 만들어 놓을지가 작성된 설정파일의 경로(root-context.xml)를 값으로 할당해 놓는다.
2. 톰캣버튼을 실행했을 때 톰캣이 실행되면 ContextLoaderListener가 contextLoader()메서드를 실행한다.
ContextLoaderListener : 톰캣 구동시에 web.xml을 읽어들여 웹 어플리케이션 설정을 구성하기위한 즉, 초기셋팅작업을 이루어지게 한다.
contextConfigLocation의 값에 설정된 applicationContext.xml을 읽어들인다.
즉, Context Loader Listener를 통해 applicationContext.xml를 읽어들인다.
3. applicationContext.xml은 3-layer로 구성된 component를 정의하고 있다.
ApplicationContext.xml 파일에 의존성 주입을 위한 객체들을 미리 정의하고있다.
톰캣이 실행되었을 때 ContextLoaderListener에 의해 ContextLoader가 실행되어 applicationContext.xml 이 읽히고
의존성 해결을 위한 객체들을 생성하게 된다.
< 요청이 왔을 때 실행 동작 >
1. 클라이언트가 Request 요청을 하면, DispatcherServlet이 요청을 가로챈다. 이 때 DispatcherServlet이 모든 요청을 가로채는 건 아니고 web.xml에 등록된 내용만 가로챈다. 최초의 web.xml 에서는 <url-pattern>이 '/'와 같이 해당 애플리케이션의 모든 URL로 등록돼있기 때문에, 만약 *. do와 같이 특정 URL만 적용하고 싶다면 <url-pattern>의 내용을 바꿔주어 범위를 변경하면 된다.
이 코드는 " .do 로 끝나는 모든 요청이 왔을 때 DispatcherServlet의 init()메서드가 실행되도록 하라" 라는 의미이다.
물론 한 번 요청이 왔었다면 init()메서드는 Servlet의 라이프 사이클에 따라 생략이 될 것이다.
가로챈 요청은 아래의 <init-param> 부분에 있는 servlet-context.xml로 전달된다.
위의 코드를 보면 Servlet매핑을 할 때 작성한 <servlet-name>이 spring이므로 DispatcherServlet의 init() 메서드는 servlet-context.xml 파일을 읽어들인다.
즉, .do 로 요청이 오면 DispathcerServlet은 servlet-context.xml 파일을 읽어들인다.
- <annotation-driven> : @Controller 어노테이션을 감지하여 해당 클래스를 Controller로 등록할 수 있도록 해주는 태그
- <resources> : 정적인 html문서 같은 웹 리소스들의 정보를 기술하는 태그
- <beans:bean class="org.springframework.web.servlet.view.InternalResourceBiewResolver"> : Controller가 Model를 리턴하고 DispatcherServlet이 jsp 파일을 찾을 때 쓰이는 정보를 기술하는 태그. "home"이라는 문자열을 반환하면 /WEB-INF/views/ 경로에서 접미사가 .jsp인 해당 파일을 찾는다. /WEB-INF/views/home.jsp
- <context:component-scan> : Java 파일의 @Component로 등록된 Bean 객체를 찾도록 해주는 태그
2. DispatcherServlet이 가로챈 요청을 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Controller를 찾는다.
@Controller : 어노테이션을 붙이면 servlet-context.xml에서 이것을 인식하여 컨트롤러로 등록함.
@RequestMapping : 스프링은 HandlerMppaing에 의해 컨트롤러가 결정된다. 이 컨트롤러에서 HandlerAdapter에 의해 실행 메서드가 결정되는 데 @RequestMapping 어노테이션이 그 정보를 제공해 준다. value에 해당하는 url이 GET 방식으로 요청이 들어올 때 해당 메서드를 실행한다.
3. 실제 로직 처리 (Controller -> Service -> DAO -> DB -> DAO -> Service -> Controller)
4. 로직 처리 후 ViewResolver를 통해 view 화면을 찾는다.
viewResolver가 ModelAndView객체로 변경해서 객체를 리턴한다.
5. 이 결과를 다시 DispatcherServlet에 보내고, DispatcherServlet는 최종 클라이언트에게 전송한다.
'⚙️Backend > Spring' 카테고리의 다른 글
[Spring] 전체 정리 (0) | 2020.06.06 |
---|---|
💡용어 정리💡 (0) | 2020.05.31 |
MyBatis 추가 정리 (0) | 2020.05.31 |
[Spring] MVC Project part 5 (6) | 2020.05.30 |
[Spring] MVC Project part 4 (0) | 2020.05.30 |