[MSA 알아보기] 5. 마이크로서비스 아키텍처 내부 구조

mrcocoball·2023년 12월 26일
0

Architecture

목록 보기
5/5
post-custom-banner

해당 포스트는 MSA에 대한 개념과 주요 기술에 대해 알아보고 실무에 적용했었던 내용을 정리하는 포스트입니다.

1. 마이크로서비스 아키텍처 내부 구조

앞서 알아본 아키텍처들의 지향 원칙

앞서 알아본 레이어드 아키텍처, 헥사고날 아키텍처, 클린 아키텍처 모두 마이크로서비스 개발에 통용되는 패턴이며 지향 원칙에 있어서 다음과 같은 공통점을 가지고 있습니다.

  • 지향하는 관심사에 따라 응집성을 높이고 관심사가 다른 영역과는 의존도를 낮춰야 함
  • 업뮤 구칙을 정의하는 비즈니스 로직 영역을 다른 기술 기반 영역으로부터 분리하기 위해 노력해야 함
  • 세부 기술 중심, 저수준의 외부 영역핵심 업무 규칙이 정의된 고수준의 내부 영역으로 구분함
  • 고수준 영역은 저수준 영역에 의존하지 않게 해야 하며 저수준 영역이 고수준 영역에 의존하게 해야 함
  • 저수준 영역은 언제든지 교체, 확장 가능해야 하며 이 같은 변화가 고수준 영역에 영향을 줘서는 안됨
  • 인터페이스 및 추상 클래스를 지원하는 언어의 경우 저수준 영역의 구체 클래스가 고수준 영역의 추상 인터페이스에 의존하게 하는 의존성 역전 원칙을 적용
  • 인터페이스는 고수준의 안정된 영역에 존재해야 하며 저수준의 어댑터가 이를 구현해야 함

마이크로서비스의 내부 아키텍처는 도메인 / 프로젝트의 형태에 따라서 다양하게 설계가 가능하지만 위의 지향 원칙을 항상 염두해두어야 합니다.

마이크로서비스 아키텍처 내부 구조에 대해

마이크로서비스 아키텍처의 내부 구조를 설명하는 많은 자료들 다음과 같은 구조를 예시로 들고 있습니다.

  • 내부 영역 : 순수한 비즈니스 로직을 표현하는 기술 독립적인 영역
    • 도메인 : 핵심 비즈니스 개념 / 규칙을 구현
    • 서비스 : 도메인을 감싸며 도메인을 호출하여 업무를 처리하는 절차를 기술, 외부 영역과 연계하기 위해 서비스 인터페이스를 보유
    • 서비스 인터페이스 : 외부에서 내부 영역을 사용할 수 있도록 API를 제공, 서비스가 이를 구현
    • 리포지토리 인터페이스 : 저장소 처리를 위한 인터페이스, 외부 영역에서 정의하지 않고 내부 영역에서 정의. 비즈니스를 처리하는데 필요한 기본적인 저장소 처리 사항을 추상화해 정의. 외부 영역의 저장소 어댑터는 이 리포지토리 인터페이스를 각 저장소에 맞는 저장소 처리 세부 기술로 구현
  • 외부 영역 : 인터페이스 처리를 담당하는 저수준 영역
    • 인바운드, 아웃바운드 어댑터 : 의존 관계 역전 원칙을 적용하여 외부 영역에서 내부 영역에 의존하도록 설계

2. 내부 영역 : 업무 규칙

개요

내부 영역은 위에서 소개하였듯 순수한 비즈니스 로직을 표현하는 기술 독립적인 영역이며 도메인, 서비스, 서비스 인터페이스, 리포지토리 인터페이스, 도메인 이벤트 인터페이스, API 프록시 인터페이스 등이 존재합니다.

여기서 서비스 인터페이스는 외부 영역이 내부 영역에 대해 너무 알지 못하게 하는 역할을 담당하며 그 외 인터페이스는 의존 관계 역전 원칙을 지원해서 저수준의 외부 어댑터가 고수준 영역의 인터페이스를 구현하게끔 합니다.

서비스와 도메인은 유스케이스와 엔티티의 역할과 같으며, 도메인은 비즈니스 개념을 표현하고 서비스는 도메인을 활용해 시스템 흐름 처리를 수행합니다.

비즈니스 로직 관련 패턴 종류

비즈니스 로직에 대한 패턴으로는 크게 트랜잭션 스크립트 패턴 / 도메인 모델 패턴 / 애그리거트 패턴이 있습니다.

트랜잭션 스크립트 패턴

  • 비즈니스 개념을 표현하는 도메인 객체가 행위를 가지고 있지 않음
  • 모든 비즈니스 행위, 무언가를 수행하는 책임이 서비스에 있음
  • 서비스가 점점 비대해지고 객체는 점점 정보 묶음의 역할만 수행
  • 비즈니스가 간단한 경우 쉽게 적용할 수 있으나 비즈니스가 복잡해질 경우 데이터베이스 중심 아키텍처에서 겪었던 문제점이 발생할 여지가 있음

도메인 모델 패턴

  • 도메인 객체가 데이터 뿐만 아니라 비즈니스 행위를 가지고 있으며 도매인 객체가 소유한 데이터는 도매인 객체가 제공하는 행위에 은닉됨
  • 도매인 객체는 각 비즈니스 개념 및 행위에 대한 책임을 수행
  • 서비스는 비즈니스 유스케이스를 구현하기 위해 서비스의 행위를 도메인 객체에 일부분 위임해서 처리
  • 서비스의 책임들이 도메인으로 적절히 분산됨
  • 거대한 서비스 클래스 대신 각기 적절한 책임을 가진 여러 클래스들로 구성되어 이해하기 쉽고 관리 / 테스트가 용이
  • 핵심은 도메인 모델이기 때문에 객체지향 지식에 대한 경험과 역량이 필요

애그리거트(Aggregate) 패턴

  • 도메인 주도 설계 / 개발에서 착안
  • 점점 복잡해질 수 있는 객체 모델링의 단점을 보완한 패턴
  • 도메인 모델링을 하다 보면 객체 간의 관계를 참조로 표현 → 일대다 관계의 객체를 쉽게 사용할 수 있는 장점이 있으나 업무가 복잡해지면 참조로 인한 다단계 계층 구조가 생기고 참조 관계가 점점 복잡해지고 무거워질 수 있음
  • 최상위에 존재하는 엔티티(루트 엔티티)를 중심으로 개념의 집합을 분리한 것이 애그리거트 패턴
  • 애그리거트 : 개념적으로 묶인 엔티티의 모음 전체
  • 애그리거트 패턴 규칙
    • 애그리거트 루트만 참조
    • 애그리거트 내 상세 클래스를 바로 참조하지 않고 루트를 참조해야 함. 수정도 마찬가지
    • 애그리거트 간의 참조는 객체를 직접 참조하는 대신 기본 키를 사용
    • 기본 키 사용 시 느슨하게 연관되고 수중이 필요하지 않은 애그리거트를 함께 수정하는 실수를 방지
    • 하나의 트랜잭션으로 하나의 애그리거트만 생성 및 수정

3. 외부 영역 : 세부 사항

개요

외부 영역은 인터페이스 처리를 담당하는 저수준 영역이며 인바운드 어댑터의 경우 내부 영역의 서비스 인터페이스를 사용하고 아웃바운드 어댑터의 경우 내부 영역에서 선언한 아웃바운드 인터페이스를 구현합니다.
여기서 내부 영역이 먼저 정의된 후에 외부 영역의 세부 사항은 늦게 정의되어도 상관없도록 개발되어야 한다고 합니다.

어댑터 종류

다양한 종류의 어댑터들 중에서 대표적인 것들은 API 퍼블리싱 어댑터, API 프록시 어댑터, 저장소 처리 어댑터, 도메인 이벤트 발행 어댑터, 도메인 이벤트 어댑터가 있습니다.

API 퍼블리싱 어댑터

  • REST API를 발행하는 인바운드 어댑터
  • 내부 영역의 서비스 인터페이스를 호출, REST 형식의 API로 제공
  • 명시적 REST 리소스 명칭을 정의, REST 메서드가 의도에 맞게 서비스 인터페이스를 호출
  • 엔티티를 직접 제공하지 않고 API의 필요에 맞는 DTO를 생성, 엔티티를 변환 및 매핑해서 전달하는 것이 바람직

API 프록시 어댑터

  • 다른 서비스의 API를 호출하는 아웃바운드 어댑터
  • 내부 영역에 정의된 프록시 인터페이스를 구현
  • 다른 서비스의 API는 REST API가 될 수도 있고 소켓이나 SOAP 프로토콜을 사용하는 API일수도 있음

저장소 처리 어댑터

  • 데이터 처리 매커니즘 선택 필요 (ORM / SQL 매핑 방식)
  • 일반적으로 트랜잭션 스크립트 패턴 사용 시 SQL, 도메인 모델 패턴 사용 시 ORM을 사용

도메인 이벤트 발행 어댑터

  • 서비스 간 비동기 메시지 통신에서 전달 대상이 되는 정보가 도메인 이벤트
  • 도메인 이벤트는 어떤 사건에 따른 상태의 변경 사항을 의미
    • 주문됨, 주문 취소됨 등
  • 컨슈머에게 전달되기 위해 도메인 이벤트 발행 어댑터를 통해 발행됨
  • 애그리거트 패턴을 적용할 경우 도메인 이벤트는 애그리거트에서 발생한 사건이 됨
  • 실제 도메인 이벤트가 생성되는 위치는 내부 영역, 발행 어댑터는 내부 영역의 인터페이스를 구현하여 아웃바운드로 특정 메시지 큐나 스트림 저장소에 발행하는 역할을 수행

도메인 이벤트 어댑터

  • 도메인 이벤트를 수신할 수 있는 인바운드 어댑터
  • 외부에서 발행된 도메인 이벤트를 구독해서 내부 영역으로 전달
  • 이벤트 상태에 따라 적절한 서비스 인터페이스를 호출, 내부 영역에 이벤트를 전달

Appendix. 출처

도메인 주도 설계로 시작하는 마이크로서비스
마이크로서비스 패턴

profile
Backend Developer
post-custom-banner

0개의 댓글