메인 컴포넌트란
메인 컴포넌트는 main() 함수가 존재하는 객체이며, 시스템의 초기 진입점이다.
모든 시스템에는 최소한 하나의 메인 컴포넌트가 존재해야 하며, 클린 아키텍처 관점에서 보면 가장 바깥 원에 위치한 모듈이다.
= 운영체제를 제외하면, 어떤 것도 메인에 의존하지 않는다.
메인 컴포넌트의 책임
메인 컴포넌트는 다음과 같은 일들을 수행해야 한다:
- 초기 조건 구성 (예: 환경 변수, 설정 값)
- 외부 자원 수집
- 의존성 주입에 필요한 컴포넌트 초기화 및 생성
- 고수준 정책(UseCase, 인터랙터 등)에 제어권 위임
의존성 주입과 프레임워크 최소화
의존성 주입 프레임워크는 메인 컴포넌트에서 초기 의존성들을 설정하고 주입하는 데에만 사용되어야 한다.
이후에 다른 컴포넌트에서는 프레임워크에 의존하지 않고, 일반적인 방법으로 객체를 전달해야 한다.
✅ 핵심 요지
- 의존성 주입 프레임워크는 메인에서만 쓰고, 안쪽 계층은 일반 코드로 유지한다.
- 이는 프레임워크 종속성을 줄이고, 테스트하기 쉬운 구조를 만든다.
메인 컴포넌트 안의 데이터와 의존성 캡슐화
메인 컴포넌트는 외부 설정, 문자열 상수, 환경 데이터 등을 내부에서 정의하고,
나머지 시스템에서는 이를 직접 알지 못하게 감춘다.
이는 데이터 종속성을 낮추고, 내부 계층의 유연성과 테스트 가능성을 높인다.
예를 들어, 다음과 같이 메인에서 정의한 설정 정보를 의존성으로 주입할 수 있다:
// MainComponent.ts
export class MainComponent {
static bootstrap() {
const ENVIRONMENT = {
apiEndpoint: "https://api.example.com",
logLevel: "debug",
};
const app = new Application({
config: ENVIRONMENT
});
app.start();
}
}
// Application.ts
export class Application {
constructor(private deps: { config: { apiEndpoint: string; logLevel: string } }) {}
start() {
console.log(`Connecting to ${this.deps.config.apiEndpoint}`);
}
}
이 구조를 사용하면, 내부 계층은 문자열이나 구체적인 환경 정보를 직접 몰라도 되고, 외부에서 전달된 추상적인 구성 객체만 다루면 된다.
객체 생성 패턴의 활용
메인 컴포넌트는 구체 클래스를 직접 생성하는 대신,
객체 생성 디자인 패턴을 활용해 객체 생성을 외부에 위임할 수 있다.
[ Ex) 팩토리 패턴, DI 컨테이너 등 ]
이는 결합도를 줄이고, 변경 가능성을 높이는 데에 유리하다.
예시:
// config.json
{
"UserService": "services/InMemoryUserService"
}
// main.ts
const config = require('./config.json');
const UserServiceClass = require(`./${config.UserService}`).default;
const userService = new UserServiceClass();
이 방식은 다음과 같은 장점이 있다:
- 구체 클래스가 변경되더라도 메인 컴포넌트를 재컴파일할 필요가 없다
- 런타임 시 구현체를 교체할 수 있어 유연성이 높다
→ 결합도는 낮추고, 확장 가능성은 높이는 전략이다.
메인을 플러그인이라고 생각하자
메인을 플러그인처럼 취급하면, 설정별로 메인 컴포넌트를 나눌 수 있다.
예를 들어:
- 개발용 메인
- 테스트용 메인
- 국가별/고객별 배포를 위한 메인
이처럼 다양한 설정에 따라 메인 컴포넌트를 분리하면, 아키텍처 경계 바깥에 있는 설정 문제를 훨씬 유연하게 해결할 수 있다.
※ 본 글은 『Clean Architecture』(로버트 C. 마틴 저) 5부 26장을 기반으로 학습 목적으로 요약한 글입니다.
※ 이 글은 책의 내용을 요약한 것으로, 원문 없이 읽을 경우 오해의 여지가 있을 수 있습니다. 정확한 이해를 위해 원서의 정독을 권장합니다.
'아키텍처' 카테고리의 다른 글
Clean Architecture 정리 - 5부 28장 테스트 경계 (0) | 2025.07.28 |
---|---|
Clean Architecture 정리 - 5부 27장 크고 작은 모든 서비스들 (2) | 2025.07.28 |
Clean Architecture 정리 - 5부 25장 계층과 경계 (5) | 2025.07.26 |
Clean Architecture 정리 - 5부 24장 부분적 경계 (3) | 2025.07.25 |
Clean Architecture 정리 - 5부 23장 프레젠터와 험블객체 (1) | 2025.07.25 |