반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 네트워크보안
- 프로그래밍
- 디자인패턴
- springboot
- 데이터분석
- 자료구조
- 파이썬
- 데이터구조
- 컴퓨터과학
- 빅데이터
- I'm Sorry
- 인공지능
- 프로그래밍언어
- 사이버보안
- 소프트웨어공학
- 웹개발
- 데이터베이스
- 소프트웨어
- 머신러닝
- 자바스크립트
- 데이터과학
- 컴퓨터비전
- 보안
- Yes
- 클라우드컴퓨팅
- 딥러닝
- 컴퓨터공학
- 알고리즘
- 네트워크
- 버전관리
Archives
- Today
- Total
스택큐힙리스트
State 패턴: if-else 없이 굴러가는 ‘상태 머신’의 힘 본문
반응형
왜 필요한가?
업무 로직이 복잡해질수록 if (status == CREATED) … else if (status == SHIPPED)… 같은 분기문이 폭발한다. 새 상태가 추가될 때마다 코드가 누더기가 되는 건 시간문제다. State 패턴은 객체의 상태를 클래스로 쪼개고, 상태별 동작(행위)을 그 클래스 안에 숨겨 버린다. 그러면 Context(주 객체)는 “지금 내가 어떤 상태인가?”만 알고 있으면 된다. 조건문 대신 상태 객체 교체만으로 행동이 바뀌니, 가독성과 유지보수성이 크게 올라간다.
핵심 개념 한 줄 요약
“상태를 클래스로 캡슐화해, 객체의 행동을 런타임에 교체한다.”
Context ↔ State 인터페이스 ↔ ConcreteState 들이 만드는 삼각 구도가 전부다.
Kotlin 예제 — 주문 상태 흐름
// 1) 상태 인터페이스
interface OrderState {
fun next(order: Order)
fun cancel(order: Order)
}
// 2) 구체 상태
object Created : OrderState {
override fun next(order: Order) { order.state = Shipped }
override fun cancel(order: Order) { order.state = Cancelled }
}
object Shipped : OrderState {
override fun next(order: Order) { order.state = Delivered }
override fun cancel(order: Order) = println("이미 배송 중이라 취소 불가")
}
object Delivered : OrderState {
override fun next(order: Order) = println("이미 배송 완료")
override fun cancel(order: Order) = println("반품 절차 필요")
}
object Cancelled : OrderState {
override fun next(order: Order) = println("취소된 주문")
override fun cancel(order: Order) = println("이미 취소됨")
}
// 3) 컨텍스트
class Order(var state: OrderState = Created) {
fun next() = state.next(this)
fun cancel() = state.cancel(this)
}
// 사용 예
val order = Order()
order.next() // Created → Shipped
order.cancel() // 배송 중이라 취소 불가
객체를 갈아끼우는 것만으로 상태 전이가 끝난다. State 클래스들이 단일 책임을 지키기 때문에 새 단계(예: Returned)를 추가해도 기존 코드는 손대지 않는다.
언제 쓸까요?
- 주문·결제·배송처럼 상태 전이가 명확한 도메인
- 게임 캐릭터(대기→공격→피격) 같은 상태머신 구현
- 네트워크 커넥션(연결 시도→연결됨→종료) 관리
- 리팩터링: 거대한 switch 문을 객체지향적으로 분리할 때
실전 팁
- enum + State 혼합
상태 개수를 enum으로 관리하면서, enum에 전략 메서드를 붙여 가볍게 구현할 수도 있다. - Spring StateMachine
복잡한 전이 조건과 Guard 로직이 많다면, OSS 라이브러리로 도표 기반 정의를 추천한다. - 디버깅
전이 로그를 남기면 QA 단계에서 “어디서 막혔는지” 한눈에 보인다.
반응형
'개발' 카테고리의 다른 글
자바 스프링 개발 시작하기 - 15일차 실전 프로젝트 완주 (0) | 2025.07.23 |
---|---|
Template Method 패턴: “뼈대는 내가 잡을게, 살은 네가 붙여” (0) | 2025.07.23 |
Spring Boot 실시간 채팅 서버 만들기 — WebSocket + STOMP, 하트비트까지 완전 정복 (1) | 2025.07.23 |
SSE vs WebSocket, 언제 써야 빛을 볼까? (4) | 2025.07.22 |
Redis Streams vs Pub/Sub: 저장형 알림 설계, 무엇을 써야 할까? (3) | 2025.07.22 |
Comments