464. 서비스 가상화 (Service Virtualization) - MSA 환경에서 외부 의존 API를 모사하는 스텁 서버
핵심 인사이트 (3줄 요약)
- 본질: 서비스 가상화(Service Virtualization)는 코드 단위의 쪼잔한 가짜 객체(Mock/Stub)를 넘어, 인프라 레벨에서 아직 완성되지 않았거나 연결할 수 없는 외부 팀의 API 서버(결제, 인증 등)를 네트워크상에 거대하게 흉내 내어 띄워놓는 '스텁 서버(가짜 서버)' 구축 기술이다.
- 가치: 마이크로서비스(MSA) 시대의 최대 재앙인 "옆 팀 API 서버가 죽어서(혹은 아직 안 짜서) 우리 팀 개발/테스트도 올스톱 되었습니다"라는 병목(Bottleneck)과 종속성을 완전히 분쇄하고, 각 팀이 무한대의 속도로 독립 병렬 개발을 달릴 수 있게 해주는 구원자다.
- 융합: 앞서 배운 테스트 더블(Stub)의 철학을 클라우드 네트워크 아키텍처로 확장한 것이며, WireMock 같은 가상화 툴과 **계약 주도 테스트(Contract Testing, Spring Cloud Contract)**가 융합되어 전사적인 API 연동(Integration) 장애를 제로화하는 데브옵스의 핵심 동력이 되었다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 내 시스템(Order)이 상대방 시스템(Pay)의
http://pay.com/chargeAPI를 호출해야 한다. 그런데 상대방 시스템이 아직 개발 중이거나 너무 무거워서 내 로컬(Local) 환경에 띄울 수가 없다. 이때 내 노트북이나 사내 망에 가짜 서버(WireMock)를 띄워놓고 주소를http://localhost/charge로 바꾼다. 이 가짜 서버는 내가 찌르면 완벽한 JSON 응답{"status":"OK"}를 0.1초 만에 툭 뱉어낸다. -
필요성: 1개의 모놀리식 덩어리를 50개의 마이크로서비스(MSA)로 쪼갰다. 혁신일 줄 알았는데 지옥이 열렸다. A가 B를 부르고 B가 C를 부르는데, 막내 C팀 개발자가 휴가를 가서 C 서버를 안 띄워놨다. A와 B팀 전체 100명의 개발자가 통합 테스트를 돌리지 못하고 하루 종일 손가락을 빤다. 카카오페이 연동 개발을 하는데 진짜 카카오 서버를 하루에 1만 번 찌르면 카카오가 디도스(DDoS) 공격인 줄 알고 우리 회사 IP를 블록(Block) 시킨다. 외부 인프라 연동의 종속성과 비용 문제를 부수지 않으면 MSA 환경에서는 단 하루도 개발을 진행할 수 없다.
-
💡 비유: 서비스 가상화는 콜센터 신입사원의 **'시뮬레이션 진상 손님 훈련'**과 같습니다. 신입사원(내 서버)이 응대 연습을 해야 하는데 진짜 고객(외부 API 서버)에게 전화를 돌려 욕을 먹게 할 순 없습니다. 그래서 옆자리의 베테랑 교관이 고객인 척 전화를 걸고, 진상 고객의 대본(JSON 응답)을 그대로 읊어줍니다. 신입사원 입장에서는 수화기 너머의 사람이 진짜인지 가짜(가상화 서버)인지 전혀 구분하지 못하고 100% 완벽한 실전 훈련(테스트)을 할 수 있습니다.
-
등장 배경 및 발전 과정:
- 모놀리식의 Mocking: 과거엔 1개의 거대한 코드 덩어리 안에서 함수(Method)만 찌르면 됐으므로, 단순히 코드에
Mockito로 가짜 로봇(Mock)을 꽂아 넣는 것으로 충분했다. - SOA와 MSA의 분할: 시스템이 물리적인 네트워크 API(HTTP, REST) 통신으로 갈라지며, 코드 레벨의 Mock으로는 네트워크 지연, 500 에러, 헤더(Header) 검증 같은 인프라 통합(Integration) 환경을 테스트할 수 없게 되었다.
- 가상화 서버의 대두 (현재): 코드를 넘어 아예 "HTTP 응답을 대신 뱉어주는 독자적인 가짜 포트(8080) 서버"를 도커(Docker)로 띄우는
WireMock,Mountebank솔루션이 MSA 생태계의 표준 무기가 되었다.
- 모놀리식의 Mocking: 과거엔 1개의 거대한 코드 덩어리 안에서 함수(Method)만 찌르면 됐으므로, 단순히 코드에
-
📢 섹션 요약 비유: 코드 레벨의
Mock/Stub이 장난감 권총에 들어가는 **'가짜 총알(공포탄)'**이라면, 서비스 가상화는 군대가 야외에 거대하게 지어놓은 **'가상 현실(VR) 시가지 전투 세트장'**입니다. 진짜 건물이 무너지지 않고 진짜 사람이 죽지 않지만, 통신망(네트워크)과 포탄 소리는 100% 실제 전장과 똑같이 구현해 놓은 인프라 레벨의 거대한 속임수입니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
1. 서비스 가상화 아키텍처 흐름 (WireMock 예시)
단순히 흉내 내는 것을 넘어 극단적인 네트워크 재난 상황까지 가상화한다.
[ 1. 내 서버 (Order Service) ]
"카카오페이 결제 5만 원 해주세요!"
│ (HTTP POST /pay)
▼
[ 2. 서비스 가상화 서버 (WireMock) - 포트 8080에 홀로 떠있음 ]
┌─────────────────────────────────────────────────────┐
│ [대본(Mapping 룰) 1] : POST /pay 가 들어오면 │
│ ➡ {"status": 200, "msg": "결제 성공"} 을 줘라. │
│ [대본(Mapping 룰) 2] : 5번 연속 찌르면 │
│ ➡ 네트워크 5초 지연(Delay) 후 500 에러를 뱉어라! │
└─────────────────────────────────────────────────────┘
│ (JSON Response)
▼
[ 3. 내 서버 ]
"오! 결제 성공했네! (혹은 500 에러 예외 처리 동작)"
- 핵심 원리 (Mock Server): 카카오페이(진짜)와 통신하는 코드를 건드리지 않는다. 그냥 설정 파일(application.yml)에서
kakao.url = http://localhost:8080(가상 서버 주소)로 한 줄만 딱 바꿔치기한다. 가상 서버는 내가 JSON 파일로 미리 짜둔 대본(Mapping)을 읽고, 들어온 요청(URL, Header)이 대본과 일치하면 미리 녹음된 JSON을 기계처럼 쏴준다.
2. 가상화 서버의 진정한 무기: 폴트 인젝션 (Fault Injection)
가상화 서버는 정상 응답(200 OK)만 뱉는 바보가 아니다. 카카오 서버가 진짜로 터졌을 때 내 주문 서버가 어떻게 반응하는지 확인하기 위해 **'악의적인 네트워크 재앙'**을 강제로 연출한다.
-
응답 지연 (Delay): 5초 동안 답을 안 주고 뻗댄다. 내 서버의 타임아웃(Timeout) 설정이 3초에서 잘 끊어내는지 테스트한다.
-
쓰레기 바디 (Garbage Body):
{ "amount": "오만원" }처럼 숫자 자리에 한글을 내려준다. 내 서버의 파서(Parser)가 500 에러를 내지 않고 400에러로 우아하게 뱉어내는지(Robustness) 확인한다. -
연결 끊기 (Connection Reset): 패킷을 반만 주고 갑자기 소켓을 확 끊어버린다(TCP RST). 내 서버의 서킷 브레이커(Circuit Breaker)가 터지는지 확인한다.
-
📢 섹션 요약 비유: 이 과정은 비행기 조종사들의 **'난기류 시뮬레이터 장치'**와 똑같습니다. 평온하게 날아가는 맑은 날씨(정상 JSON 응답)만 띄워주는 게 아니라, 갑자기 엔진에 불이 나고(500 에러), 계기판이 꺼지는(네트워크 끊김) 최악의 재난 상황을 교관이 밖에서 버튼 하나로 시뮬레이터 안에 주입(Fault Injection)하여 파일럿의 극한 대처 능력을 길러주는 위대한 세트장입니다.
Ⅲ. 융합 비교 및 다각도 분석
1. 코드 레벨의 Mock(Mockito) vs 인프라 레벨의 서비스 가상화(WireMock)
둘 다 가짜지만 '스케일(Scale)'과 '위치'가 차원이 다르다.
| 척도 | 코드 레벨 Mock (Mockito 등) | 인프라 레벨 서비스 가상화 (WireMock 등) |
|---|---|---|
| 위치 (Where) | 내 Java/Python 소스 코드 내부 (메모리) | 소스 코드 밖, 별도의 포트에 뜬 HTTP 가짜 서버 |
| 테스트 범위 | 클래스(Class) 간의 단위 테스트 (Unit Test) | 서버와 서버 간의 통합 연동 테스트 (Integration Test) |
| 속임수의 한계 | "HTTP 통신" 자체를 건너뛰고 자바 객체끼리만 대답함. (네트워크 환경의 헤더, 타임아웃 검증 불가) | 진짜 외부 통신처럼 HTTP 프로토콜(패킷)을 그대로 주고받음. (네트워크 환경 완벽 모방) |
| 언어 종속성 | 자바는 Mockito, 파이썬은 PyTest 등 언어에 종속됨. | JSON 대본만 짜면 되므로 언어에 완벽히 독립적(Agnostic). |
과목 융합 관점
-
마이크로서비스 (MSA) / 데브옵스: 50개의 팀이 50개의 서버를 만들 때 1번의 딜레마가 생긴다. "남의 API가 없으면 나는 테스트를 못해!" 이 병목을 분쇄하기 위해, A팀이 API 기획을 짜자마자 (코딩을 시작하기도 전에) B팀에게
A_Team_WireMock_대본.json파일 하나를 먼저 툭 던져준다(API-First Design). B팀은 그 가짜 JSON 스텁 서버를 자기 로컬에 띄워놓고 즉시 프론트엔드/백엔드 개발을 병렬(Parallel)로 미친 듯이 달린다. 서비스 가상화는 MSA 조직의 물리적 사일로(Silo)를 연결하는 애자일(Agile) 속도의 대동맥이다. -
데이터베이스 (외부 결제 연동): 결제 API를 쏠 때, 진짜 PG사(KG이니시스) 테스트 베드를 치면 밤 12시에는 PG사 점검 때문에 우리 팀 테스트도 다 터진다. 서비스 가상화 툴에 결제사 명세서를 본뜬 가짜 서버를 사내망에 하나 띄워두면, 인터넷 망이 폭발해도 사내에서 24시간 365일 멱등성(Idempotency)이 보장되는 CI 파이프라인 결제 테스트를 수만 번 광속으로 돌릴 수 있다.
-
📢 섹션 요약 비유: 코드 레벨의 Mock이 축구선수가 방에서 거울을 보며 섀도 복싱(개인기 연습)을 하는 거라면, 서비스 가상화는 운동장에 진짜 상대 팀의 전술(대본)을 입력해 놓은 '가상의 로봇 축구 선수들 11명'을 세워두고 진짜 패스(HTTP 통신)를 뻥뻥 차며 풀코트 실전 연습을 뛰는 웅장한 스케일입니다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — 계약(Contract)이 박살 난 허상 속의 가상화 서버: 프론트엔드 팀이 백엔드 팀의 완성되지 않은
getUser()API를 기다리다 못해, 스스로 가짜 서버(WireMock)를 띄워{"name": "Kim", "age": 20}이라는 응답 대본을 짜고 개발을 끝냈다. 한 달 뒤 진짜 백엔드 서버가 완성되어 라이브 서버를 붙였다. 화면이 펑펑 터졌다. 백엔드 팀은 API 스펙을 중간에{"fullName": "Kim", "years": 20}으로 몰래 바꿨는데 프론트엔드의 가짜 서버는 옛날 대본(거짓말)을 가지고 테스트를 계속 패스(Pass) 시켜버린 것이다.- 아키텍트의 해결책: 가짜 대본(Stub)과 진짜 스펙(Real) 간의 동기화 붕괴 대참사다. 프론트엔드(소비자)가 마음대로 가짜 서버 대본을 짜면 안 된다. 아키텍트는 계약 주도 테스트(Contract Testing, Spring Cloud Contract / Pact) 아키텍처를 도입해야 한다. 두 팀이 합의한
계약서(Contract.groovy)하나를 Git 중앙에 올린다. 백엔드 팀이 코드를 고치다 이 계약서를 어기면 빌드가 터진다. 이 중앙 계약서가 통과되면, 기계(CI)가 자동으로 최신 가짜 서버(Stub)를 1초 만에 빚어내어 프론트엔드 팀에게 쏴준다. 인간의 거짓말(낡은 대본)이 끼어들 틈을 기계적 파이프라인으로 완벽히 차단한 위대한 융합 아키텍처다.
- 아키텍트의 해결책: 가짜 대본(Stub)과 진짜 스펙(Real) 간의 동기화 붕괴 대참사다. 프론트엔드(소비자)가 마음대로 가짜 서버 대본을 짜면 안 된다. 아키텍트는 계약 주도 테스트(Contract Testing, Spring Cloud Contract / Pact) 아키텍처를 도입해야 한다. 두 팀이 합의한
-
시나리오 — 무지성 E2E(End-to-End) 테스트가 부른 10시간짜리 늪: QA 팀장이 "우리는 완벽을 추구한다! 모든 테스트는 50개의 마이크로서비스 진짜 서버를 전부 다 Docker로 띄우고 진짜 통신을 거치는 E2E 통합 테스트만 돌린다!"라고 지시했다. 결과는? 젠킨스 빌드 한 번 돌릴 때마다 서버 50대 부팅하는 데 1시간, 중간에 네트워크 핑이 한 번 튀어서 에러(Flaky) 나면 재시작하느라 총 10시간이 걸렸다. 하루에 빌드를 1번밖에 못 해 애자일(Agile)이 죽어버렸다.
- 아키텍트의 해결책: 진정한 격리(Isolation)의 부재다. MSA 환경에서 진짜 서버를 다 띄우고 얽혀서 테스트하는 건 자살행위다. 아키텍트는 "내 팀의 핵심 비즈니스 로직을 테스트할 때는, 나를 뺀 나머지 49개의 타 팀 서버는 싹 다 도커로 띄운 **가상화 스텁 서버(WireMock)**로 대체하라"고 명령해야 한다. 49개의 진짜 서버 부팅 지연과 네트워크 억울한 실패(Timeout)를 가짜 서버로 싹 도려내 버리면, 10시간 걸리던 통합 테스트가 1분 컷의 '통제된 무균실(Isolated Integration Test)' 환경으로 광속 변신한다.
도입 체크리스트
- 조직적: 타 팀(Provider)이 우리 팀(Consumer)을 위해 가상 서버 템플릿을 퍼블리싱(Publishing) 해주는 문화가 있는가? 완벽한 MSA 조직은, 결제팀이 API를 만들 때 "야, 너네 우리 결제 서버 붙일 때 이거 써!"라며 자신들의 API를 완벽하게 모사한 가상화 서버 도커 이미지(
pay-stub:v1.0)를 사내 저장소에 같이 올려주는 매너(Manner)가 정착되어 있다. 이것이 없으면 각 팀이 남의 서버를 흉내 내느라 수천 줄의 JSON 껍데기를 짜는 노가다를 반복하게 된다. - 기술적: 서드파티(Third-party) 통신 구간을 식별했는가? 외부의 카카오, 네이버, 국세청 연동 API는 우리 통제 밖이다. 특히 국세청 API는 주말에 툭하면 서버 점검으로 뻗는다. 이 외부로 뻗어나가는 Gateway 구간은 1순위로 가상화(Virtualization) 서버를 하나 앞에 대두어, 주말이든 새벽이든 국세청이 죽어있어도 우리 내부 파이프라인은 100% 모의 데이터로 싱싱하게 돌아가도록 댐을 쳐야 한다.
안티패턴
-
스마트 스텁 (Smart Stub)의 진화병: WireMock에 단순히
{"status":"OK"}JSON을 뱉는 깡통 대본을 넘어, "만약 아이디가 1이면 김씨를 주고, 2면 박씨를 줘" 라며 가상화 서버 안에 자바스크립트나 템플릿(Handlebars)으로 **엄청나게 무겁고 정교한 비즈니스 로직(DB 흉내)**을 떡칠해 버리는 중2병 패턴. 가짜 서버는 무식한 자판기여야 한다. 가짜 서버에 로직이 들어가면 그 로직에 버그가 나서 테스트가 실패하는 주객전도(Frankenstein Server) 현상이 벌어지고, 가짜 서버를 유지보수하느라 팀원 한 명의 인건비가 갈려 나간다. -
📢 섹션 요약 비유: 가짜 서버 안에 복잡한 로직(스마트 스텁)을 짜 넣는 것은, 놀이공원 귀신의 집(테스트 세트장)에 있는 마네킹 귀신 안에 **'진짜 인공지능 로봇 뇌'**를 심어버리는 멍청한 짓입니다. 튀어나오며 "왁!" 소리만 지르면(단순 JSON 반환) 완벽한 세트장인데, 수천만 원을 들여 진짜 생각하는 뇌를 심어봤자 세트장 운영비만 거덜 나고 로봇이 고장 나서 귀신의 집 장사를 통째로 망치게 됩니다.
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 진짜 타 팀 서버/외부 API에 연동하여 통합 테스트 (AS-IS) | 서비스 가상화(WireMock) 서버로 외부 종속성 끊어냄 (TO-BE) | 개선 효과 |
|---|---|---|---|
| 정량 | 옆 팀 API 서버 개발 전까지 우리 팀 프론트엔드 작업 스톱 | 대본 JSON 공유 후 즉시 양 팀 독립적 병렬 개발 시작 | MSA 팀 간 종속성에 의한 개발 대기 시간(블로킹) 0일 |
| 정량 | 결제망 야간 점검 시 젠킨스 야간 빌드 100% Fail 터짐 | 가상화 서버 응답으로 외부 요인 차단 및 365일 통과 | 외부 환경 통신 오염(Flaky)에 의한 빌드 실패율 제로화 |
| 정성 | 외부 에러 테스트를 위해 카카오 연동 담당자에게 사정사정함 | 내가 가상 서버 설정 하나로 타임아웃, 500 에러를 맘대로 쏨 | 통제 불가능한 엣지 케이스(재난 상황)에 대한 100% 통제력 확보 |
미래 전망
- 쿠버네티스(K8s)와 투명한 서비스 메시 가상화 (Istio): 과거엔 가상 서버를 띄우고 애플리케이션의 URL(application.yml)을 가짜 주소(
localhost:8080)로 바꿔치기하는 수고가 필요했다. 이제는 소스코드를 단 1글자도 바꾸지 않는다. 서비스 메시(Istio) 인프라가 런타임에 "어? 타겟 서버가 죽어있네?"를 감지하면, 앞단의 사이드카(Sidecar) 프록시가 네트워크 패킷을 몰래 낚아채어 자기가 직접 가상화된 JSON 스텁을 즉시 입에 넣어주는 궁극의 '무설정 투명 가상화' 시대로 넘어가고 있다. - 계약 주도 테스팅(Contract Testing)의 글로벌 규격화: "거짓말하는 가짜 서버"의 약점을 근본적으로 박살 낸
Pact프레임워크가 전 세계 MSA 개발의 척추로 자리 잡았다. 타 팀 서버 코드와 내 가짜 서버(Stub)의 코드를 Git에서 하나로 묶어(Contract), 상대방 서버 로직이 1글자라도 바뀌면 기계가 알아서 내 가짜 서버의 뇌(대본 JSON)를 1초 만에 최신화시켜주는 '살아 숨 쉬는 유기체 스텁' 환경이 구축되었다.
참고 표준
- WireMock / Mountebank: 마이크로서비스 세상에서 "내가 남의 서버인 척 흉내 내줄게!"라고 외치며 8080 포트 위에 홀로 떠서 JSON 대본을 뱉어주는 서비스 가상화의 전 세계 압도적 1위 오픈소스 툴.
- Consumer-Driven Contracts (CDC): 과거엔 서버 만드는 놈(Provider)이 갑이었다면, MSA 시대엔 API를 쓰는 놈(Consumer)이 "나 이런 JSON 필요하니까 계약서 이렇게 도장 찍어!"라고 갑질(주도)을 하고, 그 계약서를 바탕으로 양팀의 스텁(Stub)이 기계적으로 동기화되는 현대 협업의 최강 철학.
서비스 가상화(Service Virtualization)는 마이크로서비스(MSA)라는 분산된 우주 속에서 개발자들이 서로의 발목을 잡지 않고 **초광속으로 각자의 우주선을 몰 수 있게 끊어낸 위대한 '독립 선언'**이다. A 서버가 완성될 때까지 B 서버 개발자가 멍하니 커피를 마시며 기다리는 조직은 망한 조직이다. 기술사는 아무리 거대한 외부 인프라(국세청, 구글, 옆 팀 서버)라도 거침없이 모형 세트장(WireMock)으로 가짜를 찍어내어 팀원들의 노트북(로컬) 안에 무상으로 던져줄 수 있어야 한다. 진짜 세상(Real)이 터져 나가고 잠들어 있을 때조차, 우리가 만든 가짜 매트릭스(가상화) 속에서 수만 번의 결제와 폭발(500 에러)을 무한히 반복하며 강철 같은 아키텍처를 담금질하는 숭고한 속임수, 그것이 서비스 가상화가 창조해 낸 통제의 예술이다.
- 📢 섹션 요약 비유: 서비스 가상화는 전 세계 비행기 조종사들이 집에 놓고 연습하는 **'수백억짜리 비행 시뮬레이터(VR)'**입니다. 진짜 하늘을 날면서 인천공항, 뉴욕공항(외부 서버)에 무전 치며 랜딩 연습을 하려면 기름값(서버 비용)과 대기 시간이 어마어마합니다. 비행기 조종석과 똑같이 생긴 시뮬레이터(가상화 서버)에 앉아, 버튼을 누르면 뉴욕공항 관제탑 목소리(가짜 JSON 대본)가 헤드셋으로 흘러나오게 조작하여 내 방구석에서 100% 똑같은 환경으로 수만 번의 추락(에러 테스트)과 이착륙 훈련을 무한대로 반복하는 기적입니다.
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 스텁 (Stub) & 목 (Mock) | 단위 테스트에서 내 코드 내부(메모리)에 살짝 심어놓는 쪼잔한 첩보 요원들. 반면 서비스 가상화는 아예 건물을 통째로 가짜로 세워버리는 인프라 스케일의 거대 스텁(Stub)이다. (이전 장 460번) |
| 마이크로서비스 (MSA) | 50개의 서버가 거미줄처럼 통신하는 아키텍처. 서비스 가상화가 없으면 이 50개의 서버를 띄울 때까지 50개 팀 전원이 손가락을 빨아야 하는 연쇄 붕괴의 진원지. |
| 피처 토글 (Feature Toggle) | 가짜 서버(가상화)를 붙일지 진짜 라이브 서버를 붙일지 소스 코드를 재배포하지 않고 스위치 하나로 딸깍 1초 만에 켰다 껐다 하게 돕는 배포 파이프라인의 명품 인테리어. |
| 카나리 배포 (Canary Release) | 서버를 배포할 때 가상화된 환경을 넘어 진짜 트래픽 5%를 살짝 흘려보는 행위. 가상화 테스트가 방구석 훈련이라면, 카나리는 실제 전장에 살짝 발 담가보는 실전. |
| 계약 기반 테스트 (Contract Testing) | 프론트팀이 만든 가상 서버(거짓말)와 백엔드 팀의 진짜 서버 스펙이 달라질까 봐, 두 팀을 강제로 하나의 족쇄(계약서)로 묶어 거짓말 시 터뜨리는 완벽한 가상화 보완재. |
👶 어린이를 위한 3줄 비유 설명
- 내가 레스토랑 주방장 연습을 하는데, 만든 피자를 서빙할 홀 알바생(다른 팀 서버)이 아직 출근을 안 해서 혼자 피자를 들고 서 있어야 했어요. (연습 스톱!)
- 그래서 옆에 **'알바생의 얼굴을 한 가짜 로봇(가상화 서버)'**을 세워두고, 피자를 주면 무조건 "손님께 잘 전했습니다!"라고 1초 만에 대답하게 녹음기(대본)를 틀어놨죠.
- 이렇게 진짜 다른 친구 컴퓨터(서버)가 준비가 안 됐거나 죽어있을 때, 나 혼자서도 완벽하게 진짜인 척 통신 훈련을 할 수 있게 띄워놓는 가짜 대역 로봇 서버를 **'서비스 가상화'**라고 한답니다!