안녕하세요 dev-길길IT입니다.
저는 예전에 Spring으로 Project를 만들 때 정해진 가이드대로 따라서 만들기만 했었습니다.
하지만 구조를 잘 알지 못해서 Debugging을 할 때 어디서부터 Bug가 있는지를 찾기가 어려웠습니다.
그래서 오늘은 Spring Project에서 어떤 구조로 통신이 이루어지는지 포스팅하려 합니다.
전체적인 흐름을 알게 되면 bug fix에서 유리한 위치를 선점할 수 있습니다.
Spring Project의 구조와 흐름
※목차
1. Spring Project의 Workspace 기본 구조
2. Spring Project의 MVC 동작 순서
3. root-context와 servlet-context의 차이
1. Spring Project의 Workspace 기본 구조
Spring Project를 최초로 구성할 때는 사용자마다 차이는 있겠지만 위와 같이 초기 셋팅을 합니다.
크게 아래 6가지 항목으로 구분하여 설명해보겠습니다.
1. Java source directory
- java 파일들이 위치하게 되는 경로입니다.
Spring에서 중요하게 사용하는 Controller, dao, service와 같은 java 파일들을 이 곳에 위치시킵니다.
2. Resources
- DB 연결, DI 설정을 위한 xml 등 모든 자원이 위치하게 되는 경로입니다.
3. Src/main/webapp
- Web 관련 자원이 담긴 루트 폴더입니다.
webapp에는 화면 파일, js/css와 같은 라이브러리, xml 설정파일들을 하위 디렉토리에 가지고 있습니다.
4. Src/main/webapp/resources
- Js, css, img등 web에 필요한 자원들을 보관하는 경로입니다.
5. Src/main/webapp/WEB-INF/spring
- 스프링 환경설정(context) 파일을 보관하는 경로입니다.
6. Src/main/webapp/WEB-INF/views
- Jsp, html 파일을 보관하는 경로입니다.
실제 화면으로 만들어져서 사용자에게 보여지는 페이지들의 소스가 저장됩니다.
2. Spring Project의 MVC 구조와 흐름
Spring Project는
데이터를 핸들링하는 Model,
화면을 구성하는 View,
실제 동작하는 로직으로 구성된 Controller의 앞글자를 따서 만든
MVC(Model-View-Controller)의 패턴을 가지게됩니다.
MVC 패턴의 구조와 흐름은 다음과 같습니다.
1. 클라이언트가 요청을 보냅니다.
기본 페이지의 경우 미리 설정된 자기 자신의 서버 주소와 기본 포트인 http://localhost:8080/을 보내게 됩니다.
2. 클라이언트의 요청을 DispatcherServlet이 가로챈다.
DispatcherServlet은 HTTP 프로토콜로 들어오는 모든 요청을 맵핑된 컨트롤러에 전달해주는 역할을 합니다.
이 때 web.xml에 명시적으로 등록된 내용에 한해서만 동작을 수행하기 때문에 web.xml에서 추가적인 설정을
해줄 필요가 있습니다..
# 초기 web.xml의 경우
<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>
Dispatcher는 Param-value를 통해 지정된 servlet-context.xml의 파일을 참조하여 요청을 처리합니다.
Servlet-mapping 태그 하위의 url-pattern에 등록된 내용에 따라
/의 형태로 들어오는 모든 URL은 다 이 dispatcher를 거치게 됩니다.
3. DispatcherSerlvet이 가로챈 요청을 Handlermapping에게 전달하여 해당 요청에 mapping된 controller를 찾습니다.
Controller.java 중간중간 @RequestMapping이라는 Annotation을 등록해놓았습니다.
해당 Annotation이 /로 등록된 컨트롤러를 찾습니다.
4. 요청 처리
Controller > Service > DAO > DB > DAO > Service > Controller의 순으로 데이터를 조회하고 로직을 수행합니다.
기본 프로젝트에는 HomeController.java가 선언되어있는데
이 로직은 별도의 Service나 DB조회를 하지 않고 화면에 데이터만 출력해줍니다.
5. ViewResolver를 통해 View를 조회
Controller에서 return한 값들을 토대로 해당하는 실제 view 화면을 찾습니다.
# servlet-context.xml
<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>
ViewResolver는 DispatcherServlet을 생성할 때 servlet-context를 config로 생성하게 되는데
이 곳에 ViewResolver가 있습니다.
HomeController.java에서 /로 시작하는 요청의 결과 리턴값은 home입니다.
그러면 prefix인 /WEB-INF/views,
suffix인 .jsp를 조합하여
/WEB-INF/views/home.jsp가
실제로 보여지는 view의 화면이 되는 것입니다.
3. Root-Context와 Servlet-Context의 차이
Spring Projecㅅ에서 Root-Context는
view와 관련되지 않은 service, repository(dao), db등 비즈니스 로직과 관련된 설정을 해주는 설정입니다.
Servlet-context는 view와 관련된 controller, viewresolver, interceptor 등 설정을 합니다.
정리해보면 Web.xml을 거치면 filter -> root-context.xml -> servlet-context.xml 순서로 실행됩니다.
마무리
오늘은 Spring Project의 구조와 흐름에 대해서 알아보았습니다.
비교적 복잡하게 되어있지만 이 흐름을 이해한다면 Spring Framework를 개발하시거나 Debugging할 때
정확한 원인을 분석하는데 도움이 됩니다.
오늘도 읽어주셔서 감사합니다.
'Dev > Java' 카테고리의 다른 글
[Spring] log4j 적용 쿼리 및 로그 출력, 정렬하는 방법 (0) | 2024.07.31 |
---|---|
[Spring Boot] Thymeleaf 뷰 레이아웃 설정 및 사용하는 방법 (0) | 2024.07.26 |
[Spring] Tiles 적용하는 법과 사용하는 방법 (10) | 2024.07.24 |
IntelliJ, Maven, createprocess error=206 파일 이름이나 확장명이 너무 깁니다. 오류 해결 방법 (0) | 2023.03.23 |
[Spring Project 구축] 1. JDK + Eclipse + Tomcat + Spring Project 한 방에 정복하기 (0) | 2022.08.21 |
댓글