온라인 도서관 SpringMvc 아키텍쳐로 리팩토링 회고

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 디렉토리 탐색 문제가 해결되었다.

댓글

개발자  김철준

백엔드 개발자 김철준의 블로그입니다.

주요 프로젝트