레거시 코드 리팩토링

CHEESE·2023년 2월 23일
0
post-thumbnail

💡 소프트웨어의 복잡성을 다루는 지혜

도메인 주도 설계 - 에릭 에반스의 저서(블루북)
경우에 따라 DDD 기술 규칙과 패턴이 DDD 구현에 방해가 될 수 있음
중요한 것은 패턴 자체가 아닌 비즈니스 문제에 맞게 코드를 구성하고 동일한 비즈니스 용어를 사용하는 것
CRUD처럼 간단한 업무는 더 간단한 방법으로 관리할 수 있음

💡 Why DDD?

클린 아키텍처

  • 존재 이유를 모르는 오류 검사 코드
  • 수 많은 분기문
  • 메서드를 고칠 때마다 코드 분석 + 기존 코드 동작 방식을 기획자가 알고 있었는지 확인해야 함
  • 비즈니스 규칙은 자바, 자바스크립트, SQL, 운영 정책 등 곳곳에 존재함
    => 비즈니스 규칙을 한 곳에 모아야 겠다 !

엔티티는 가장 일반적이며 고수준인 규칙을 캡슐화한다.

소프트웨어의 존재 가치

  • 소프트웨어의 본질은 해당 소프트웨어의 사용자를 위해 관련 문제를 해결하는 능력에 있다.
  • 얼마나 빠른지, 얼마나 많은 처리가 가능한지는 나중 이야기
  • 비즈니스의 이해, 관련 지식 쌓기, 본질적 복잡성과 우발적 복잡성의 구별이 매우 중요함(No Silver Bullet)

뭐가 문제야?

  • 고층 빌딩에 입주 전부터 입주자들이 엘레베이터 서비스에 불만을 느낀다
  • 속도를 높인다, 업무 시간을 엇갈리게 배치한다, 빌딩 내 사람 수를 제한한다 => 사용자 입장에서의 해결책
  • 빌딩을 불 태우고 보험금을 받는 것이 건물주 입장에서는 더 좋은 해결책일지도...

도메인

  • 소프트웨어로 해결하고자 하는 문제 영역
  • 쇼핑몰 구축 -> 전자 상거래 도메인 -> 전자 상거래에 대한 이해

도메인 모델

  • 모델 : 목적을 위해 현실 세계에 존재하는 것을 가공하고 편집하여 정보를 제공
  • 특정 다이어그램이 아니라 다이어그램이 전달하려는 아이디어
  • 목적을 가진 의사소통 수단
  • 회의, 기획, 디자인, 개발 전 과정에 사용되어야 한다.
  • 도메인 모델을 사용하면 여러 이해관계자가 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다.

💡 도메인 주도 설계

  • 해결해야 하는 문제 영역이 너무 크다 => 분할 정복 하자!
  • 관심사를 분리 && 격리하여 문제 해결에 집중할 범위를 정한다.
    도메인 주도 설계란 프로젝트의 모든 이해 관계자들이 일을 잘하는 방법
    MSA에서 넘어오는 사람들이 많더라...

현실

  • 기획자의 도메인 모델 != 개발자의 도메인 모델
  • 개발자는 요구 사항을 기술 언어로 번역
  • 번역된 언어는 의사 소통을 위해 다시 번역
    => 의사 소통 비용의 낭비!

에릭 어반스의 저서

  • 애자일 && 익스트림 프로그래밍의 열렬한 지지자
  • 의사소통을 개선하고 프로젝트 방향을 빠르게 변경할 수 있는 능력을 향상시키자.

세 개의 기둥

유비쿼터스 언어

  • 코드의 가독성을 높여서 코드를 분석하고 이해하는 시간을 절약할 것
  • 용어가 정의될 때마다 용어 사전에 이를 기록하고 명확하게 정의해서 모든 사람이 공통된 언어를 사용할 수 있게 한다.

전략적 설계

전술적 설계

  • repository
  • aggregate
  • event
  • ...

Bounded Context

  • 하위 도메인마다 같은 용어라도 의미가 다르고 같은 대상이라도 지칭하는 용어가 다름
  • 모델은 특정한 컨텍스트 안에서 완전한 의미를 갖는다.
  • 구분되는 경계를 갖는 컨텍스트를 DDD에서 Bounded Context라고 한다.
  • 하나의 bounded context는 하나의 팀에만 할당해야 한다.
    => bounded context는 마이크로서비스랑 비슷하네요~

context map

  • bounded context는 결국 모여서 하나의 도메인이 되니까 상호 교류하는 시스템의 목록을 제공해야 함!
  • 의사 소통의 촉매

애그리거트

  • 엔티티나 vo를 하나로 묶은 군집
  • 상위 수준에서 도메인 모델 간 관계를 파악하기 위해
  • 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다.

리포지터리

  • 우리는 엔티티별로 리포지터리를 만들지만, DDD 관점에서는 애그리거트별로 리포지터리를 만드는 게 맞다. @Repository

도메인 서비스

  • 애그리거트에 넣기 애매한 도메인 개념은 억지로 넣기보다 도메인 서비스를 이용해 명시적으로 드러낸다.

DDD 전제 조건

  • 개발자만을 위한 것이 아니다.
  • 이해관계자들의 스폰서십이 필요하다.

DDD 아키텍처

DDD만의 아키텍처는 없다. 도메인을 잘 보호하기 위한 아키텍처를 사용하면 되는 것

0개의 댓글