FrontControllerServlet 기반 아키텍쳐
김영한 선생님 스프링 mvc 1편의 FrontControllerServlet을 기반으로 기능을 만들고, 확장하고, 프로젝트 구조를 개선했다.
주요 기능은 이 단계에서 완성해두었고, 기능 확장 및 springmvc, db등 리팩토링은 계속 해나갈 예정이다.
개선한 주요 이슈 및 아티클
- 도메인 중심 설계와 서비스 계층 경량화
- servlet + jsp front-controller에서 PRG 패턴
- Servlet Front-Controller에서 하위 컨트롤러 처리하기
- Servlet Front-Controller에서 다중 컨트롤러 등록하기
프로젝트 구조
DDD기반 프로젝트 구조를 위해, 프로젝트 구조를 개선했다. 크게 core, domain 패키지로 나누어 관심사를 분리했다. 각 도메인에 대한 설명은 온라인 도서관 프로젝트 소개글을 참고하면 된다.
각 도메인에서 사용할 컨트롤러 계층, 모델 계층, 서비스 계층을 한 패키지에서 사용하니, 확장과 개발이 편리했다.
├── 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
아쉬운 점
- 기능을 확장했으나, (하위 uri 사용 컨트롤러, 다중 컨트롤러 등록) 다소 무식한 방법으로 확장했다고 생각한다. (우선 컨트롤러를 돌리고, null을 반환하는 방식)
- / 경로가 아닌 /site 경로를 사용하는 FrontController Root 디렉토리 탐색 문제가 있다.
하지만 우선은 springmvc를 학습하기 위한 목적이었으므로, 넘어가기로 한다.