웹 서버 통신 중 MVC라는 아키텍처 패턴이 많이 적용된다고 한다.
아키텍처 패턴이 정보처리기사에도 나오고, 디자인패턴과 혼동되어 찾아보게 되었다.

아키텍처 스타일이란,

소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션이다.

아키텍쳐 스타일은 소프트웨어 디자인 패턴과 유사하지만 더 큰 범주에 속한다.
한 기술사 강사님 말씀에 따르면, 아키텍처 스타일은 정확하게 정해져 있는 것이 아니라 만들어낼 수도 있는 것이라고 한다.
찾아본 아키텍처 스타일은 아래 10가지이다.

  1. 계층화 패턴 (Layered pattern)
  2. 클라이언트-서버 패턴 (Client-server pattern)
  3. 마스터-슬레이브 패턴 (Master-slave pattern)
  4. 파이프-필터 패턴 (Pipe-filter pattern)
  5. 브로커 패턴 (Broker pattern)
  6. 피어 투 피어 패턴 (Peer-to-peer pattern)
  7. 이벤트-버스 패턴 (Event-bus pattern)
  8. MVC 패턴 (Model-view-controller pattern)

하나하나 간단하게 짚고 넘어가보자면,

1. 계층화 패턴(Layered pattern)

<개념>
복잡한 시스템을 계층 구조로 구성하여 구현하는 방법

<특징>

  • 이 패턴은 시스템을 여러 개의 계층으로 분리하고,
  • 각 계층이 서로 독립적으로 동작하며 상위 계층에서 하위 계층으로의 의존성을 가지도록 설계한다.

<분류>
1. UI계층 ( Presentation layer )
(사용자의 명령을 해석 또는 표현)
2. 응용계층( = 서비스계층 ) ( Application layer )
작업을 조정하고 아래 계층에게 작업을 위임
3. 도메인 계층( = 모델 계층 )( Business logic layer )
업무개념 및 업무상황, 업무규칙을 표현/상태 제어
4. 영속 계층( = 인프라스트럭처 ) ( Data access layer )
상위 계층을 지원화는 일반화된 기술적 기능 지원 계층
EX) 메시지 전송, DB접근 등

<활용 예시>

  • PC 어플리케이션
  • 전자상거래 웹 어플리케이션

2. 클라이언트-서버 패턴 (Client-server pattern)

개념

  • 서버 클라이언트 시스템이란 위 사진과 같이 여러개의 클라이언트가 네트워크 통신을 활용해 서버에 접속을 하고 그 서버와 붙어있는 데이터베이스를 활용할 수 있는 시스템
  • 클라이언트와 서버 간의 상호작용을 기반으로 한 분산 시스템을 구축하는 방법
    • 클라이언트와 서버 간 작업을 분리해주는 분산 애플리케이션 구조

      <특징>

  • 서버는 계속 클라이언트로부터 요청을 대기
  • 다수의 클라이언트 및 다수의 서버 구조 가능.
Q. 분산시스템이란?
A. 여러 컴퓨터 또는 장치들이 네트워크를 통해 연결되어
   동작하는 컴퓨터 시스템.(클라우드, 인터넷, 분산DB, 센서네트워크 ...)
   -> 중앙 집중식 시스템과는 달리,
      특정 중앙 서버가 모든 작업을 제어하거나 처리하는 것이 아니라,
      네트워크 상의 다수의 독립적인 노드들이 협력하여 분산된 작업을 수행

장점

  • 분산 아키텍처
    -- 클라이언트와 서버 간의 역할을 분리함으로써 기능을 분산시킬 수 있음! 이를 통해 서버 부하를 분산하고 확장성을 향상시킬 수 있다.
  • 중앙 집중화
    -- 서버는 중앙에서 데이터와 비즈니스 로직을 관리하므로, 데이터 일관성과 중앙 집중화된 관리가 가능하다.
  • 보안
    -- 서버는 데이터와 비즈니스 로직에 대한 접근 권한을 관리하므로, 보안 측면에서 중요한 역할을 합니다. 클라이언트는 보안적으로 취약한 환경에서 동작할 수 있으며, 서버에서 보안 감시와 접근 제어를 수행할 수 있다.
  • 유지보수 용이성
    -- 클라이언트와 서버의 역할이 분리되어 있으므로, 각각을 독립적으로 유지보수할 수 있다. 클라이언트와 서버 간의 인터페이스를 정의하여 변경이 필요한 경우, 상호간의 영향을 최소화할 수 있다.

단점

  • 의존성
    -- 클라이언트와 서버 간의 통신이 필요하므로, 네트워크 지연이 발생할 수 있다. 이는 성능 저하의 원인이 될 수 있다.
  • 확장성 제한
    -- 서버에 과도한 부하가 발생하거나 트래픽이 급증하는 경우, 서버를 확장하여 대응해야 합니다. 이는 추가 비용과 복잡성을 유발할 수 있다.
  • 클라이언트 호환성
    -- 클라이언트와 서버 간의 프로토콜 및 인터페이스를 업데이트할 경우, 이전 버전의 클라이언트와의 호환성을 고려해야 합니다. 이는 일부 사용자가 업데이트를 반영할 수 없게 만들 수 있다.

1 : 1 클라이언트 서버 모델

1 : N 클라이언트 서버 모델

N : N 클라이언트 서버 모델

<활용 예시>

  • 중간 채널계 역할 서버
  • 웹앱 어플리케이션

3. 마스터-슬레이브 패턴 (Master-slave pattern)

<개념>
분산 시스템에서 데이터의 복제와 관련된 패턴

<특징>

  • 하나의 마스터, 다수의 슬레이브로 구성
  • 데이터의 복제 (마스터 노드의 -> 슬레이브 노드)

<활용 예시>

  • 데이터베이스 복제에서 활용됨.
    -- 마스터 데이터베이스는 신뢰할 수 있는 데이터 소스로 간주되며 슬레이브 데이터베이스는 마스터 데이터베이스와 동기화된다.
  • 컴퓨터 시스템에서 버스와 연결된 주변장치에 활용
    -- (마스터 드라이버와 슬레이브 드라이버)

4. 파이프-필터 패턴 (Pipe-filter pattern)

<개념>
데이터 처리 과정을 여러 단계로 분할하고, 각 단계를 파이프라인으로 연결.
=> 데이터를 효율적으로 처리하는 방식
데이터 스트림을 생성하고 처리하는 시스템에서 사용한다.

<특징>

  • 각 처리 과정은 필터 컴포넌트에서 이루어짐.
  • 처리되는 데이터는 파이프를 통해 흐른다.

장점

  • 모듈화와 재사용성
    -- 각 단계는 독립적인 모듈로 구현되기 때문에 재사용성이 높아진다. 특정한 작업을 수행하는 단계를 추가하거나 변경할 때, 전체 파이프라인을 수정할 필요 없이 해당 단계만 수정하면 된다.
  • 유연성
    -- 파이프 필터 패턴은 데이터 처리 과정을 여러 단계로 나누어 구성하므로, 필요에 따라 단계를 추가, 제거 또는 재배치할 수 있다. 다시말해 새로운 기능을 쉽게 추가할 수 있는 장점을 가지므로 이는 유연성과 확장성을 제공한다고 볼 수 있다.
  • 가독성과 유지보수성

단점

  • 오버헤드
  • 순서 의존성
  • 유연성 제한

<활용 예시>

  • 컴파일러. 연속한 필터들은 어휘 분석, 파싱, 의미 분석 그리고 코드 생성을 수행한다.
  • 생물정보학에서의 워크플로우

5. 브로커 패턴 (Broker pattern)

<개념>
애플리케이션 또는 시스템 간의 통신을 중재하는 중간 계층을 도입하여 확장성과 유연성을 개선하는 방법을 제공

<특징>

  • 분리된 컴포넌트들로 이루어진 분산 시스템에서 사용됨.
  • 원격 서비스 실행을 통해 서로 상호 작용을 할 수 있다.
  • 브로커 : 애플리케이션 또는 서비스 간의 통신을 중재하는 중간 계층
    -- (브로커는 클라이언트와의 통신을 관리하고, 데이터를 필터링하거나 변환하여 적절한 클라이언트에게 전달) => 느슨한 결합도를 유지하도록 도와줌.
  • 클라이언트 : 브로커에게 데이터 또는 이벤트를 구독하거나 발행하는 역할
    --(필요한 데이터를 구독하여 브로커로부터 전달받을 수 있으며, 필요에 따라 데이터를 발행하여 다른 클라이언트에게 전달할 수도 있다.)

장점

  • 중앙 집중화된 통신
    -- 브로커는 컴포넌트 간의 통신을 중개함. 따라서 컴포넌트 간의 직접적인 통신이 필요하지 않음. 이로써 컴포넌트 간의 결합도가 낮아지고, 시스템이 더 모듈화되며 확장성이 향상됨.

    -- 컴포넌트란?
    -- 소프트웨어 개발에서 재사용 가능한 독립적인 모듈 또는 구성요소.
    -- 모듈이란?
    -- 소프트웨어 개발에서 재사용 가능한 독립적인 코드 조각.

  • 표준화된 인터페이스
    -- 브로커는 컴포넌트들 사이에서 표준화된 인터페이스를 제공하므로, 각 컴포넌트는 동일한 방식으로 브로커와 통신할 수 있습니다. 이는 시스템의 유연성과 상호 운용성을 향상시킵니다.
  • 분산 환경 관리
    -- 브로커는 분산 환경에서 중앙 집중화된 관리를 제공. 로드 밸런싱, 실패 복구, 메시지 큐 등과 같은 기능을 통합하여 처리할 수 있습니다. 이는 시스템의 성능과 안정성을 향상시킴.

    -- 로드밸런싱이란?
    -- 여러대의 서버나 네트워크에 작업을 균등하게 분산하여 부하를 낮추는 방법.
    -- 메시지 큐란?
    -- 비동기적인 통신 방식을 사용하여 시스템이나 애플리케이션간 메시지를 교환하는 기술.
    -- 비동기적이란?
    -- 작업의 진행 순서와 관계 없이 독립적으로 실행 되는 방식.

단점

  • 단일 장애 지점
    -- 브로커가 중앙 집중화된 매개체이기때문에, 브로커의 장애가 시스템 전체의 장애가 됨.
  • 추가적인 네트워크 오버헤드
    -- 컴포넌트간 통신을 브로커를 통해 전달하므로, 추가적인 네트워크 오버헤드가 발생할 수 있음.
    -- 네트워크 오버헤드란?
    -- 네트워크 통신시 발생하는 추가적인 데이터전송 및 처리 비용

<활용 예시>

  • Apache ActiveMQ, Apache Kafka, RabbitMQ 및 JBoss Messaging와 같은 메시지 브로커 소프트웨어

6. 피어 투 피어 패턴 (Peer-to-peer pattern)

<개념>
네트워크 참여자들 간에 대등한 관계로 데이터와 서비스를 공유하는 분산 시스템을 구축하는 방식

<특징>

  • 피어는 클라이언트로서 피어에게 서비스를 요청할 수도 있고,
  • 서버로서 각 피어에게 서비스를 제공할 수도 있다.
  • 피어는 클라이언트 또는 서버 혹은 둘 모두로서 동작할 수 있으며, 시간이 지남에 따라 역할이 유동적으로 바뀔 수 있다.

장점

  • 탈중앙화
    -- 중앙 집중화된 서버가 없기 때문에 단일 장애점이 없다!(브로커패턴과 반대구나)
  • 확장성
    -- 새로운 피어가 추가될 때 시스템 확장성이 용이하다.
  • 자율성
    -- 각 피어는 자체적으로 의사 결정을 내릴 수 있음.

단점

  • 보안성과 신뢰성
    -- 피어간 직접 통신이 이루어지기 때문에 데이터 보안과 신뢰성을 유지하기 어려움.
  • 자원 활용 및 성능
    -- 각 피어간 자원공유와 서비스 제공이 이루어지다 보니 자원의 최적화가 중요하다. 즉 최적화가 제대로 이루어지지 못하다면 성능저하로 직결 될 수 있다.

<활용 예시>

  • 파일 공유
  • 분산컴퓨팅
  • 블록체인

7. 이벤트-버스 패턴 (Event-bus pattern)

<개념>
확장성이 뛰어난 반응형 앱을 구현하기 위한 분산 비동기형 패턴.

<특징>

  • 네트워크 버스 방식과 비슷하다.

    -- 네트워크 버스란?
    -- 컴퓨터 시스템의 중앙집중화된 통신 경로. 데이터버스, 주소버스, 제어버스로 나뉜다.

  • 이벤트를 비동기형식으로 전달하고 처리한다.

장점

  • 느슨한 결합
    -- 이벤트 버스패턴은 발행자와 구독자간 느슨한 결합을 제공한다. 예를들어, 구독자의 이벤트가 발생했을 때 발행자는 어떤 구독자인지 파악할 필요가 없다. 이로써 컴포넌트들은 서로 독립적으로 개발,유지보수 될 수 있다.
  • 확장성
    -- 이벤트 버스패턴은 구독자가 원하는 서비스만 구독할 수 있고, 발행자 또한 구독을원하는 구독자에게만 서비스를 제공하는 형태이다. 이러한 작업은 구독리스트에 추가,제거하는 형태로 이루어지므로 구독자 추가 및 삭제에 있어 확장성이 용이하다고 볼 수 있다.
  • 모듈성
    -- 각 컴포넌트는 필요한 이벤트를 구독하여 독립적으로 작동한다.

단점

  • 디버깅과 추적의 어려움
    -- 컴포넌트간의 직접적인 통신이 아니기때문에 디버깅과 추적이 어렵다.
  • 네트워크 부하
    -- 대규모 시스템에서 사용시 이벤트 전체가 시스템에 몰려들기 때문에 네트워크 부하가 생길 수 있다.

    Q. 궁금증. 이벤트 버스 패턴은 분산 비동기 형태라고했는데, 왜 시스템 전체에 데이터가 몰려들지? 분산은 과부하를 줄이는 역할을 하지 않나?
    A. Chat GPT 네이놈...

<활용 예시>

  • 안드로이드 개발
  • 알림 서비스(observer패턴과 유사)

8. MVC 패턴 (Model-view-controller pattern)

<개념>
애플리케이션을 Model, View, Controller 세 가지 역할로 구분한 개발 방법론

<이벤트 발생시 흐름>
1. 사용자가 Controller를 조작
2. Controller는 Model을 통해 데이터를 가져옴.
3. 데이터를 바탕으로 View를 통해 시각적 표현을 제어

<MVC패턴을 잘 사용한다면 얻는 이점?>

이러한 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시작적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있게 된다

요약=>유지보수가 아주 용이해진다 !!

<특징>

  • Model ( 데이터를 가진 객체 )
    모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보합니다. 이와 같은 통보를 통해 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가, 제거, 수정할 수 있다.
  • View ( 정보를 화면으로 보여주는 역할 )
    사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어온다.
  • Controller ( 사용자의 입력 처리와 흐름 제어 담당. 화면과 Model과 View를 연결시켜주는 역할 )
    사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후에 그 요청에 맞는 데이터를 Model을 의뢰하고, 데이터를 View에 반영해서 사용자에게 알려준다.

MVC패턴에는 두 가지 방식이 있다.

<모델 1 방식> JSP에서 출력과 로직을 모두 처리

controller영역과 view영역을 같이 구현하는 방식.
사용자의 요청을 JSP가 전부 처리한다. 요청을 받은 JSP는 JavaBean Service Class를 사용하여 웹브라우저 사용자가 요청한 작업을 처리하고 그 결과를 출력한다.

모델 2 방식: JSP에서 출력만 처리


웹브라우저 사용자의 요청을 서블릿이 받고 서블릿은 해당 요청으로 View로 보여줄 것인지 Model로 보낼 것인지를 판단하여 전송한다. HTML 소스와 JAVA소스를 분리해놓았기 때문에 모델 1 방식에 비해 확장시키기도 쉽고 유지보수 또한 쉽다.

MVC 패턴의 한계

MVC패턴에서 View는 Controller에 연결되어 화면을 구성하는 단위 요소이므로 다수의 View를 가질 수 있다. 그리고 Model은 Controller를 통해서 View와 연결되지만, Controller에 의해서 하나의 View에 연결될 수 있는 Model도 여러 개가 될 수 있어 View와 Model이 서로 의존성을 띄게 된다. 즉, Controller에 다수의 Model과 View가 복잡하게 연결되어 있는 상황이 발생할 수 도 있다.

<활용 예시>

  • 리액트
  • 장고
  • PHP의 CODEIGNITER
  • Angular JS

그렇다면, 아키텍처 패턴보다 작은 범주라고 말하는 디자인 패턴이란?

소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 해결책을 제공하는 것이다.

디자인 패턴은 개별적인 클래스나 객체 수준에서 발생하는 문제를 해결한다.

둘 다 소프트웨어에서 자주 발생하는 문제를 해결하기 위해 재사용 가능한 해결책을 제시한다는 점에서 같지만,

규모가 다르다는 점에서 큰 차이가 있었다.

아키텍처 패턴은 큰 규모의 시스템 수준에서 발생하는 문제를 해결하기 위한 구조적인 지침과 원칙이나, 디자인 패턴은 클래스와 객체 수준의 문제를 해결할 수 있다는 것이다.

profile
1% 개발자를 향해:: 개발 공부 일지를 써나갑니다

0개의 댓글