16. 명령 패턴(Command Pattern)

16.1 개요

프로그래밍을 하다 보면 명령을 내리는 개체와 명령을 수행하는 개체를 나누는 작업은 매 번 있는 작업입니다. 그런데, 실제 요청한 작업을 수행하는 개체에서 수행에 필요한 알고리즘을 모두 포함시켰을 경우에 비슷한 형태의 여러 메서드를 구현하여야 하는 경우가 발생합니다. 경우에 따라서는 명령을 내리는 시점과 실제 명령을 수행하는 시점이 다르고 다양한 설정에 따라 구체적인 수행 알고리즘이 다른 경우도 발생합니다. 이와 같은 경우에 명령을 내리는 곳에서 일부 알고리즘을 정의하여 명령을 수행하는 개체의 메서드를 호출할 때 입력 인자로 전달하는 것이 더 효과적인 경우가 발생합니다. 이와 같은 경우에 명령 패턴은 효과적으로 사용할 수 있습니다.

명령 패턴은 명령을 요청하는 곳에서 수행할 알고리즘을 입력 인자로 정의하고 명령을 수행하는 곳에서는 입력 인자로 전달받은 알고리즘을 이용합니다. 이를 위해 명령을 수행하는 형식의 특정 메서드에는 수행에 필요한 알고리즘의 추상적 정의를 합니다. 명령을 요청하는 곳에서는 재 정의를 통해 구체화된 알고리즘을 구현하고 이를 입력 인자로 전달하여 명령을 내리게 됩니다. 이를 통해 명령을 수행하는 형식 개체에서는 전달받은 알고리즘 개체를 이용하여 명령을 수행할 수 있게 됩니다.

이와 같은 명령 패턴을 사용하게 되면 대부분의 알고리즘은 동일하지만 일부 알고리즘은 런 타임 시에 결정을 해야 할 경우에 개발 비용을 줄일 수 있습니다. 이 외에도 추상적인 행위에 대한 약속과 구체적인 행위에 대한 구현을 분리시킴으로 인해 명령을 수행하는 개체 형식을 정의를 함에 있어 세부적인 알고리즘을 정의하지 않아도 되기 때문에 업무 분담에 효율을 높일 수가 있습니다.

일반적으로 메뉴나 여러 작업을 트랜잭션 형태로 수행을 해야 하는 경우와 다양한 콜백을 구현을 하는 경우등에서 사용이 되고 있습니다.

“명령 패턴은 추상적인 행위에 대한 약속과 구체적인 행위에 대한 구현을 분리합니다.”

16. 2 시나리오

EH Camera 회사의 개발 팀과 몇 번의 작업을 같이 진행하면서 객원 감수자로 활동을 하게 되었어요. 객원 감수라고 직함은 주어졌지만 매 주 금요일 저녁에 이 매핑 씨와 저녁을 먹으면서 이런 저런 얘기를 나누는 것이 나에게 요구한 전부예요.

직함이라는 것은 용하게도 사람에게 주어진 이름만큼의 책임감을 느끼게 하는 것 같아요. 책임감 때문인지 모르겠지만 그 동안 개발한 S/W 모듈들의 구조들을 살펴보면서 사진 관리자 모듈이 무겁다는 것을 알게 되었죠. 개발 팀에게 이에 대한 상세 기술 문서를 요청을 하여 살펴보니 사진에 대한 정보를 보여주는 부분과 사진을 삭제하는 부분 등에서 다양한 방법에 해당하는 각종 메서드들이 즐비하게 나열되어 있더군요. 오늘 이 매핑씨와 저녁 식사를 할 때 이에 대해 얘기를 해야겠어요.

“사진에 특정 행위를 수행할 수 있다는 추상적인 약속과 이에 대한 구체적인 구현을 분리를 하면 사진 관리자 모듈이 가벼워지고 개발 분담이 쉬워질 것 같아요.”