This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned on this page are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab Inc.
Status Authors Coach DRIs Owning Stage Created
proposed @fabiopitino 2023-09-29

도메인 모듈을 패키지로 변환하기

기존 코드를 모듈화하기 위한 일반적인 단계는 다음과 같을 수 있습니다:

  1. 동일한 네임스페이스를 사용하여 동일한 bounded context에 관련된 모든 클래스와 모듈에 사용합니다.

    • 왜? 코드베이스에서 플레이 중인 도메인에 대한 대략적인 이해 없이는 계획을 세우기 어렵습니다. 누구나 따라갈 수 있는 잘 네임스페이스가 지정된 코드를 갖는 것도 모듈화의 전제조건입니다.
    • 도메인이 이미 잘 네임스페이스가 지정되어 있고 유사한 네임스페이스가 없다면 다음 단계로 넘어갈 수 있습니다.
  2. Rails 개발을 Packwerk 패키지로 준비합니다. 이것은 일회성 단계로 언제든지 개선할 수 있습니다.

    • Packwerk의 디렉토리 구조를 사용하도록 Rails 자동로더를 구성합니다. 이는 이 PoC에서 보여졌습니다.
    • 머지 요청시 CI에서 Danger-Packwerk를 실행할 것입니다.
    • 레프훅에서 Packer 체크를 pre-commit 또는 pre-push로 실행할 수 있습니다.
  3. 파일을 Packwerk 패키지로 이동합니다.

    • Packwerk 패키지를 생성하고 파일을 반복적으로 패키지로 이동해야 합니다.
    • 상수는 Packwerk 패키지 내의 app/ 또는 lib/에 있더라도 올바르게 자동로드됩니다.
    • 도메인 코드가 패키지 디렉토리와 Rails 디렉토리 구조 사이에 분할될 것이므로 여기서 빠르게 진행해야 합니다.
  4. 패키지가 의존성을 명시적으로 선언하도록 강제화합니다. 또한 다른 패키지의 공개 인터페이스에만 의존하도록 합니다.

    • 왜? 지금까지 모든 상수는 개인 상태였으므로 우리는 개인정보를 강제하지 않았습니다. Packwerk 개인정보 침해에 산란을 집중함으로써 패키지 내에서 네임스페이스를 래핑할 수 있습니다. 이후 개인정보를 강제화함으로써 상수와 도메인 간의 결합에 대한 이해를 얻게 됩니다.
    • 이를 통해 다른 패키지에서 사용되는 상수를 공개해야 하는지, 캡슐화의 이점을 취해 개인 상태로 유지해야 하는지를 알 수 있습니다. 우리는 Packwerk의 기록된 침해 (Rubocop TODO와 유사)를 사용하여 코드를 시간이 지남에 따라 재구성할 것입니다.
    • 종합 설계에 어디에 맞는지 확인하기 위해 의존성 그래프를 업데이트할 수 있습니다.
  5. Packwerk의 기록된 침해를 사용하여 리팩터링할 수 있습니다. 이것은 도메인의 DRIs가 시간이 지남에 따라 키워야 하는 장기적인 단계입니다. Packwerk 실패 및 의존성 다이어그램을 사용하여 모듈식 설계에 영향을 미칠 것입니다.

    • 클래스를 공개 대신 비공개로 변경하고 더 나은 인터페이스를 생성하는지 확인합니다.
    • 상수를 다른 패키지로 이동시킵니다.

Rails 애플리케이션을 위한 Packwerk를 구성한 후 (위의 단계 2), 신흥 도메인은 단계적으로 Packwerk 패키지로 직접 구현할 수 있으며, 즉시 격리 및 명확한 인터페이스를 얻을 수 있습니다.