SpringMvc 아키텍쳐
김영한 선생님 스프링 mvc 1편의 Springmvc v3을 기반으로 기능을 만들고, 확장하고, 프로젝트 구조를 개선했다.
개선한 주요 이슈 및 아티클
FrontControllerServlet 아키텍쳐 프로젝트 구조
아래는 이전 프로젝트 구조(FrontControllerServlet 아키텍쳐)이다. DDD 기반 구조라서 충분히 읽기 쉬웠지만, springmvc로 전환하면서 core 패키지에 많은 클래스가 필요 없어졌다.
├── java
│ └── com
│ └── weblibrary
│ ├── AppConfig.java
│ ├── ServletInitializer.java
│ ├── WebLibraryApplication.java
│ ├── core
│ │ ├── HandlerAdapter.java
│ │ ├── adapter
│ │ │ ├── ForwardControllerAdapter.java
│ │ │ ├── JsonResponseControllerAdapter.java
│ │ │ └── RedirectControllerAdapter.java
│ │ ├── controller
│ │ │ ├── Controller.java
│ │ │ ├── ForwardController.java
│ │ │ ├── FrontControllerServlet.java
│ │ │ ├── JsonResponseController.java
│ │ │ ├── RedirectController.java
│ │ │ └── dto
│ │ │ └── response
│ │ │ ├── ErrorResponse.java
│ │ │ ├── JsonResponse.java
│ │ │ └── RentResponse.java
│ │ └── view
│ │ ├── ModelView.java
│ │ └── View.java
│ └── domain
│ ├── admin
│ │ ├── controller
│ │ │ ├── AdminBookController.java
│ │ │ ├── AdminPageController.java
│ │ │ ├── AdminUsersController.java
│ │ │ └── dto
│ │ │ └── RoleNameDto.java
│ │ ├── model
│ │ │ ├── Role.java
│ │ │ └── RoleType.java
│ │ ├── repository
│ │ │ ├── MemoryUserRoleRepository.java
│ │ │ └── UserRoleRepository.java
│ │ └── service
│ │ └── AdminService.java
│ ├── book
│ │ ├── model
│ │ │ ├── Book.java
│ │ │ └── dto
│ │ │ ├── ModifyBookInfo.java
│ │ │ └── NewBookInfo.java
│ │ ├── repository
│ │ │ ├── BookRepository.java
│ │ │ └── MemoryBookRepository.java
│ │ └── service
│ │ └── BookService.java
│ └── user
│ ├── controller
│ │ ├── AccessDeniedController.java
│ │ ├── IndexController.java
│ │ ├── JoinController.java
│ │ ├── LoginController.java
│ │ └── UserBookController.java
│ ├── model
│ │ └── User.java
│ ├── repository
│ │ ├── MemoryUserRepository.java
│ │ └── UserRepository.java
│ └── service
│ └── UserService.java
├── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── webapp
├── WEB-INF
│ └── views
│ ├── access-denied.jsp
│ ├── admin
│ │ └── index.jsp
│ └── home
│ ├── index.jsp
│ └── join.jsp
└── js
├── admin.js
├── manageBook.js
├── manageMember.js
├── rent.js
└── util.js
springmvc 프로젝트 구조
├── java
│ └── com
│ └── weblibrary
│ ├── AppConfig.java
│ ├── ServletInitializer.java
│ ├── WebLibraryApplication.java
│ ├── core
│ │ └── controller
│ │ ├── AccessDeniedController.java
│ │ └── dto
│ │ └── response
│ │ ├── ErrorResponse.java
│ │ ├── JsonResponse.java
│ │ └── RentResponse.java
│ └── domain
│ ├── admin
│ │ ├── controller
│ │ │ ├── AdminBookController.java
│ │ │ ├── AdminPageController.java
│ │ │ ├── AdminUsersController.java
│ │ │ └── dto
│ │ │ └── RoleNameDto.java
│ │ ├── model
│ │ │ ├── Role.java
│ │ │ └── RoleType.java
│ │ ├── repository
│ │ │ ├── MemoryUserRoleRepository.java
│ │ │ └── UserRoleRepository.java
│ │ └── service
│ │ └── AdminService.java
│ ├── book
│ │ ├── model
│ │ │ ├── Book.java
│ │ │ └── dto
│ │ │ ├── ModifyBookInfo.java
│ │ │ └── NewBookInfo.java
│ │ ├── repository
│ │ │ ├── BookRepository.java
│ │ │ └── MemoryBookRepository.java
│ │ └── service
│ │ └── BookService.java
│ └── user
│ ├── controller
│ │ ├── AccountController.java
│ │ ├── IndexController.java
│ │ └── UserBookController.java
│ ├── model
│ │ └── User.java
│ ├── repository
│ │ ├── MemoryUserRepository.java
│ │ └── UserRepository.java
│ └── service
│ └── UserService.java
├── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── webapp
├── WEB-INF
│ └── views
│ ├── access-denied.jsp
│ ├── admin
│ │ └── index.jsp
│ └── home
│ ├── index.jsp
│ └── join.jsp
└── js
├── admin.js
├── manageBook.js
├── manageMember.js
├── rent.js
└── util.js
core쪽은 거의 모든 클래스가 삭제되었다.
최종 회고
확실히 프로젝트 구조가 단순화되었고, 물론 기능 개발은 이미 되어있긴 했지만 리팩토링에 약 서너시간 밖에 걸리지 않았다. 추가적으로 기능 확장도 매우 빨리 가능할 것 같다.
또한, 기존의 한계인 /site uri에서 시작해야 하는 FrontController Root 디렉토리 탐색 문제가 해결되었다.