DEV/개발 방법론

디자인 패턴과 MVC 패턴

Bi3a 2023. 11. 15. 20:34

728x90

개발론 공부를 합시다.

 

디자인 패턴

 “바퀴를 다시 발명하지 마라” : 이미 만들어져 잘되는 것을 다시 만들 필요가 없다는 의미
소프트웨어 설계에 있어 공통으로 발생하는 문제에 대해 상황에 따라 사용할 수 있게 하기 위해
통용되는 설계 방법을 “규약”에 의해 정의한 패턴입니다.

 

디자인 패턴의 사용 이유 / 종류

  • 사용 이유 : 개발의 효율성, 유지보수성, 운용성, 프로그램 최적화에 도움이 됩니다.
  • 종류 (* GoF 디자인 패턴)
    • 생성 패턴 : 객체 인스턴스를 생성하는 패턴, 클라이언트와 인스턴스 사이의 연결을 끊는 패턴
    • 행동 패턴 : 클래스와 객체가 상호작용하는 방법과 역할을 분담하는 패턴
    • 구조 패턴 : 클래스와 객체를 더 큰 구조로 만들 수 있게 구성을 사용하는 패턴
      • MVC 패턴은 구조 패턴에 속합니다.

GoF 디자인 패턴 : 소프트웨어 영역에서 23가지 디자인 패턴을 정의하고 체계화한 패턴

 

MVC 패턴의 종류

 MVC 패턴의 MVC는 `Model, View, Controller` 의 약자로 구성되어 있습니다.
 MVC 패턴은 프로그램을 상기 3가지의 구성요소에 따른 역할로 구분해 정의합니다.

 

MVC 패턴의 등장 배경 : 너무 많은 역할에 대한 분리

  1. HTML 페이지를 더 쉽게 만드는 *템플릿 엔진의 등장
    • 템플릿 엔진 : HTML 문서 + 변경 필요 부분만 자바 코드를 사용하기 위한 목적의 엔진
      • (ex : JSP, Thymeleaf, Freemarker, Velocity)
  2. 템플릿 엔진에 집중된 로직을 분리하기 위한 MVC 패턴의 등장
    • 결국 템플릿 엔진에도 HTML과 자바 코드(비즈니스 로직)가 혼재했습니다.
    • 따라서 비즈니스 로직과 HTML 코드를 분리하자는 의견이 등장했습니다.

 

MVC 패턴의 특징 

패턴을 통해 사용자 인터페이스로부터 비즈니스 로직을 분리합니다.
  • UI의 시각적 요소와 이면의 비즈니스 로직을 구분해 독립적인 유지보수가 가능하다는 점이 있습니다.

 

MVC 패턴의 종류

MVC1, MVC2 아키텍처에서 발전된 패턴 2개가 있다.
  • MVC1 : View, Controller를 모두 JSP가 담당하는 형태입니다.

출처 : https://chanhuiseok.github.io/posts/spring-3/
출처 : https://chanhuiseok.github.io/posts/spring-3/

 

  • JSP 가 두가지 기능을 담당하고 있어 코드 가독성 ⬇️ 복잡성 ⬆️
  • 이후 Controller 역할을 하는 Servlet *(서블릿) 이 추가된 MVC 패턴 2가 등장합니다.
    • 서블릿 : 클라이언트 요청을 처리, 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
      1. 사용자가 URL을 입력 시(HTTP Request) Servlet 컨테이너로 전송합니다.
      2. Servelet 컨테이너는 HTTPServletRequest, HTTPServletResponse 객체를 생성합니다.
      3. 서블릿의 요청에 따라 메소드를 호출하고 동적 페이지를 생성하는 CGI(프로그램의 웹 출력 결과를 전송하는 방법)에게 출력 화면을 생성을 지시합니다.

 

  • MVC2 : JSP = View, Servelet = Controller 가 담당하는 형태입니다.

출처 : https://chanhuiseok.github.io/posts/spring-3/

 

  • Controller, View의 명확한 분리로 가독성, 코드 유지보수 ⬆️
  • MVC2 패턴을 잘 발전시킨 대표적 프레임워크가 스프링입니다.

 

MVC 패턴의 구성요소

Model

애플리케이션이 무엇을 하는지 정의하는 부분으로, 비즈니스 로직을 처리하기 위한 역할입니다.

특징

  • 데이터 가공을 책임지는 Component 입니다.
  • 데이터 추출, 저장, 삭제, 업데이트 등의 역할을 수행합니다.
  • 클라이언트의 요청의 모든 정보를 가지고 있다.
  • DDD(도메인 주도 설계) 의 repository, service, entity 가 이에 해당합니다.

규칙

  • 사용자가 편집하기를 원하는 모든 데이터를 가지고 있어야 합니다.
  • ModelViewController에 대해서 어떤 정보도 알지 못해야 합니다.
  • 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야 합니다.

 

View

사용자에게 보여지는 부분, 즉 User Interface(UI) 를 의미합니다.

특징

  • 도메인 Model의 상태를 변환하거나, 받아서 렌더링하는 역할입니다.
  • html, css 등의 정적 리소스 및 동적 리소스(템플릿 엔진) 을 보여줍니다.

규칙

  • Model이 가지고 있는 정보를 따로 저장해서는 안됩니다.
  • ViewModel이나 컨트롤러에 대해서 어떤 정보도 알지 못해야 합니다.

 

Controller

Model과 View 사이를 잇는 브릿지 역할을 합니다.

특징

  • ViewModel이 각각 어떤 역할과 책임이 있는지 알고 있어야 합니다.
  • Model이 데이터를 어떻게 처리할지 알려주는 역할을 합니다.
  • Model의 데이터 변화를 View에게 전달하는 역할을 합니다.

규칙

  • Model이나 View에 대해서 알고 있어야 합니다.
  • Model이나 View의 변경을 모니터링 해야 합니다.