본문 바로가기
Dev/Spring Boot

Spring Boot - MVC 패턴과 Layered Architecture

by yeonise 2022. 10. 6.

MVC 패턴이란,

MVC Model, View, Controller의 약자로 애플리케이션을 3개의 역할로 구분한 개발 방법론이다.

 

Model

- 데이터베이스를 다루는 로직이다

- 데이터와 View를 분리한다

- View와 Controller에 관련된 코드를 작성하지 않는다

 

View

- UI와 관련된 코드

- 화면에 출력되는 내용

- 사용자가 보는 페이지

- 클라이언트 html, css, javascript 관련

 

Controller

- Model과 View를 중간에서 제어한다

- 사용자가 접근한 URL에 따라 요청사항을 파악한다

- 요청에 맞는 데이터를 Model에 의뢰한다

- 데이터를 View에 반영하여 사용자에게 전달한다

 

Spring에서 제공하는 Spring MVC의 주요 구성요소 또한 Model, View, Controller.

그리고 이들이 유기적으로 잘 동작하기 위한 다양한 모듈이 존재한다.

 

- DispatcherServlet(Front Controller) : 모든 요청을 받는 전면 컨트롤러로 HTTP Request를 처리할 Controller를 지정한다.

- Handler(Controller) : HTTP Request를 처리해 Model을 만들고 View를 지정한다.

- Model* And View : Controller에 의해 반환된 Model과 View가 Wrapping 된 객체이다.

- View Resolver : Model And View를 처리하여 View를 그린다.

* Model : Map<String, Value> : HTTP Request의 데이터를 Key-Value 형태로 저장한다. 이후에 View를 그릴 때 사용한다.

 

참고. Spring MVC 구조를 설명하는 영상을 보고 만든 문서이다.

PDF 파일은 아래에서 다운로드할 수 있다.

page 1
page 2

 

Servlet and Spring by yeonise.pdf
0.33MB

 

참고. Layered Architecture 구조란,

레이어드 아키텍처란 애플리케이션의 컴포넌트(프로그래밍에 있어 재사용이 가능한 각각의 독립된 모듈)를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다.

spring-boot-starter-web의 의존성을 사용할 때는 기본적으로 Spring MVC 구조를 띄게 되며, 대체로 아래와 같은 레이어드 아키텍처를 이룬다.

spring layered architecture drawing by yeonise

 

Service는 비스니스 계층에 속하며, 핵심 비즈니스 로직을 구현하는 영역이다. 트랜잭션 처리나 유효성 검사 등의 작업도 수행한다.

 

데이터 접근 계층은 상황에 따라 영속(Persistence) 계층이라고도 한다. 데이터베이스에 접근해야 하는 작업을 수행한다.

그림에서는 DAO라는 컴포넌트를 표현했지만 Spring Data JPA에서는 DAO 역할을 Repository가 수행하기 때문에 Repository로 대체할 수 있다.

 

Service가 없는 구조 : Model - Controller - View

Service가 있는 구조 : Model - Service - Controller - View

 

Controller :

처리해야 할 데이터를 브라우저에서 받는다.

적절한 Service를 선택하여 호출한다.

처리한 데이터를 View로 연결한다.

 

Service :

데이터를 받아 비즈니스 로직을 처리한다.

Service에서 request나 response 같은 객체를 매개변수로 받으면 안 된다.

데이터베이스의 데이터가 필요할 때는 Repository에게 요청한다.

 

Repository :

Entity에 의해 생성된 데이터베이스에 접근하는 메서드들을 사용하기 위한 인터페이스이다.

데이터베이스 연결, 해제, 자원 관리, CRUD 작업을 처리한다.

 

더 읽어보면 좋은 글 - MVC 패턴에서 Service와 ServiceImpl

출처 LichKing의 Tistory

 

MVC 패턴에서 View는 자신이 요청할 Controller만 알고 있으면 되고, Controller는 화면에서 넘어오는 매개변수들을 이용해 Service 객체를 호출하는 역할을 한다. Service는 Http 통신을 위한 HttpServlet을 상속받을 필요가 없는 순수한 자바 객체로 구성된다. 그렇기 때문에 Service는 '어떤' 컨트롤러가 호출하는 것과 상관없이 필요한 매개 변수만 준다면 자신의 비즈니스 로직을 처리하게 된다. 즉, 모듈화를 통해 어디서든 재사용이 가능한 클래스 파일이라는 뜻이다. (Service에서 request나 response와 같은 객체를 매개변수로 받아서는 안된다. request, response를 사용해야 하는 작업은 컨트롤러에서 해야 한다.)

 

제대로 구현된 Service라면 단순 Web 기반이 아닌 native app으로 View단이 변경되더라도 View에 종속된 코드가 없기 때문에 그대로 재사용할 수 있게 된다. 추가적인 요청 사항이 들어오면 기존의 소스를 수정하는 게 아니라 기존 Service 인터페이스를 구현하는 다른 클래스를 통해 그 객체를 사용하게 한다.(OCP에 따른, 변화에는 닫혀있고 확장에는 열려있는 구조이다.)

 

댓글