Spring MVC 패턴과 패키지 구조
나의 첫 포스팅이자 Spring 카테고리의 시작은 몇 달 전에 웹 개발을 Spring Boot로 처음 시작하면서 그냥 넘어 갔었던 Spring MVC 구조와 구조에 맞게 프로젝트의 패키지를 어떻게 나누어야 하는지에 대해서 정리해보려고 한다.
우선 Spring은 알겠고 MVC가 뭘까?
MVC는 Model-View-Controller로 한 마디로 모델-뷰-컨트롤러로 나누어서 동작하는 패턴을 말한다.
- Model – 모델은 데이터 저장소와 연동해서 사용자에게 입력받는 or 출력하는 데이터를 다루는 역할을 한다.
- View – 뷰는 말 그대로 모델로부터 정보(값)를 얻어서 사용자에게 보여주는 것이다. (단순히 표시해주는 역할)
- Controller – 컨트롤러는 쉽게 말해서 모델과 뷰를 중간에서 연결하는 역할로 데이터와 비즈니스 로직 사이의 상호작용을 관리한다.
*비즈니스 로직 : 데이터베이스와 사용자 인터페이스 사이의 정보 교환, 즉 업무에 필요한 데이터 처리를 수행하는 로직

사진과 같은 방식으로 간단히 설명하자면,
- 사용자가 Controller로 요청 전송
- Controller는 Model로 데이터 요청
- Model에서 Controller로 데이터 전송
- Model로부터 받은 데이터를 Controller가 View에게 전달
- 반영된 결과를 View를 통해 확인
M-V-C로 역할을 나누는 이유는? (장점)
- 비즈니스 로직을 사용자 인터페이스로부터 분리해서 view단과 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있다.
- 결과적으로 유지보수에 용이하며 코드의 가독성과 확장성을 높인다.
이런 MVC 패턴이 적용된 Spring MVC 구조는?

위 사진에서 처럼 Spring MVC 구조를 간단하게 보면
- Dispatchar Servlet에서 사용자 요청을 받음
- 해당 요청을 매핑한 컨트롤러가 있는지 Handler Mapping에서 검색&리턴
- 컨트롤러에서 비즈니스 로직을 수행할 서비스를 요청, 결과를 Model and View 객체로 리턴
- ViewResolver에 알맞는 View를 찾도록 요청
- 알맞는 View로 Model을 넘겨서 출력
결과적으로는 위에서 MVC 패턴에 대해 정리한 내용과 같은 흐름이라고 볼 수 있다.
따라서, Spring MVC 구조에 맞게 패키지를 구성하기 위해서는 다음과 같이 컨트롤러와 서비스를 나누어서 각자의 역할에 맞는 작업들만 수행하도록 하고 모델과 뷰 영역을 구분해서 패키지를 구성한다.
- 컨트롤러에서는 요청을 받고 결과를 전달하는 역할만 수행하도록 구현
- 서비스에서는 DB에서 받아온 데이터를 전달받아서 가공하는 역할(비지니스 로직)을 수행하도록 구현

*DAO : Data Access Object로 실제로 DB에 접근하는 객체
*DTO : Data Trasnfer Object로 계층간 데이터 교환을 위한 객체
'웹개발 > Spring' 카테고리의 다른 글
[Spring Boot] 스프링부트 application.yml파일 설정하기 (yml VS properties) (0) | 2021.09.24 |
---|---|
[Spring Boot] 스프링부트 Http Method 매핑 방법(GETvsPOST) (0) | 2021.08.27 |
[Spring Boot] 스프링부트 로그 관리 logback과 Slf4j (0) | 2021.08.14 |
댓글