· inner-circle

예측 가능하고 제어하기 쉬운 소프트웨어에 대해 알아보자 (feat. 지속 성장 가능한 소프트웨어를 만들어가는 방법)

팀 프로젝트를 리팩터링하기 전에 '지속 성장 가능한 소프트웨어' 방법론을 클린 아키텍처·헥사고날과 견주고, 레이어 참조 규칙과 모듈 분리 기준을 우리 프로젝트 구조로 옮겨 그려본 글.

작성날짜: 24.09.24

상황

먼저 여기서 설명하는 바를 요약해보자

해당 방법론은 휘발성 프로젝트(서비스)에서는 불필요!

  • 비즈니스 로직:
    • 상세 구현 로직보다는 비즈니스의 흐름을 이해할 수 있는 코드를 작성해야 함
    • 각 클래스가 명확한 역할을 갖도록 설계
    • 상세 구현은 implement layer 내 개발 진행
  • 소프트웨어 레이어:
    • Presentation, Business, Implement, Data Access 등의 레이어로 구성
    • 레이어 간 참조 규칙을 설정하여 코드의 구조와 의존성을 관리
  • 모듈화:
    • 기능과 책임에 따라 모듈을 분리하여 구성
    • 모듈 간 의존성을 최소화하고, 구현 기술의 변경이 다른 모듈에 영향을 미치지 않도록 설계
    • Gradle의 implementation 키워드를 활용하여 의존성 전파를 제한
  • 소프트웨어 통제와 제어:
    • 비즈니스 로직의 가시화, 레이어 구조화, 적절한 모듈화를 통해 소프트웨어를 통제
    • 변화에 유연하게 대응할 수 있는 구조를 만들어 지속적인 성장과 유지보수가 가능한 소프트웨어 개발

그렇다면 다른 관점에서 다시 살펴보자

  • 소프트웨어 개발론 측면:
    • 지속 가능한 소프트웨어 개발에 대한 전반적인 철학과 방법론을 다룸.
    • 비즈니스 로직의 명확성, 모듈화, 레이어 구조 등 소프트웨어 개발의 여러 측면을 포괄적 다룸.
  • 클린 아키텍처 측면:
    • 의존성 규칙, 레이어 구조, 모듈 간 분리 등 클린 아키텍처의 핵심 개념들을 포함
    • 특히 비즈니스 로직을 중심에 두고, 외부 의존성(프레임워크, 데이터베이스 등)을 분리하는 접근 방식은 클린 아키텍처의 주요 원칙과 일치
  • 실용적 접근:
    • 저자는 이론적 개념을 실제 개발 상황에 적용하는 방법을 구체적인 예시와 함께 설명
    • Gradle의 의존성 관리 기능 등 실제 개발 도구를 활용하는 방법도 포함

여기서 말하고자 하는 바는?

통제, 제어 = 참조, 의존성 격리

image

이제부터 좀 더 알아보자! (클린 아키텍처 관점)

image
  • 여기까지 보면 일반적인 클린 아키텍처와 크게 다를바가 없다

더 자세히 들어가보자

구현부를 비즈니스 레이어단에서 조합 개발한다!

image

해당 저자가 소개한 프로젝트 전체를 살펴보자

image

서비스 비즈니스 핵심 모듈 CORE-API

image

다른 방법론(멀티 모듈)을 구성한 프로젝트를 비교해보자

저자 @team-dodn리더님 @heli-os해외 개발자 @FrancescoJo
imageimageimage
  • 모두 메인 코어 (비즈니스)를 중점을 해서 부가적인 부분은 따로 구성을 한걸 볼 수가 있다.
  • 좀 더 분리를 할꺼냐 아니면 하나의 공통으로 가져가는 지는 개발(팀)의 소프트웨어 유지보수 스타일에 따라 달라질꺼라고 생각

다른 방법론(멀티 모듈)을 구성한 레이어를 비교해보자

저자 가 제안한 레이어 방법

image

대표적 방법론 - 핵사고날(CQRS)

image
  • 어디를 중점으로 소프트웨어 (개발)을 관리할 껀지에 따라 달라질꺼라 생각
  • 비즈니스 핵심인 가운데 쿼리 vs 동작(행위)
    • 쿼리: 데이터베이스 기준
    • 동작(행위): 사용자 기준

각 레이어는 최종적으로 어떻게 사용될까 (컨트롤러단)

어디서 구현체를 조합하느냐에 따라 달라진다

최종 단계 (저자)
image
최종 단계 (핵사고날)
image

저자가 제안한 방법론기반으로 다시 설계해보자!

이너서클 1기 5&6조 커머스 프로젝트 바로가기

모듈

현재개선안(예상)저자가 제안한 모듈 구조
imageimageimage
  • 기존 common 모듈의 역할을 분리
    • 저자 가 제안한 모듈별 역할과 동일하게 가져감

레이어

현재개선안(예상)
imageimage
  • implemnet layer 계층을 추가함으로써 business layer에는 도메인(유비쿼터스) 언어로만 구성
레이어의 개선안을 좀 더 자세히 보자
image

최종 아키텍처는???

image
  • 현재는 위처럼 일부 모듈의 의존성이 다른 레이어 층을 바로 의존하고 있다!
image
  • 그렇지만, 최종 개선안(예상) 에는 레이어별 의존관계도 정리된 모습

회고

  • 소프트웨어 개발은 단순히 기술 적용뿐 아니라 유지보수, 확장성을 위한 아키텍처 중요
  • 결국에는 비즈니스를 위한 서비스이므로 모든 관계자들이 알 수 있는 비즈니스(도메인) 언어 로 작성된 코드 중요
  • 백엔드뿐 아니라 프론트 영역에서도 위와 같이 사용하는 것이 필요
    • 비록 앞단의 개발이지만 전역, 지역, 서버 데이터별 역할 관리가 있기 때문