2026.05.21피자가게로 이해하는 디자인 패턴pizza-design-patterns-series#object-oriented#design-patterns에이든 피자는 처음부터 복잡한 시스템을 만들 생각이 없었다. 처음에는 메뉴 몇 개만 만들면 됐다. 그런데 손님은 커스텀 주문을 넣기 시작했고, 주방은 상태를 나눠야 했고, 결제와 배달앱과 알림이 하나씩 붙었다. 코드도 가게를 닮는다. 장사가 잘될수록 이상하게 더 쉽게 망가진다. 디자인…
2026.05.2124. Integration — 피자가게가 열렸습니다pizza-design-patterns-series#object-oriented#design-patterns드디어 에이든 피자가 문을 연다. 1편에서는 메뉴가 조금만 늘어도 if-else가 길어지는 작은 문제에서 출발했고, 23편에서는 no-cheese, extra-sauce, well-done 같은 요청 문자열을 피자 객체에 반영하는 데까지 왔다. 그런데 여기서 마지막 함정이 하나 남는다.…
2026.05.2123. Interpreter — no-cheese, extra-sauce, well-done을 피자 객체로 바꾼다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영 마지막 날이다. 가게는 이제 완벽한 시스템을 갖춘 듯 보였지만, 배달 앱 연동을 시작하자마자 예상치 못한 복병을 만났다. 바로 '특수 요청 사항'이다. 손님들은 메모란에 저마다의 언어로 요구사항을 남긴다. "no-cheese, extra-sauce, well-d…
2026.05.2122. Visitor — 피자 클래스는 건드리지 않고 새 연산을 추가한다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영이 거의 끝나갈 무렵, 주방과 사무실에서 불만이 터져 나왔다. 원인은 비대해질 대로 비대해진 Pizza와 Order 클래스였다. 처음에는 피자 클래스에 getPrice() 하나만 있으면 충분했다. 그런데 곧 영양 정보를 위해 getCalories()가 추가됐고,…
2026.05.2121. Memento — 아 치즈 빼주세요, 아니다 다시 넣어주세요pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영이 막바지로 향하고 있다. 플라이웨이트 패턴 덕분에 메모리 걱정은 덜었지만, 이번에는 홀 직원이 한숨을 내쉬며 나를 찾아왔다. 손님들의 변덕이 극에 달했기 때문이다. "페퍼로니 피자에 올리브 추가해주세요." "아, 잠시만요. 역시 치즈를 더 넣고 올리브는 빼주세요…
2026.05.2120. Flyweight — 치즈는 치즈다, 수만 번 써도 같은 객체pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 인기가 하늘을 찌르고 있다. 시범 운영 20일차, 이제 하루 주문량이 10만 건을 넘나들기 시작했다. 장사가 잘되는 건 기쁜 일이지만, 서버 모니터링 화면을 보던 내 얼굴은 점점 어두워졌다. 메모리 사용량이 예사롭지 않았기 때문이다. 문제의 원인은 의외로 '토핑'에 있었다…
2026.05.2119. Bridge — 카드·현금·포인트 × 홀·포장·배달 = 조합 폭발pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 서비스가 다양해지면서, 행복하지만 머리 아픈 고민이 시작됐다. 결제 수단이 '카드'와 '현금'에서 '포인트'까지 늘어났고, 주문 방식도 '홀'과 '포장'에 이어 '배달'이 추가됐다. 처음에는 단순하게 클래스를 만들었다. 카드로 결제하는 배달 주문은 CardDeliveryO…
2026.05.2118. Facade — 직원은 버튼 하나만 누르면 된다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시스템은 나날이 발전하고 있다. 재고 관리 시스템, 결제 프록시, 주방 대기열, 알림 서비스, 매출 분석 시스템까지. 각 분야의 전문가(클래스)들이 자기 자리를 잡았다. 그런데 기쁜 마음으로 신입 직원을 채용한 첫날, 예상치 못한 장벽에 부딪혔다. 주문 한 건을 처리하기…
2026.05.2117. Proxy — 결제는 진짜 호출 전에 확인할 게 있다pizza-design-patterns-series#object-oriented#design-patterns어댑터 덕분에 배달 앱들의 다양한 주문 데이터는 깔끔하게 정리되었다. 하지만 진짜 문제는 그 다음에 터졌다. 바로 '돈'이다. 배달 주문이 들어오면 우리는 PG(Payment Gateway)사 API를 호출해 결제를 진행해야 한다. 처음에는 아주 단순하게 생각했다. 결제 함수를 하나 만…
2026.05.2116. Adapter — 배민, 쿠팡이츠, 요기요 모두 API 형식이 다르다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자가 입소문을 타면서, 드디어 배달 앱들과 연동할 기회가 찾아왔다. 배달의민족, 쿠팡이츠, 요기요... 이름만 들어도 든든한 파트너들이지만, 막상 API 문서를 열어본 순간 나는 깊은 한숨을 내쉴 수밖에 없었다. 세상에 만만한 일은 없다더니, 세 앱이 보내주는 주문 데이터 형식…
2026.05.2115. Iterator — 대기열 내부가 배열이든 큐든 상관없이 순서대로 처리한다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 주문량이 늘어나면서, 우리는 주문을 쌓아두고 하나씩 꺼내 처리하는 '주문 대기열(Order Queue)'을 만들었다. 처음에는 아주 단순하게 배열을 사용했다. 주문이 들어오면 push()로 넣고, 처리할 때는 for 문으로 인덱스를 돌리며 하나씩 꺼내면 그만이었다. 하지만…
2026.05.2114. Mediator — 모두가 POS를 통해서만 대화한다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 매장이 북적이기 시작하면서, 직원들 사이의 소통이 심상치 않게 꼬이기 시작했다. 처음에는 캐셔 한 명과 요리사 한 명뿐이라 서로 눈빛만 봐도 통했다. 하지만 배달 기사님이 합류하고, 홀 진열 화면을 담당하는 시스템까지 들어오면서 상황이 달라졌다. 이제 한 명의 행동이 다른…
2026.05.2113. Strategy — 배달 방식은 바뀔 수 있다, 런타임에도pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 주방에서 피자가 나오는 속도가 제법 안정화되었다. 이제 문제는 주방 밖, 즉 '손님에게 피자를 전달하는 과정'에서 터져 나왔다. 처음에는 홀에서 드시는 손님만 계셨기에 서빙만 잘하면 그만이었지만, 소문을 듣고 찾아오는 분들이 늘면서 상황이 복잡해졌다. 포장 손님이 생겼고,…
2026.05.2112. State — 조리 중인 주문을 취소하려 하면 어떻게 되나pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영 12일차. 이제 주문은 검증의 사슬을 통과해 주방으로 무사히 입성한다. 하지만 주방 안에서의 삶은 생각보다 다채롭다. 주문은 '접수됨'에서 시작해 '조리 중'을 거쳐 '완성'이 되고, 배달 주문이라면 '배달 중'과 '배달 완료'라는 산을 넘어야 한다. 문제는 손…
2026.05.2111. Chain of Responsibility — 주문이 통과해야 하는 관문들pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 인기가 날로 치솟고 있다. 주방 조리법도 잡혔고 알림 시스템도 완벽하다. 하지만 인기가 많아진 만큼 사고도 늘었다. 재고가 없는데 주문이 들어오기도 하고, 결제가 안 됐는데 피자가 구워지기도 한다. 주방은 한계인데 주문은 계속 밀려들어 와서 주방장이 뒷목을 잡는 일도 생겼…
2026.05.2110. Observer — 주문 완료됐다고 다섯 군데에 직접 전화할 수 없다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 주방 자동화가 꽤 진척되었다. 템플릿 메서드 덕분에 요리사들은 레시피만 있으면 척척 피자를 만들어낸다. 하지만 피자가 오븐에서 나오는 순간, 다른 종류의 일이 몰려왔다. 피자가 완성되었다는 사실을 필요한 곳에 알려야 했기 때문이다. 처음에는 간단했다. 요리사가 주방 화면을…
2026.05.219. Template Method — 어떤 피자든 만드는 순서는 같다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 주방은 오늘도 분주하다. 주문 시스템이 정교해질수록 주방으로 쏟아지는 주문서도 늘어났다. 그런데 며칠 동안 요리사들의 움직임을 가만히 지켜보다 보니 묘한 기시감이 들었다. 마르게리타 요리사든, 페퍼로니 요리사든, 아니면 새로 온 BBQ 치킨 요리사든 하는 짓이 다들 비슷했…
2026.05.218. Composite — 단품이든 세트든 똑같이 계산하고 싶다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영도 이제 중반에 접어들었다. Decorator 패턴 덕분에 토핑 추가 시스템은 자리를 잡았고, 손님들은 자기만의 괴상한 피자 조합을 만드는 재미에 푹 빠졌다. 하지만 평화도 잠시, 이번에는 메뉴판의 '구성'이 말썽을 부리기 시작했다. 처음에는 피자 단품만 팔았다.…
2026.05.217. Decorator — 토핑 추가할 때마다 클래스를 새로 만들 수 없다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자에서 주문서를 객체로 만들자 취소와 재주문은 한결 편해졌다. 그런데 주문이 편해지자 손님들도 한결 편해졌다. 편해진 손님은 더 많은 요구를 한다. "치즈 추가요", "올리브도 추가요", "소스 많이요", "조금 더 바삭하게 구워주세요" 같은 요청이 주문대 위로 쌓이기 시작했다…
2026.05.216. Command — 주문서를 객체로 만들면 취소도 재주문도 쉬워진다pizza-design-patterns-series#object-oriented#design-patterns에이든 피자의 시범 운영이 어느덧 일주일을 향해 가고 있다. 주방은 이제 제법 능숙하게 피자를 구워내고, 포스기(POS) 시스템도 팩토리 메서드 덕분에 다양한 지점 메뉴를 무리 없이 받아낸다. 하지만 시스템이 안정될수록 요구사항은 더 정교해지기 마련이다. 오늘은 주문 그 자체가 문제가…