오늘은 State Machine에 대해서 알아보도록 하겠습니다
본 글에서는 간단하게 상태머신 이라고 하도록 하겠습니다
상태 머신(State Machine) 이란?
상태 머신은 컴퓨터 과학에서 시스템의 동작을 모델링 하는 데 사용되는 개념으로 시스템이 가질 수 있는 상태(State)들의 집합과 그 상태들 간의 전이(Transition)를 정의합니다
상태 머신은 시스템이 특정 시점에 어떤 상태에 있으며 이벤트나 조건에 따른 다른 상태로 전환할 수 있다는 것을 설명합니다
대략 아래와 그림과 같이 각 상태들 정의하고 해당 상태들 간의 전의들을 정의하는 게 상태 머신입니다
상태 : 시스템이 특정 시점에 가질 수 있는 조건이나 상황을 의미합니다
예를 들어 교통 신호등은 빨간색, 노란색, 초록생에 상태를 나타내며 각 상태는 차량이 멈춰야 하는지, 이동할 준비를 해야 하는지, 이동할 수 있는지에 대해 결정합니다
상태 머신을 사용하는 이유
상태 머신(State Machine)의 구조를 살펴보면, 처음에는 절차 지향적인 프로그래밍에서 볼 수 있는 if-else 문이나 switch-case 문을 통해 이벤트를 처리하는 방식과 크게 다르지 않아 보일 수 있습니다. 그럼에도 불구하고 상태 머신을 사용하는 주된 이유는 바로 '안정성'에 있습니다.
if-else 문이나 switch-case 문을 사용하는 경우, 설계 자체에 결함이 없더라도 변수의 변경이나 잘못된 플로우로 인해 소프트웨어 버그가 발생할 위험이 있습니다. 이러한 버그는 유지보수를 어렵게 만드는 주된 원인 중 하나입니다.
특히 멀티프로세싱이나 멀티 프로세스 환경에서는 변수의 오염 문제가 더욱 심각해지며, 이는 if-else 문이나 switch-case 문의 사용에서 더 많은 버그를 유발할 수 있습니다.
상태 머신의 사용은 이러한 문제들을 방지할 수 있는 효과적인 방법입니다. 상태 머신을 사용하면 상태가 사전에 정의되어 있기 때문에 소프트웨어에서 결함이 발생할 가능성이 낮아집니다. 물론, 상태를 정확히 정의하지 않는 경우에는 여전히 결함이 발생할 수 있지만, 이러한 문제는 소프트웨어 구조의 문제보다는 누락된 상태를 추가함으로써 빠르게 해결할 수 있습니다.
상태 머신 기본요소
상태머신에는 아래와 같은 기본 요소들이 존재합니다
- 상태(States) : 시스템이 존재할 수 있는 모든 조건이나 상황, 각 상태는 시스템의 특정 조건을 나타낸다
- 전이(Transitions): 한 상태에서 다른 상태로의 변화를 나타낸다. 이는 특정 이벤트나 조건이 충족될 때 발생한다.
- 이벤트(Events): 상태 전이를 유발하는 외부 또는 내부의 발생, 예를 들어 사용자 입력, 시간 경과, 하드웨어 신호 등이 있다
- 액션(Actions): 상태 전이와 함께 실행되는 활동이나 직업, 상태를 변경하거나 외부 시스템에 신호를 보내는 데 사용된다
상태 머신에 대한 예시
상태 머신에 대해 더욱더 이해하기 위해 실생활에 있는 음료 자판기를 상태머신으로 구성해 보도록 하겠습니다
먼저 처음에는 음료 자판기에 상태들을 정의해 보도록 하겠습니다
음료 자판기에 기능을 생각하며 아래와 같이 상태들을 정의하였습니다
- 대기 상태(Waiting) : 사용자의 입력을 기다리는 상태, 돈을 투입하거나 버튼을 누르는 등의 입력을 기다립니다
- 돈의 투입 상태(Money Inserted) : 사용자가 돈을 투입했을 때의 상태, 자판기는 사용자로부터 충분한 금액이 투입될 때까지 더 돈을 기다리거나, 선택 가능한 음료의 버튼 입력을 기다립니다
- 금액 부족 상태(Insufficient Funds) : 선택한 음료의 가격이 투입된 금액보다 많은 때의 상태이다. 이 상태에서 자판기는 추가 금액의 투입을 요구하거나 다른 선택을 유도
- 음료 선택 상태(Drink Selected) : 사용자가 음료를 선택한 상태, 자판기는 선택한 음료를 제공하고 잔돈이 있다면 반환합니다
- 음료 제공 및 잔돈 반환 상태(Drink Dipensed and Change Retunred) : 음료와 잔돈이 사용자에게 제공된 상태, 이후 자판기는 다시 대기 상태로 돌아갑니다
이후 각각 상태에서 다른 상태로 전이되는 경우를 정의해 보도록 하겠습니다
- 대기 상태 → 돈의 투입 상태 : 사용자가 돈을 투입하면 자판기는 돈의 투입 상태로 전환
- 돈의 투입 상태 → 금액 부족 상태 : 선택 가능한 음료를 선택했으나 투입된 금액이 부족한 경우 자판기는 금액 부족 상태로 전환
- 금액 부족 상태 → 돈의 투입 상태 : 사용자가 추가 금액을 투입하면 자판기는 다시 돈의 투입 상태로 전환, 충분한 금액 이 투입되면 음료 선택으로 넘어갈 수 있다
- 돈의 투입 상태 → 음료 선택 상태 : 사용자가 충분한 금액을 투입하고 음료를 선택하면 자판기는 음료 선택 상태로 전환
- 음료 선택 상태 → 음료 제공 및 잔돈 반환 상태 : 선택한 음료와 필요한 경우 잔돈을 사용자에게 제공하고 자판기는 음료 제공 및 잔돈 반환 상태로 전환
- 음료 제공 및 잔돈 반환 상태 → 대기 상태 : 음료와 잔돈이 사용자에게 제공된 후, 자판기는 다시 대기 상태로 돌아간다
그러면 이제 전이를 발생시키는 이벤트를 정의해야 합니다
- 돈 투입 이벤트(Money Inserted Event) : 사용자가 자판기에 돈을 투입하는 행위, 이 이벤트는 시스템을 대기 상태에서 돈의 투입 상태로 전환
- 음료 선택 이벤트(Drink Selected Event) : 사용자가 특정 음료는 선택하는 행위 이 이벤트는 돈의 투입 상태에서 충분한 금액이 투입되었을 때 음료 선택 상태로의 전환을 유발
- 추가 금액 투입 이벤트(Additional Money Inserted Event) : 사용자가 금액 부족 상태에서 추가로 돈을 투입하는 행위, 이 이벤트는 금액 부족 상태에서 다시 돈의 투입 상태로 돌아가거나 직접 음료 상태로 전환되게 할 수 있다
- 제품 배출 완료 이벤트(Product Dispensed Event) : 선택된 음료가 사용자에게 제공된 후의 상태, 이 이벤트는 음료 선택 상태에서 음료 제공 및 잔돈 반환상태로 전환을 유발
- 잔돈 반환 완료 이벤트(Change Returned Event) : 필요한 경우 잔돈 반환 후 이 이벤트는 음료 제공 및 잔돈 반환 상태에서 다시 대기 상태로 전환을 유발
- 취소 이벤트(Cancel Event) : 사용자가 선택 과정을 취소하고 싶을 때 발생하는 이벤트, 이는 어는 상태에서든 발생할 수 있으며 자판기 초기 대시 상태로 되돌릴 수 있다
마지막으로 정의한 상태, 전이, 이벤트를 기반으로 다이어 그램을 작성하면 아래와 같은 결과가 나옵니다
다이어그램은 xstate와 연동이 가능한 Stately로 작성하였습니다
Stately
stately.ai
마치며
이번에 상태 머신에 개념과 실제로 상태머신에 다이어그램을 그리는 것을 배웠습니다 처음 해보는 거라 많이 어려웠지만 안정화된 서비스를 만들기 위한 과정이기 때문에 재밌게 배운 거 같습니다 다음에는 실제 자바스크립트(React)에 상태 머신을 적용해 보도록 하겠습니다
'기타' 카테고리의 다른 글
JWT + HttpOnly 쿠키 기반 인증 플로우 정리 (0) | 2025.02.01 |
---|---|
AWS EC2와 WebServer(nginx)에 이해 (0) | 2024.05.26 |
일렉트론 이대로 괜찮은가?(w.Tauri) (1) | 2024.02.25 |
PlantUML 을 이용하여 시퀀스 다이어그램 그려보기 (0) | 2023.09.24 |