[MSA] 8. MSA 설계 기법 - 전술적 설계

steve·2024년 3월 20일
0

Backend

목록 보기
15/17

개요

  • 전술적 설계 기법에 대해 알아본다
  • 도메인 주도 개발 방법 중 Aggregate 패턴에 대해 자세히 알아본다

전술적 설계 이해

  • 각각의 패턴 별로 지원도메인인지, 일반도메인인지, 핵심도메인인지 중요도로 구분하여 적용하는 패턴을 유연하게 적용시키는 것이 좋다.
    • 예시) 복잡한 로직이 포함되는 핵심도메인은 애그리것 패턴을 적용
    • 마이크로서비스의 폴리그랏 장점 활용
  • 마이크로 서비스 내부의 비즈니스 로직을 구현하는 5가지 패턴
  1. 트랜잭션 스크립트 패턴 (전통적 패턴)

    • 서비스 단위로 직접 데이터베이스에 접근하여 트랜잭션을 처리하는 패턴
    • 비슷비슷한 SQL 문이 여기저기 서비스간 중복으로 사용되며 비즈니스 로직이 점점 복잡해진다
    • SQL문에 종속적인 비즈니스 로직이 많아진다 → 클라우드 시대에는 관계형 DB만 사용하는 것이 아니라 NoSQL 같이 저장소가 다양하게 변경될 수 있다(폴리그랏)
    • 핵심 하위도메인에서는 사용하지 않는 것이 좋고 간단한 비즈니스로직을 구현할때만 사용한다
  2. 액티브 레코드 패턴 (낮은 수준의 도메인 모델 방식)

    • 객체 모델을 생성하여 객체 모델을 이용해 비즈니스 로직을 처리하는 것
    • Getter Setter만 있거나 Save정도의 메소드만 있는 간단한 형태
    • 비즈니스 로직은 단순하지만 복잡한 자료 구조인 경우 지원도메인이나 하위 도메인에 적용할 수 있다
  3. 도메인 모델 패턴

    • 도메인 모델은 행위+ 자료구조를 통해 비즈니스 로직을 구현함
    • 본질적으로 POJO로 돌아가는 방향
      • 기존의 여러 프레임워크를 사용하면서 비즈니스 로직이 오염이 되는 상황
      • 비즈니스 로직은 순수 자바로만 표현하자
      • 기술적인 셋팅 (SQL, 세션 관련 상속 받는 것들)은 피하자
      • 비즈니스 로직은 흐름 제어만 하며 주요 로직은 도메인 모델에 위임하여 처리 → 계속 개발하다보면 하나의 도메인에서 점점 여러 엔티티를 참조하게 되면서 복잡해지고 비대해지게 됨 → 애그리거트 패턴 등장
  4. 애그리거트 패턴

    • 복잡성을 관리할 단위를 구분(Aggregate)하여 표현

    • 대부분 한개의 Entity와 여러 개의 VO구성

      • 위의 사진에서 AggregateA를 애그리거트 루트라고 하며, Entity 역할을 함
    • Value Object

      • DTO가 아닌 도메인 모델을 표현하는 유형 중 하나
      • 개념적으로 완전한 하나를 표현
      • 원시타입으로 정의하게 되면 부적절한 값이 들어갈 수 있기 때문에 안정적이지 않은 객체가 만들어 질 수 있으며 이를 방지하기 위해 의미가 잘 드러나도록 식별자를 VO로 표현
      • 상태를 변경할 수 없는 불변(Immutable) 객체
      • VO 사용 장점
        1. 명료성 향상
        2. 의도 명확히 전달
        3. 유효성 검사
        4. 유비쿼터스 언어 사용 비즈니스 도메인 개념 표현
    • Entity

      • 도메인의 고유 개념 표현
      • Entity 객체는 Data와 Operation을 제공
    • 도메인 모델 예시

      • 기본 형태
        • 공통 코드는 enum 으로 정의하여 바운디드 컨텍스트 안에서 처리될 수 있도록 구성
      • VO를 분리한 리팩토링 후 형태
    • 애그리거트 상세 설명
      - 관련 객체를 하나로 묶은 군집
      - 진한 주황색 : Aggregate Root
      - 애그리거트 루트를 통해 애그리거트 내의 다른 Entity 및 VO 접근
      - 애그리거트 하나가 데이터 변경의 단위, 트랜잭션 단위가 되는 연관된 객체의 묶음이다

      - 설계 고려 사항
      1. 하나의 트랜잭션에는 하나의 애그리거트만 수정
      2. 성능 최적화를 위해 애그리거트가 비대해짐을 경계해야 함 → 하나의 일을 잘 수행할 수 있는 작은 애그리거트로 분리해야 함
      3. 애그리거트 간 참조는 식별자를 통해서만 참조해야 함 (Product ID VO를 통해 참조)


      4. 하나의 트랜잭션에서 여러 애그리거트가 갱신되어야 하는 경우 다른 애그리거트의 갱신은 비동기 통신을 활용하여 결과적 일관성을 맞춰야 함
      - BASE 데이터베이스 트랜잭션 Model
      - Basically Available, Soft state, Eventually consistent
      - ProductOrdered 라는 도메인이벤트가 처리될 때 발생하는 트랜잭션 처리 예시

      - 도메인 이벤트
      - 비즈니스 도메인에서 일어난 중요한 이벤트를 설명하는 메시지 (과거형)
      - 애그리거트는 자신의 도메인 이벤트를 발행
      - 도메인 서비스
      - 특정 Entity/VO에 속하지 않는 도메인 로직 또는 복수의 애그리거트에 관련된 비즈니스 로직 제공
      - 상태가 없는 객체로써 다수의 애그리것이 포함되어야 하는 경우 서비스 객체를 만들어 처리

      - Repository
      - 도메인 모델의 영속성을 처리
      - Factory
      - 복잡한 Entity 또는 애그리것 생성을 전담하는 객체 → 주로 프레임워크에서 자체적으로 처리해줌
      - 응용서비스
      - 도메인 모델에 속하지 않고 응용 계층에서 애그리것을 저장하는 메소드, 애그리것 루트 식별자로 애그리것을 조회하는 메소드를 제공

              - 응용서비스가 JPA Repository를 통해 객체를 조회한 후 응용서비스에서 도메인의 비즈니스 로직을 처리하는 방법이다. 보통 트랜잭션 처리할 때 주로 이런 방법을 사용한다
  5. 이벤트 소싱 패턴

    • 연계되는 트랜잭션 처리에 대해 객체 모델로 저장해서 하나하나 처리하는 것이 아닌 트랜잭션을 갖는 이벤트들을 이벤트 저장소에 저장하여 처리

0개의 댓글

관련 채용 정보