실제 웹 프로젝트의 구조를 살펴보면 다음과 같습니다.
(1) 프로젝트 명과 일치하는 패키지에는 프로젝트의 main 함수가 존재하는 Application.java, 로그인 기능 및 보안과 접근성을 담당하는 Spring security 의 설정 파일인 SecurityConfig.java, view 페이지를 반환해주는 Sitemesh를 설정 ServletFilterConfig.java 와 SitemeshFilter.java가 존재합니다.
(2) 패키지에는 프로그램의 기능에 맞게 controller, service, mapper class 등이 각각의 기능에 따라 분류되어 있습니다.
(3) Controller, Service, Mapper로 구성된 하나의 패키지를 살펴보면 다음과 같습니다.
- Controller.java
Controller는 사용자가 요청하는 request url에 mapping되어 각각의 요청을 알맞게 분류해주고 요청을 처리합니다.
Controller에는 두 종류가 있습니다.
첫번째는 단순히 view 페이지를 반환하는 Controller
두번째는 Service 또는 mapper를 호출하여 DB와 통신한 후 그 결과를 model and View 또는 restAPI의 return 값으로 데이터만을 반환하는 RestController가 존재합니다.
- Service.java
Service에선 Controller에서 분리된 비즈니스 로직을 처리합니다.
Controller에서 DB와 통신해 view페이지를 반환하는 일련의 모든 비즈니스 로직을 처리하게 할 수 있지만 코드의 가독성이나 유지보수 측면에서 추가적인 비용이 발생합니다. 따라서 Service단을 만들어 추가적인 비즈니스 로직을 Controller로부터 분리하여 관리합니다.
결론적으로 사용자의 요청은 view -> Controller -> Service -> Mapper와 같은 순으로 흐르게 됩니다.
- Mapper.java
Mapper.java에서는 Mybatis의 Mapper.xml과 바인딩되어 쿼리문을 호출하고 DB에 접근해 결과값을 받아오는 model의 역할을 합니다. 결과값은 Service나 Controller에 반환되어 결론적으로 사용자의 요청에 따른 결과값을 view 페이지에 반환합니다.
(1) mybatis config.xml 파일에는 mybatis configuration setting과 typeAliases 설정을 합니다.
(2) mappers 폴더에는 MVC모델에서 DB와 통신하는 Model이 존재하며 각 Mapper.xml은 각각의 기능에 따라 분류되어 있습니다.
(3) 각각의 mapper.xml에는 mySQL 쿼리가 존재합니다.
src/main/java의 mapper.java repository에서 이들을 호출해 결과값을 반환합니다.
(1) adminLayer 또는 asset과 같은 부분은 view 페이지의 css나 images파일 js파일 등과 같이 html과 같은 view 페이지를 구성하는데 필요한 자원과 동적인 기능을 지원하는 함수들이 존재합니다.
(2) WEB-INF에는 sitemesh의 decorator, html의 head, header, footer, 그리고 view 페이지와 같이 정적인 페이지들로 구성되어 있습니다.
(1) 다음을 통해 프로젝트의 packaging, groupId, description등 프로젝트 빌드 정보를 설정하고, dependency의 버전을 관리하거나 추가 또는 삭제합니다.
하단의 dependencies 탭을 통해 프로젝드의 의존성들을 한눈에 볼 수 있습니다.
(2) 의존성을 추가한 뒤에는 alt+F5를 눌러 프로젝트 업데이트를 진행하고
프로젝트 오른쪽 클릭 -> Run As -> Maven build.. 를 통해 프로젝트를 build 해줍니다.
이상으로 Spring boot + maven + mybatis 의 기본적인 프로젝트 구성에 대하여 알아보았습니다.