클린 코드에서 클린 아키텍처로

관심사의 분리

애플리케이션 내부에는 여러 컴포넌트가 있다. 컴포넌트는 모듈, 패키지의 하위 컴포넌트로 나뉘며 이는 클래스와 함수로, 클래스는 다시 메서드로 나눌 수 있다. 이 컴포넌트는 가능한 작게 유지되어야 하며 특히 함수는 한 가지 작업만을 수행해야 하며 작게 유지되어야 한다.

애플리케이션의 컴포넌트는 높은 응집력과 낮은 결합력을 가져야 한다. 새로운 요구사항이 생기면 단 하나의 장소에서만 수정해야 하고 나머지 코드는 영향을 받지 않아야 한다.

추상화

코드는 그 자체로 문서화가 되는 정도의 표현력을 가져야 하며, 문제의 본질에 대한 해결책을 제시하는 올바른 추상화를 해야 한다. 아키텍처도 마찬가지로 시스템이 어떻게 되는지 설명할 수 있어야 한다. 여기서는 프레임워크, 사용라이브러리, 디스크 저장 방법등의 세부사항이 중요하지는 않다.

소프트웨어 컴토넌트

패키지

파이썬 패키지는 소프트웨어를 배포하고 일반적인 방식으로 코드를 재사용하기 위한 편리한 방법이다.

일반적인 라이브러리의 기본 구조는 다음과 같다

├──── Makefile
├──── README.rst
├──── setup.py
├──── src
│   ├──── apptool
│   ├──── __init__.py
│   └──── common.py
│   └────parse.py
└──── tests
    ├──── integration
    └──── unit

setup.py 파일에는 프로젝트의 모든 중요한 정의(요구사항, 의존성, 이름, 설명)가 지정되어 있다.

src 내부의 apptool 디렉토리는 작업중인 라이브러리의 이름이다. 일반적으로 파이썬 프로젝트에서 필요한 모든 것을 이곳에 배치한다.

setup.py 파일의 예는 다음과 같다.

from setuptools import find_packages, setup
 
with open("README.rst", "r") as longdesc:
    long_description = longdesc.read()
 
setup(
    name="apptool",
    description="패키지 설명",
    long_description=long_description,
    author="저자 이름",
    version="0.1.0",
    packages=find_packages(where="src/"),
    package_dir={"": "src"},
)

파이썬 프로젝트의 핵심은 다음과 같다.

플랫폼에 독립적이며 로컬 설치에 의존하지 않는지 테스트, 검증해야 한다. 단위 테스트를 패키지에 같이 배포하지 않는다. 의존성 분리 가장 많이 요구되는 명령에 대해서는 진입점을 만드는 것이 좋다.

컨테이너

도커 컨테이너는 애플리케이션을 독립적인 컴포넌트로 관리한다. 컨테이너를 만드는 이유는 작고 명확한 서비스를 나타내는 작은 컴포넌트를 만들기 위함이다.

컨테이너는 애플리케이션의 다양한 서비스를 만드는 수단이다. 이들은 아키텍처에 대한 관심사의 분리를 도와준다. 이러한 컨테이너는 유지보수가 가능한 형태로 디자인되어야 한다. 책임을 명확하게 구분하여 해당 서비스의 변경으로 인해 애플리케이션의 다른 부분의 영향을 미치지 않도록 해야 한다.