함께 성장하는 기록장

꾸준한 기록이 모여 도서관이 될 수 있도록

Spring

Spring MVC 구조와 레이어드 아키텍처

H-jinny 2024. 7. 9. 23:20

Spring MVC & Layered Architecture

이번에는 MVC 패턴과 레이어드 아키텍처를 통해 Spring의 기본적인 동작 방식을 알아보려고 한다. MVC와 Layered Architecture에 대한 내용을 각각 살펴보고, Spring에서의 동작 과정을 알아보는 순서로 작성했다.

 

MVC

Model, View, Controller를 의미하며 애플리케이션의 요소를 세 가지 역할로 구분한 패턴이다. 역할에 따라 나뉘므로 낮은 결합도를 가지고, 개발과 유지 보수가 수월해진다. 또한 재사용성이 높아져 애플리케이션의 유연성도 향상된다.


Model(모델)

애플리케이션의 데이터로, 데이터 정보를 가공하여 가지고 있는 컴포넌트이다. 데이터 처리 및 저장소와의 상호작용을 포함한 데이터와 비즈니스 로직을 다룬다.

 

View(뷰)

레이아웃과 화면을 담당한다. UI에 나타낼 데이터를 모델로 부터 받아 화면에 표현한다. 또한 사용자의 입력을 컨트롤러에 전달한다.

 

Controller(컨트롤러)

모델과 뷰를 연결하여 애플리케이션의 흐름을 관리한다. 즉 뷰에서의 입력과 모델 기능 호출로 데이터를 조작하고, 다시 뷰로 전달한다.

 

MVC의 상호작용 방식

사용자가 애플리케이션에서 작업을 수행하면, 뷰가 입력을 감지하여 컨트롤러에에 전달한다. 컨트롤러는 사용자의 입력을 처리하고 이에 적합한 모델 기능을 호출하여 수행한다. 모델은 관련된 비즈니스 로직을 수행하여 컨트롤러에 결과를 반환한다. 컨트롤러가 모델의 결과를 뷰에 전달하면, 뷰는 이를 화면에 업데이트한다.

 

스프링 부트의 경우 보통 spring-boot-starter-web의 의존성을 사용하므로 기본적으로 스프링 MVC 구조를 띤다. 위의 상호 작용 방식을 적용하면 다음과 같이 요약할 수 있다.

 

 

(1) 클라이언트가 서버에 요청하면 front controller인 DispatcherServlet이 요청을 받는다.

(2) DispatcherServlet은 HandlerMapping(핸들러 매핑)을 통해 적합한 컨트롤러를 선택한다.

(3) 선택된 개별 컨트롤러의 비즈니스 로직 실행 작업을 HandlerAdapter에 위임한다.

(4) HandlerAdapter는 작업 처리 결과를 ModelAndView 객체에 담아 다시 DispatcherServlet에 보낸다.

(5) DispatcherServlet은 ViewResolver를 이용하여 View를 선택하여 정보를 받아온다.

(6) 받아온 View 객체에게 응답할 내용을 지시하고 View가 처리한다.

 

 

 

Layered Architecture

레이어드 아키텍처는 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 묶어 수평적으로 구성한 구조이다. 계층(Layer)을 묶고 나서 각 계층이 가장 가까운 하위 계층의 의존성을 주입받아 다른 계층과 통신하게 된다. 각 계층은 각자에 맞는 역할을 수행할 수 있게 되어 효율적인 개발이 가능해진다. 계층이 독립적으로 작성되므로 단위 테스트에 용이하며 코드의 확장성도 좋아진다.

 

보통 다음과 같은 3개의 계층으로 나눈다.

 

1. Pressentation Layer(프레젠테이션 계층)

  • 클라이언트의 요청을 해석 및 응답
  • UI 또는 API 제공
  • 비즈니스 계층으로 요청 위임, 받은 결과를 응답

2. Business Layer(비즈니스 계층)

  • 애플리케이션이 제공하는 기능 정의, 세부 작업 수행. 

* DDD(Domain-Driven Design) 기반의 아키텍처에서는 도메인이 포함되기도 하고, 별도로 도메인 계층을 두기도 함

 

3. Data Access Layer(데이터 접근 계층)

  • 데이터베이스에 직접 접근하는 일련의 작업 수행

 

 

이를 바탕으로 위의 MVC 구조와 함께 적용하면 다음과 같다.

Service와 DAO의 Interface를 통해 Implementation으로 접근하기도 한다.

 

1. 프레젠테이션 계층

  • DispatcherServlet이 HandlerMapping을 통해 Controller을 선택하여 요청을 전달한다.

2. 비즈니스 계층

  • Controller로부터 요청을 받아 비즈니스 로직을 처리한다. 데이터베이스에 데이터를 저장하거나 데이터를 꺼낼 필요가 생기면 Domain Object를 통해 데이터 접근 계층에 요청한다.

3. 데이터 접근 계층

  • 비즈니스 계층의 요청을 받아 데이터 관련된 작업을 수행하여 반환한다.

* 스프링의 Spring Data JPA에서는 Repository가 DAO 역할을 수행한다.

 

최종적으로 요청이 처리된 데이터와 뷰를 선택하여 ModelAndView 객체가 DispatcherServlet에 전달되면 ViewResolver를 통해 클라이언트는 처리된 데이터를 통해 출력된 화면을 볼 수 있다.

 

 

Domain Object

*DTO(Data Transfer Object)는 다른 계층이나 컴포넌트로 데이터를 넘겨주기 위한 자료 구조이다.

*Entity는 실제 DB 테이블과 매핑되는 클래스이다.

 

 

참고

 

https://developer.mozilla.org/ko/docs/Glossary/MVC

https://mundol-colynn.tistory.com/147

https://ss-o.tistory.com/160

https://velog.io/@gayeong39/SPRING-%EB%A0%88%EC%9D%B4%EC%96%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98

https://innovation123.tistory.com/169

 

스프링 부트 핵심 가이드(장정우, 위키북스 - 2022)

 

 

 

오타, 지적 감사합니다 :)

'Spring' 카테고리의 다른 글

Spring이란?  (0) 2024.09.02
Spring Security 알아보기 - 개념, 과정  (0) 2024.07.04
Maven vs Gradle  (0) 2024.07.04