Featured image of post 26. 메인 컴포넌트

26. 메인 컴포넌트

5부 - 아키텍처

모든 시스템에는 최소한 하나의 컴포넌트가 존재하여 나머지 컴포넌트를 생성, 조정, 관리하는데 이러한 컴포넌트를 메인 컴포넌트라 한다.

궁극적인 세부사항

메인 컴포넌트는 궁극적인 세부사항으로, 가장 낮은 수준의 정책이다.

  • 시스템의 초기 진입점이다.
  • 운영체제를 제외하면 어떤 것도 메인에 의존하지 않는다.

메인은 모든 팩토리(Factory)와 전략(Strategy), 시스템 전반을 담당하는 나머지 기발 설비를 생성한 후, 시스템에서 더 높은 수준을 담당하는 부분으로 제어권을 넘긴다.


의존성 주입 프레임워크를 이용해 의존성을 주입하는 일은 메인 컴포넌트에서 이뤄져야 한다.

메인에 의존성이 주입되고 나면, 의존성 주입 프레임워크를 사용하지 않고도 일반적인 방식으로 의존성을 분배할 수 있어야한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public static void main(String[] args) throws IOException {
    game=HtwFactory.makeGame("htw.game.HuntTheWumpusFacade", new Main());

    createMap();
    BufferdReader br=new BufferedReader(new InputStreamReader(System.in));

    game.makeRestCommand().excute();

    while(true){
        System.out.println(game.getPlayerCavern());
        System.out.println("Health: " + hitPoints + " arrows: " + game.getQuiver());

        HuntTheWumpus.Command c = game.makeRestCommand();

        System.out.println(">");

        String command = br.readLine();

        if(command.equalsIgnoreCase("e"))
            c = game.makeMoveCommand(EAST);
        else if(command.equalsIgnoreCase("w"))
            c = game.makeMoveCommand(WEST);
        else if(command.equalsIgnoreCase("n"))
            c = game.makeMoveCommand(NORTH);
        else if(command.equalsIgnoreCase("s"))
            c = game.makeMoveCommand(SOUTH);
        else if(command.equalsIgnoreCase("r"))
            c = game.makeMoveCommand();
        else if(command.equalsIgnoreCase("sw"))
            c = game.makeMoveCommand(WEST);
        else if(command.equalsIgnoreCase("se"))
            c = game.makeMoveCommand(EAST);
        else if(command.equalsIgnoreCase("sn"))
            c = game.makeMoveCommand(EAST);
        else if(command.equalsIgnoreCase("ss"))
            c = game.makeMoveCommand(SOUTH);
        else if(command.equalsIgnoreCase("q"))
            return;

        c.excute();
    }
}

HtwFactory를 사용하여 게임을 생성할 때, htw.game.HuntTheWumpusFacade라는 클래스 이름을 문자열로 전달하는데, 이는 이 클래스가 변경이 매우 많은 지저분한 클래스이므로, 문자열을 통해 참조하도록 하여 직접 참조하지 않게 하여 변경이 생겨도 메인을 재컴파일/재배포하지 않게 만들기 위함이다.

입력 스티름 생성 부분, 게임의 메인 루프 처리, 간단한 입력 명령어 해석 등은 모두 main()에서 처리하지만, 명령어를 실제로 처리하는 일은 다른 고수준 컴포넌트로 위임한다.


메인은 클린 아키텍처에서 가장 바깥 원에 위치하는, 지저분한 저수준 모듈이다.

메인은 고수준의 시스템을 위한 모든 것을 로드한 후, 제어권을 고수준의 시스템에게 넘긴다.

결론

메인을 초기 조건과 성정을 구성하고, 외부 자원을 모두 수집한 후 제어권을 애플리케이션의 고수준 정책으로 넘기는 플러그인이다.

메인은 플러그인이므로 메인 컴포넌트를 애플리케이션의 설정별로 하나씩 두로록 하여 둘 이상의 메인 컴포넌트를 만들 수도 있다.

  • 개발용 메인 플러그인
  • 테스트용 메인 플러그인
  • 국가별 플러그인
  • 관할 영역 별 플러그인
  • 고객별 플러그인 등

메인을 플러그인 컴포넌트로 여기고 아키텍처 경계 바깥에 위치한다고 보면 설정 관련 문제를 훨씬 쉽게 해결할 수 있다.