UML 다이어그램의 기본 요소들인 클래스, 유스케이스, 관계 등은 그 자체로도 강력한 표현 도구이지만, 때로는 설계자가 가진 더 구체적이고 특별한 의도를 담기에는 부족할 때가 있습니다. 바로 이때 등장하는 것이 ‘스테레오타입(Stereotype)’입니다. 스테레오타입은 UML의 기본 요소를 그대로 사용하되, 그 위에 길러멧(Guillemet, 겹화살괄호 << >>
)으로 감싼 특정 키워드를 붙여 새로운 의미나 역할을 부여하는 UML의 공식적인 확장 메커니즘입니다.
이 글에서는 정보처리기사 시험과 실무에서 가장 빈번하게 마주치는 핵심 스테레오타입들을 깊이 있게 탐구할 것입니다. 유스케이스 다이어그램의 논리적 관계를 명확히 하는 <<include>>
와 <<extend>>
, 클래스의 역할을 정의하는 <<interface>>
, 그리고 시스템의 구조를 체계적으로 분석하는 EBC(Entity-Boundary-Control) 패턴의 세 주역인 <<entity>>
, <<boundary>>
, <<control>>
까지. 각 스테레오타입이 어떤 맥락에서 왜 사용되는지를 이해함으로써, 여러분은 평면적인 다이어그램 너머에 있는 설계자의 깊은 의도를 읽어내고, 자신의 설계를 한 차원 더 명확하게 표현하는 능력을 갖추게 될 것입니다.
유스케이스의 의미를 확장하다: <
<
<<include>>
스테레오타입은 하나의 유스케이스가 다른 유스케이스의 기능을 반드시 포함하여 실행해야 할 때 사용하는 관계입니다. 이 관계는 여러 유스케이스에서 공통적으로 사용되는 기능을 별도의 유스케이스로 추출하여 중복을 제거하고 모델을 간결하게 만들기 위해 사용됩니다. 다이어그램에서는 기능을 포함하는 주 유스케이스에서 포함되는 하위 유스케이스 쪽으로 <<include>>
라는 이름표가 붙은 점선 화살표를 그어 표현합니다.
예를 들어, ‘게시글 작성하기’와 ‘댓글 달기’라는 두 개의 유스케이스가 있다고 가정해 봅시다. 이 두 기능은 모두 사용자가 ‘로그인’ 상태여야만 수행할 수 있습니다. 이때, ‘로그인하기’라는 별도의 유스케이스를 만들고, ‘게시글 작성하기’와 ‘댓글 달기’가 모두 이 ‘로그인하기’를 <<include>>
하도록 모델링할 수 있습니다. 이는 ‘게시글 작성하기’를 실행하면 시스템이 ‘반드시’ 로그인 기능을 먼저 수행한다는 의미를 내포하며, “A를 하려면 B가 필수다”라는 명확한 의존성을 나타냅니다.
<
<<extend>>
스테레오타입은 기본 유스케이스의 흐름에 특정 조건이 만족될 때만 선택적으로 실행되는 부가적인 기능을 추가할 때 사용하는 관계입니다. <<include>>
와 달리, 확장되는 기능은 필수가 아니며, 이 기능이 없어도 기본 유스케이스는 그 자체로 완전한 의미를 가집니다. 다이어그램에서는 확장 기능을 제공하는 유스케이스에서 기본 유스케이스 쪽으로 <<extend>>
이름표가 붙은 점선 화살표를 그어 표현합니다.
‘상품 결제하기’라는 기본 유스케이스를 예로 들어 봅시다. 대부분의 사용자는 기본 결제 흐름을 따르겠지만, 일부 사용자는 ‘쿠폰 사용하기’나 ‘포인트 사용하기’와 같은 추가적인 행동을 할 수 있습니다. 이때 ‘쿠폰 사용하기’는 ‘상품 결제하기’의 흐름을 ‘확장(extend)’하는 선택적 기능이 됩니다. 기본 유스케이스는 확장 기능의 존재를 전혀 알지 못하며, 특정 조건(예: 사용자가 쿠폰 적용 버튼을 클릭)이 만족되었을 때만 확장 유스케이스가 끼어들어 자신의 역할을 수행합니다. 이처럼 <<extend>>
는 “A를 하는 중에 B를 할 수도 있다”는 유연하고 선택적인 관계를 표현합니다.
클래스의 역할을 정의하다: EBC와 인터페이스
<
<<interface>>
스테레오타입은 특정 클래스가 순수한 인터페이스임을 명시적으로 나타낼 때 사용됩니다. 인터페이스는 실제 구현 코드를 가지지 않고, 어떤 기능을 수행해야 하는지에 대한 메서드의 목록만을 정의한 ‘설계 규약’ 또는 ‘접점’입니다. 클래스 다이어그램에서 클래스 이름 위에 <<interface>>
를 표기함으로써, 이 요소가 객체를 생성할 수 있는 일반 클래스가 아니라, 다른 클래스에 의해 구현되어야 할 추상적인 약속임을 명확히 합니다.
예를 들어, 데이터베이스의 종류(Oracle, MySQL 등)에 상관없이 데이터를 저장하고 조회하는 기능을 만들고 싶다고 가정해 봅시다. 이때 IDataAccess
라는 이름의 <<interface>>
를 정의하고 그 안에 save(data)
, find(id)
와 같은 메서드를 선언할 수 있습니다. 그 후 OracleDataAccess
클래스와 MySQLDataAccess
클래스가 각각 이 IDataAccess
인터페이스를 구현(실체화)하도록 만들면, 시스템의 다른 부분들은 실제 데이터베이스가 무엇인지 신경 쓸 필요 없이 IDataAccess
라는 약속에만 의존하여 코드를 작성할 수 있게 됩니다. 이는 시스템의 결합도를 낮추고 유연성을 극대화하는 핵심적인 설계 기법입니다.
<
<<entity>>
스테레오타입은 시스템이 관리해야 할 핵심적인 정보와 그 정보에 대한 행위를 담고 있는 클래스를 식별하기 위해 사용됩니다. 엔티티 객체는 일반적으로 데이터베이스에 저장되는 등, 시스템이 운영되는 동안 영속적으로(persistently) 상태를 유지해야 하는 데이터를 모델링합니다. MVC(Model-View-Controller) 패턴의 모델(Model)에 해당하며, 시스템의 정보 구조를 나타내는 가장 중요한 요소입니다.
쇼핑몰 시스템을 예로 들면, ‘회원(User)’, ‘상품(Product)’, ‘주문(Order)’과 같이 시스템의 핵심이 되는 데이터들이 바로 <<entity>>
클래스로 모델링될 수 있습니다. 이 클래스들은 이름, 가격, 재고 수량과 같은 속성들과 함께, 자신의 상태를 변경하는 간단한 비즈니스 로직을 포함할 수 있습니다. 분석 단계에서 이러한 엔티티 클래스들을 식별하는 것은 시스템의 데이터베이스 스키마를 설계하는 데 결정적인 기초 자료가 됩니다.
<
<<boundary>>
스테레오타입은 시스템과 외부 액터(사용자 또는 다른 시스템) 사이의 상호작용을 담당하는 클래스를 나타냅니다. 즉, 시스템의 경계에 위치하여 외부 세계와의 소통 창구 역할을 하는 모든 요소를 의미합니다. 이는 사용자가 직접 보는 화면(UI)일 수도 있고, 외부 시스템과 연동하기 위한 API의 접점일 수도 있습니다. MVC 패턴에서는 뷰(View)의 역할과 일부 유사한 점이 있습니다.
사용자가 보는 ‘로그인 화면(LoginForm)’, ‘상품 목록 페이지(ProductListPage)’, ‘주문서 양식(OrderForm)’ 등은 모두 <<boundary>>
클래스의 좋은 예시입니다. 또한, 결제 처리를 위해 외부 결제 시스템과 통신하는 PaymentGatewayProxy
와 같은 클래스도 외부 시스템과의 경계 역할을 하므로 <<boundary>>
로 볼 수 있습니다. 바운더리 클래스는 외부의 요청을 시스템 내부로 전달하고, 내부의 처리 결과를 외부 액터가 이해할 수 있는 형태로 변환하여 보여주는 역할을 전담합니다.
<
<<control>>
스테레오타입은 특정 유스케이스의 비즈니스 로직과 제어 흐름을 책임지는 클래스를 나타냅니다. 컨트롤 클래스는 <<boundary>>
클래스로부터 사용자 요청을 받아, 어떤 <<entity>>
객체를 사용해서 어떤 순서로 작업을 처리해야 할지를 결정하고 지시하는 ‘지휘자’와 같은 역할을 수행합니다. MVC 패턴의 컨트롤러(Controller)와 가장 직접적으로 대응되는 개념입니다.
예를 들어, ‘주문하기’라는 유스케이스가 있다면, 이를 처리하기 위한 OrderController
라는 <<control>>
클래스가 존재할 수 있습니다. 이 컨트롤러는 OrderForm
(<<boundary>>
)으로부터 주문 정보를 전달받아, Product
(<<entity>>
)의 재고를 확인하고, User
(<<entity>>
)의 포인트를 차감한 뒤, 새로운 Order
(<<entity>>
) 객체를 생성하는 일련의 과정을 총괄합니다. 이처럼 컨트롤 클래스는 시스템의 핵심적인 로직을 담고 있으며, 하나의 유스케이스가 하나의 컨트롤 클래스와 대응되는 경우가 많습니다.
분석과 설계를 잇는 EBC 패턴
EBC 패턴의 작동 원리
앞서 살펴본 <<entity>>
, <<boundary>>
, <<control>>
세 가지 스테레오타입은 함께 사용될 때 강력한 시너지를 발휘하며, 이를 EBC(Entity-Boundary-Control) 분석 패턴이라고 부릅니다. 이 패턴은 유스케이스의 요구사항을 분석하여 실제 설계 모델인 클래스들로 체계적으로 전환하는 다리 역할을 합니다. 하나의 유스케이스 시나리오는 일반적으로 하나의 EBC 삼총사의 협력으로 실현됩니다.
‘로그인’ 유스케이스를 EBC 패턴으로 분석해 봅시다. 먼저, 액터(사용자)는 <<boundary>>
클래스인 ‘로그인 화면’과 상호작용하여 아이디와 비밀번호를 입력합니다. ‘로그인 화면’은 이 정보를 <<control>>
클래스인 ‘로그인 처리기’에게 전달합니다. ‘로그인 처리기’는 전달받은 정보를 가지고 <<entity>>
클래스인 ‘회원’ 객체에게 해당 정보가 유효한지 검증을 요청합니다. ‘회원’ 객체는 데이터베이스의 정보와 비교하여 결과를 ‘로그인 처리기’에게 반환하고, ‘로그인 처리기’는 이 결과에 따라 성공 또는 실패 메시지를 ‘로그인 화면’을 통해 사용자에게 다시 보여주도록 지시합니다. 이처럼 각 클래스가 자신의 역할에만 충실하게 만들고, 이들의 협력 관계를 통해 전체 기능을 완성하는 것이 EBC 패턴의 핵심 원리입니다.
EBC 패턴의 장점과 의의
EBC 패턴을 사용하면 시스템 설계를 훨씬 더 구조적이고 체계적으로 만들 수 있습니다. 가장 큰 장점은 ‘관심사의 분리(Separation of Concerns)’를 자연스럽게 유도한다는 것입니다. 화면 로직(Boundary), 비즈니스 로직(Control), 데이터 로직(Entity)이 각각의 클래스로 명확하게 분리되기 때문에 코드의 응집도는 높아지고 결합도는 낮아집니다. 이는 시스템의 특정 부분을 수정할 때 다른 부분에 미치는 영향을 최소화하여 유지보수성을 크게 향상시킵니다.
또한, 이 패턴은 분석과 설계 사이의 간극을 줄여줍니다. 유스케이스 분석을 통해 도출된 요구사항을 EBC라는 세 가지 역할로 나누어 구체적인 클래스 후보들을 쉽게 식별할 수 있습니다. 이는 복잡한 시스템을 처음 설계하는 개발자에게 명확한 가이드라인을 제공하며, 팀원들 간에 시스템 구조에 대한 공통된 이해를 형성하는 데에도 큰 도움이 됩니다. 결국, EBC 스테레오타입의 활용은 단순히 그림에 이름표를 붙이는 행위를 넘어, 더 견고하고 유연한 소프트웨어를 만들기 위한 설계 철학의 반영이라고 할 수 있습니다.
마무리하며: 모델에 명확성을 더하는 이름표
지금까지 우리는 UML의 기본 요소에 특별한 의미를 불어넣는 스테레오타입의 세계를 탐험했습니다. 유스케이스의 관계를 명확히 하는 <<include>>
와 <<extend>>
부터, 클래스의 역할을 세분화하여 시스템의 구조를 체계적으로 만드는 EBC 패턴의 <<entity>>
, <<boundary>>
, <<control>>
까지. 이 작은 이름표들은 설계자의 의도를 명확하게 전달하고, 다이어그램을 읽는 모든 이가 동일한 맥락에서 모델을 이해하도록 돕는 강력한 소통 도구입니다.
정보처리기사 시험을 준비하는 과정에서는 각 스테레오타입의 개념과 사용되는 다이어그램을 정확히 연결하는 것이 중요합니다. 하지만 더 나아가, 이들이 왜 필요한지, 그리고 이들을 통해 어떻게 더 나은 설계를 할 수 있는지를 고민하는 과정에서 여러분의 설계 역량은 한 단계 더 성장할 것입니다. 스테레오타입은 UML이라는 언어를 더욱 풍부하고 정교하게 만들어주는 양념과 같습니다. 이 양념을 적재적소에 잘 활용하여 여러분의 시스템 설계에 깊은 맛과 명확함을 더하시길 바랍니다.