월요일에 TIL을 올린 이후 4일만에 TIl을 올리게 되었다.
그동안 수업을 짼(?) 건 아니고, 내용이 너어어어무 어려워서 정리가 안돼서 글을 못 올렸었다.
오늘까지 수업을 듣고 보니, 화수목에 배운 내용이 조금씩 정리가 되어서 오늘은 TIl을 올리게 되었다.
Spring WebMVC 실습
스프링 MVC 프로젝트 폴더 구조
스프링 mvc 프로젝트를 만들면 기본으로 여러 라이브러리와 폴더들, 설정 파일들이 만들어진다.
실습에 필요한 기본 설정, 여러 xml 파일들 수정, DB 설정, 스켈레톤 코드 복사 붙여넣기 등등은 따로 이야기하지 않고 넘어 가겠다. (중요하지 않은 내용이라 글이 쓸데없이 길어질 것 같아 생략)
기본 설정이 완료된 폴더 구조를 보면 다음과 같다.



뭐... 엄청나다.
이 모든 파일들의 내용을 다 이해하기엔 시간이 걸릴 것 같고 굳이 그럴 필요도 없어서, 스프링 애플리케이션이 동작하는 전체 흐름만 알면 될 것 같다.
스프링 웹 애플리케이션 동작 흐름
1. 웹 브라우저에서 `http://localhost:8080/myapp/`을 요청한다.
2. 해당 요청을 DispatcherServlet이 받는다.
3. HandlerMapping이 URL과 매핑되는 컨트롤러를 검색한다.
-> servlet-context.xml에 등록된 `@Controller` Bean 중 `@RequestMapping("/")`이 등록된 MemberController를 찾는다.
4. DispatcherServlet이 HandlerAdapter를 통해 MemberController에 `@RequestMapping("/")`이 등록된 메서드 main()을 실행한다.
5. Interceptor(ViewNameInterceptor)가 먼저 실행되어 요청 URL(/)을 기반으로 viewName을 생성하고 request에 저장한다.
(viewName = null)
6. Controller의 main() 메서드는 request에서 viewName을 가져와 ModelAndView("")을 생성하여 반환한다.
7. HandlerAdapter 는 ModelAndView를 DispatcherServlet에게 전달한다.
8. DispatcherServlet은 ViewResolver (TilesViewResolver)를 통해 ""과 일치하는 Tiles definition을 검색한다.
9. Tiles 설정(tiles_member.xml)에서 <definition name="">을 찾는다.
10. 해당 definition은 baseLayout을 상속하므로 /WEB-INF/views/common/layout.jsp를 템플릿으로 사용한다.
11. Tiles는 정의된 attribute에 따라 header.jsp, side.jsp, body(= main.jsp), footer.jsp를 설정한다.
12. layout.jsp에서 tiles:insertAttribute를 통해 위 JSP들이 하나의 화면으로 조립된다.
13. 최종적으로 header + side + main.jsp + footer가 합쳐진 HTML이 생성된다.
14. DispatcherServlet이 해당 응답을 브라우저로 전달한다.
15. 웹 브라우저에는 상단(header) + 좌측(side) + 중앙(main) + 하단(footer) 화면이 렌더링된다.


bean config 설정 분리
bean의 설정이 디스패처 서블릿에 모두 설정이 되면 파일이 너무 커져 관리의 불편함이 있다. 따라서 관련된 bean들을 한 곳에 정의하고 Listener를 통해 모두 Loading한다.
web.xml 설정
<!-- 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/action-mybatis.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>

- servlet-context.xml (applicationContext.xml)
- 애플리케이션 내의 URL 관련 설정을 작성한다.
- annotation-driven
- resources
- viewResolver
- multipartResolver
- propertyPlaceHolder
- Controller (Controller가 늘어갈 수록 servlet-context.xml이 무거워진다.)
- rootContext.xml (내 코드에서는 action-mybatis.xml)
- Database 연동 설정을 작성한다.
- dataSource
- jdbcTemplate
- boardContext.xml (Context.xml)
- 패키지 별 Context를 작성한다.
- boardDaoImpl
- boardServiceImpl
❕느낀점
스켈레톤 (뼈대) 코드를 넣고 실제로 브라우저에서 URL을 입력해 화면에 출력을 해보니 조금씩 이해가 되는 것 같다.
한 기술을 배우고 겨우 이해하면 더 좋은 기술을 배우고, 또 그걸 겨우 이해하면 더 좋은 기술을 배우는 것 같다..
그래서 더 어려웠고, 내용을 다 이해해서 사용할 줄 알아야 한다는 부담감에 공부하는게 힘들어졌던 것 같다.
하지만 그럴 필요 없이 전체적인 흐름을 이해하는 것이 중요하다는 것을 알게 되었다. 그냥 예전에는 힘들게 서블릿, JSP를 썼고, 그 이후에 프레임워크인 스프링이 나왔고, 그 이후에 더 간단하게 설정할 수 있는 스프링 부트가 나왔다. 이런 흐름을 이해하는 게 중요할 것 같다. 코드 한 줄 한 줄 분석하는데 시간 쓰지 말고, 개발 방식의 변화에 초점을 맞춰서 넓은 관점에서 공부해야겠다.
스프링 파이팅!
'Backend > Spring' 카테고리의 다른 글
| [TIL-260331] Spring Boot 기초: Spring Data JPA (0) | 2026.04.01 |
|---|---|
| [TIL-260330] Spring Boot 기초: 개요, 실습, Lombok (0) | 2026.03.31 |
| [TIL-260325] 스프링 프레임워크 기초: Ajax Response, RESTful 컨트롤러, MyBatis (0) | 2026.03.26 |
| [TIL-260324] 스프링 프레임워크 기초: Session, Interceptor, 로그인/로그아웃 기능 (0) | 2026.03.24 |
| [TIL-260316] 스프링 프레임워크 기초: Spring 개념과 개발 환경 구성 (0) | 2026.03.17 |