3 Layered Architecture Pattern

김지혜·2023년 8월 3일
0

Node.js

목록 보기
9/13
post-custom-banner

3 Layered Architecture Pattern


애플리케이션을 3개의 논리적 및 물리적 컴퓨팅 계층으로 분리하는 3계층 아키텍처
=> 기존의 클라이언트-서버 애플리케이션을 위한 주요 소프트웨어 아키텍처

🧩 계층별 역할

  1. Controller : 어플리케이션의 가장 바깥 부분, 요청/응답을 처리한다.
    • 클라이언트의 요청을 처리 한 후 서버에서 처리된 결과를 반환해주는 역할을 한다.
  2. Service : 어플리케이션의 중간 부분, 실제 중요한 작동이 많이 일어나는 부분이다.
    • 아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분이다.
  3. Repository : 어플리케이션의 가장 안쪽 부분, DB와 맞닿아 있다.
    • 실제 데이터베이스의 데이터를 사용하는 계층이다.

3 Layered Architecture Pattern의 장점

  • 우려 사항의 분리:각 계층은 코드 구성과 유지관리 가능성을 촉진하는 별개의 책임을 가지고 있다.

  • 재사용 가능성:격리된 계층은 다른 애플리케이션이나 동일한 애플리케이션의 일부에서 재사용할 수 있다.

  • 확장성:개별 계층은 필요에 따라 독립적으로 확장할 수 있다.

  • 유연성:일반적으로 한 계층을 변경하면 다른 계층에 미치는 영향은 최소화된다.

  • 보안:데이터 액세스를 분리하면 액세스 제어 및 보안 조치를 시행하는 데 도움이 된다.

3 Layered Architecture Pattern의 단점

  • 복잡성: 1계층으로만 사용하는 것에 비해 관리가 더 필요하다.
  • 비용: 비용이 많이 발생한다.

controller 프레젠테이션 계층(사용자 인터페이스 계층)

  • 이 계층은 사용자 상호 작용을 처리하고 사용자에게 정보를 제공하는 역할을 한다.
  • 사용자 인터페이스, 웹 페이지, 모바일 앱 및 기타 프레젠테이션 관련 요소와 같은 구성 요소를 포함한다.
  • 이 계층의 주요 초점은 데이터를 수집하여 사용자에게 표시한다.

EX.

class UserInterface {
  showProducts(products) {
    // 사용자에게 제품 표시
    products.forEach((product) => {
      console.log(`${product.name} - $${product.price}`);
    });
  }

  getUserInput() {
    // 제품 선택에 대한 사용자 입력 가져오기
    const userInput = prompt("Enter the product ID to purchase:");
    return parseInt(userInput);
  }
}

// 프레젠테이션 레이어의 주 기능
const userInterface = new UserInterface();
const products = [
  { id: 1, name: "Product 1", price: 10 },
  { id: 2, name: "Product 2", price: 20 },
  { id: 3, name: "Product 3", price: 30 },
];

userInterface.showProducts(products);
const selectedProductId = userInterface.getUserInput();

// 추가 처리를 위해 선택한 ProductId를 비즈니스 논리 계층으로 보낸다.

=>

  • UserInterface 클래스에는 두 개의 메서드가 있다:
    • showProducts(products): 이 메서드는 제품들을 받아서 console.log를 사용하여 사용자에게 보여준다.
  • getUserInput(): 이 메서드는 사용자에게 제품 ID를 입력하도록 하고 사용자 입력 값을 정수로 변환하여 반환한다.

-> 로직

  • UserInterface의 인스턴스를 생성한다.
    • 제품을 나타내는 ID, 이름 및 가격이 포함된 제품 배열이 정의된다.
    • showProducts 메서드를 호출하여 제품들을 사용자에게 표시한다.
    • getUserInput 메서드를 호출하여 사용자가 선택한 제품 ID를 가져와 selectedProductId 변수에 저장한다.

service 비즈니스 논리 계층(애플리케이션 계층)

  • 비즈니스 논리 계층에는 애플리케이션의 핵심 기능 및 처리 규칙이 포함되어 있다.
  • 이것은 프레젠테이션 계층과 데이터 계층 사이의 중개자 역할을 한다.
  • 이 계층은 비즈니스 규칙, 검증, 계산 및 애플리케이션 관련 기타 논리를 캡슐화한다.

EX.

class BusinessLogic {
  getProductById(products, productId) {
    // ID별로 제품 세부 정보 검색
    return products.find((product) => product.id === productId);
  }

  calculateTotalCost(productPrice, quantity) {
    // 제품 가격 및 수량을 기준으로 총 비용 계산
    return productPrice * quantity;
  }
}

// 비즈니스 논리 계층의 주 기능
const businessLogic = new BusinessLogic();
const products = [
  { id: 1, name: "Product 1", price: 10 },
  { id: 2, name: "Product 2", price: 20 },
  { id: 3, name: "Product 3", price: 30 },
];
const selectedProductId = 2;
const quantity = 3;

const selectedProduct = businessLogic.getProductById(products, selectedProductId);
if (selectedProduct) {
  const totalCost = businessLogic.calculateTotalCost(selectedProduct.price, quantity);
  console.log(`Total cost for ${quantity} units of ${selectedProduct.name}: $${totalCost}`);
} else {
  console.log("Product not found.");
}

=>

  • BusinessLogic 클래스에는 두 개의 메서드가 있다:
    • getProductById(products, productId): 이 메서드는 제품 배열과 제품 ID를 인자로 받는다.
      Array.find 메서드를 사용하여 주어진 ID와 일치하는 제품을 배열에서 찾아 반환하거나 찾지 못한 경우 undefined를 반환한다.
    • calculateTotalCost(productPrice, quantity): 이 메서드는 제품 가격과 수량을 인자로 받아 제품 가격에 수량을 곱하여 총 가격을 계산한다.

-> 로직

  • BusinessLogic의 인스턴스를 생성한다.
    • 프레젠테이션 레이어에서 사용한 제품 배열을 같이 사용한다.
    • selectedProductIdquantity를 데모용으로 정의한다.
    • getProductById 메서드를 호출하여 제품 배열과 selectedProductId로 선택된 제품을 찾는다.
    • 선택된 제품이 존재하는 경우, calculateTotalCost 메서드를 호출하여 제품 가격과 수량을 기반으로 총 가격을 계산하고 그 결과를 콘솔에 출력한다.
    • 선택된 제품이 존재하지 않는 경우, 제품이 찾지 못했다는 메시지를 콘솔에 출력한다.

Repository 데이터 액세스 계층(지속성 계층)

  • 데이터 액세스 계층은 데이터 저장 및 검색 작업을 처리하는 역할을 한다.
  • 데이터베이스, 파일, API 또는 데이터를 읽거나 쓰는 모든 데이터 소스와 상호 작용한다.
  • 이 계층의 주요 목표는 데이터 액세스 프로세스를 추상화하여 다른 계층에 영향을 주지 않고 다른 데이터 소스 간에 쉽게 전환할 수 있도록 하는 것이다.

EX.

// array를 데이터 소스로 사용하고 있지만 실제 시나리오에서는 데이터베이스 또는 API의 데이터일 수 있다.
const products = [
  { id: 1, name: "Product 1", price: 10 },
  { id: 2, name: "Product 2", price: 20 },
  { id: 3, name: "Product 3", price: 30 },
];

=>

  • 데이터 액세스 레이어는 간단한 형태로, products라는 배열을 정의:
    • 이 배열은 제품 정보를 담고 있는 데이터 소스로 사용
    • 실제 응용 프로그램에서는 데이터베이스나 API에서 데이터를 검색하는 등 더 복잡한 방법으로 데이터 액세스를 구현할 수 있다.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

글 잘 봤습니다.

답글 달기