본문 바로가기
Spring

[Spring] Spring MVC / 3-tier Layered Architecture

by 도전하는 린치핀 2024. 4. 2.

1. MVC 패턴의 개념과 Spring에서의 MVC 패턴

 

1-1. MVC 패턴

 

MVC 패턴이란? 

  • 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴
  • 어플리케이션을 개발할 때 개발 영역을 Model - View - Controller로 나누어 각 역할에 맞게 코드를 작성하는 방식
  • UI 영역과 비즈니스 로직 영역으로 구분하여 서로에게 영향을 주지 않으며 개발 및 유지 보수가 가능하게 한다.

 

각 패턴 구분

  • Model : 값과 기능을 가지고 있는 객체
    • 데이터 및 비즈니스 로직을 관리한다.
    • 추가적으로 3-tier Layer Architecture에서 서비스 계층에 비즈니스 로직이 들어가 있으므로 서비스 계층은 모델에 더 가깝다고 볼 수 있다.
  • View : 모델에 포함된 데이터를 시각화하여 사용자에게 보여주는 역할
    • Model을 이용하여 웹 브라우저와 같은 어플리케이션의 화면에 보이는 리소스를 제공하고 레이아웃과 화면을 처리한다.
  • Controller : Model 객체의 데이터 흐름을 제어하고 View와 Model의 역할을 분리

 

MVC 패턴의 흐름

  1. 사용자는 원하는 기능을 터리하기 위한 모든 요청을 컨트롤러에 보낸다.
  2. 컨트롤러는 모델을 사용하여 알맞은 비즈니스 로직을 수행한다.
  3. 컨트롤러는 사용자에게 보여줄 뷰를 선택하고 알맞은 뷰에 데이터를 보낸다.
  4. 선택된 뷰는 사용자에게 받은 데이터를 통해 알맞은 결과 화면을 보여준다.

 

MVC 패턴 사용 이유

  • 사용되는 각각의 컴포넌트의 코드 결합도를 낮추기 위해 (비즈니스 로직과 UI 영역을 분리하여 개발 가능)
  • 코드의 재사용성을 높여 어플리케이션의 유지보수를 용이하게 하기 위해

 

1-2. Spring 에서 MVC 패턴 사용

이처럼 Spring 프레임워크의 경우 기본적인 MVC 패턴과 비슷한 흐름으로 진행되지만 조금 구체적으로 알아보자.

Spring 프레임워크에서는 Dispatcher Servlet이라는 것이 존재하여 Servlet 단위로 클라이언트의 요청을 받아 Servlet 단위로 수행된다고 생각하면 된다.

 

 

Dispatcher Servlet

  • DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet
  • DispacherServlet을 사용하면 서블릿으로 등록하면서 모든 경로에 (urlPatterns=”/”)에 대해 매핑한다.

 

 

Spring MVC 흐름

  1. 클라이언트는 서블렛 단위로 DispatcherServlet에 요청을 보낸다.
  2. 핸들러 매핑을 통해 URL에 매핑된 핸들러(컨트롤러)를 조회한다. (핸들러 조회)
  3. 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다 (핸들러 어댑터 조회)
  4. 조회된 핸들러 어댑터를 실행한다. (핸들러 어댑터 실행)
  5. 핸들러 어댑터가 실제 핸들러를 실행한다. (핸들러 실행)
  6. 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환하여 반환 (ModelAndView 반환)
  7. 뷰 리졸버를 찾고 실행한다 (ViewResolver 호출)
  8. 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고 랜더링 역할을 담당하는 뷰 객체를 반환 (View 반환)
  9. 반환된 View를 랜더링한다 (View 랜더링)

 

2. 3-tier Layered Architecture 개념

 

2-1. 3-tier Layered Architecture

 

3-tier Layered Architecture란 "프레젠테이션 계층 - 비즈니스 계층 - 데이터 계층을 각각 물리적으로 독립된 모듈로 개발하고 유지하는 구조"를 말한다. 이때, 각 레이어는 인접한 레이어끼리만 통신할 수 있다.

 

3-tier Layered Architecture 또한 MVC와 비슷하게 각 영역을 독립적으로 설계하여 추후에 특정 부분이 바뀌어도 필요한 부분만 교체할 수 있게 하기 위해서 사용된다.

쉽게 말해 코드의 결합도를 낮추고, 유지보수성을 향상시킬 수 있는 방법이라는 것이다.

 

각 Layer 구분

  1. Web Layer (Presentation Layer)
    • 화면을 보여주는 기술을 사용하는 영역
    • 컨트롤러에서 사용자의 요청에 맞는 응답처리를 진행한다.
    • 프론트 컨트롤러, 컨트롤러, 뷰, @Controller 등이 외부 요청과 응답에 대한 전반적인 영역을 말한다.
    • 서비스 계층, 데이터 엑세스 계층에서 발생하는 Exception을 처리한다.
  2. Service Layer (Business Layer)
    • 순수한 비즈니스 로직을 담고 있는 영역
    • 고객이 원하는 요구사항을 반영하는 계층 (= 고객의 요구사항과 정확히 일치해야 함)
    • Controller와 DAO의 중간 영역
    • @Service 어노테이션을 사용하여 계층을 구분할 수 있다.
    • @Transactional이 사용되는 계층
  3. Repository Layer (Persistence Layer)
    • 데이터를 보관하고 사용하는 방식을 설계하는 계층
    • 일반적으로 DBMS를 사용하지만 경우에 따라 네트워크 호출이나 원격 호출등의 기술을 접목
    • DAO 인터페이스와 @Repository 어노테이션을 통해 작성된 DAO 구현 클래스가 속하는 계층
    • DB에 data를 CRUD하여 접근하는 계층

 

추가적으로 Domain이라는 것에 대해서 알아보자

  • Domain Model
    • 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것
    • @Entity 어노테이션을 사용하여 작성된 영역

 

2-2. Spring 에서 3-tier Layered Architecture 적용

 

  • Spring에서 3-tier Layered Architecture의 경우 위에서 확인 MVC가 Presentation Layer에 속하는 것을 확인할 수 있다.
  • 이때, Presentation Layer에서 Controller와 View가 존재하고 Service Layer에 연결되는 것은 Controller인 것을 확인하자.

 

3. MVC와 3-tier Layered Architecture 관계

 

 

3-tier Layered Architecture의 경우 물리적으로 공간을 나누어 역할을 나누어 독립된 모듈로 개발하여 각 계층은 접촉된 계층과 통신만 가능하다. 또한, 모든 흐름들은 비즈니스 계층을 통해서 접촉해야 한다.

하지만 MVC의 경우 물리적으로 공간을 나누어 개발하는 것이 아니라, MVC pattern 이라는 디자인 패턴을 통해 물리적으로 구분할 수 없는 설계를 문서화하면서 고안된 방법이다. 프로그램의 규모가 커질수록 다양한 문제를 겪게 되는데, 이 문제들을 효율적으로 해결할 수 있게 하기위해 유형별로 패턴화 한 것이다.