DDD 기반 UI 설계 및 자동 구현
개요
마이크로서비스 아키텍처 설계에서 가장 중요한 과제 중 하나는 설계와 구현 간의 일관성 유지입니다. 이벤트스토밍을 통해 도출된 비즈니스 요구사항이 실제 사용자 인터페이스에 정확히 반영되고, 백엔드 서비스와 원활하게 연동되는 것은 프로젝트 성공의 핵심 요소입니다.
이러한 과제를 해결하기 위해, DDD 기반의 체계적인 접근 방식을 제공합니다. 먼저 도메인의 비즈니스 요구사항을 분석하고 BoundedContext를 분할한 다음, 각 BC별로 접근되는 인터페이스를 구조화하는 사이트맵 생성 기능을 통해 전체 시스템의 구조를 명확히 합니다. 이어서 사이트맵의 각 노드와 연결되어 실제 UI를 시각화하는 와이어프레임 생성 기능으로 구체적인 사용자 경험을 설계합니다. 마지막으로 생성된 와이어프레임을 포함한 Frontend 생성에 따른 요구사항을 Rule로 정리한 바이브템플릿을 통해 일관된 UI를 자동으로 구현함으로써 설계부터 구현까지의 완전한 자동화를 실현합니다.
음식 배달 앱 도메인 주제를 기반으로 사이트맵부터 바이브 템플릿까지 UI 요구사항을 유지하면서 동작 가능하면서 UI 일관성이 유지되는 애플리케이션을 구현하는 방법은 다음과 같습니다.
1) 사이트맵 생성하기
사이트맵은 웹사이트나 애플리케이션의 전체 구조를 시각화한 지도입니다. 개발을 시작하기 전에 전체 그림을 보면서 "우리 앱에는 이런 화면들이 필요하구나"를 이해하는 데 활용할 수 있습니다.
또한, 각 화면 카드에는 해당 페이지가 무엇을 하는지에 대한 간단한 설명이 포함되어 있어, 개발자뿐만 아니라 기획자, 디자이너 등 모든 팀원이 쉽게 이해할 수 있습니다.
음식 배달 앱 도메인 주제를 기반으로 사이트맵을 생성하는 방법은 다음과 같습니다.
1) 메인 페이지에서 '음식 배달 앱'을 클릭 후, BoundedContext 생성 단계까지 진행합니다.
이때, Bounded Context 분리 기준 하단에 위치한 '프론트엔드 생성 여부'가 클릭 되었는지 확인 후, 생성이 진행되어야 합니다.

2) Bounded Context 분할 결과까지 생성되었다면 하단의 사이트맵 생성 버튼을 클릭하여 사이트맵을 생성합니다.

3) 생성이 완료되면 다음과 같이 음식 배달 앱의 전체 구조를 한눈에 볼 수 있는 사이트맵이 생성됩니다.

이렇게 생성된 사이트맵은 단순히 화면 목록을 나열한 것이 아니라, DDD 기반으로 분석된 요구사항에 따라 사용자 인터페이스를 체계적으로 구조화한 결과물입니다. 이를 통해 이후 구현 단계에서 UI 컴포넌트 간의 관계를 명확히 파악할 수 있으며, 일관된 시스템 설계를 위한 가이드북 역할을 하게 됩니다.
2) 와이어프레임 생성하기
와이어프레임은 웹사이트나 앱 화면의 뼈대를 그린 설계도입니다. 마치 집을 짓기 전에 평면도를 그리듯이, 실제 디자인과 개발에 들어가기 전에 "이 화면에는 어떤 버튼이 있고, 어떤 정보가 표시되고, 사용자가 어떤 행동을 할 수 있는지"를 미리 표현한 것입니다.
앞서 생성한 사이트맵이 어떤 화면들이 필요한지를 보여주었다면, 와이어프레임은 각 화면이 실제로 어떻게 구성되어야 하는지를 구체화하는 단계입니다.
음식 배달 앱 도메인의 이벤트스토밍 모델을 기반으로 와이어프레임을 생성하는 방법은 다음과 같습니다.
먼저, 이전단계에 이어 이벤트스토밍 생성 단계까지 진행합니다.
생성이 완료되면 아래와 같이 Command, ReadModel스티커 앞에 UI스티커가 생성된것을 확인할 수 있습니다.

또한, 하단의 '프론트엔드' BoundedContext가 생성된 것을 확인할 수 있는데, 이는 이전 단계에서 생성한 사이트맵을 확인할 수 있습니다.

생성된 UI 스티커를 더블 클릭 하여 패널을 생성한 후, 'GEN AI' 탭을 클릭하면 연결된 Command 스티커의 정보를 기반으로 와이어프레임이 생성된 것을 확인할 수 있습니다.
이때, 해당 와이어프레임을 확인하고 추가 요구사항이 있을 경우 해당 요구사항을 입력하여 새로운 와이어프레임을 생성할 수 있습니다.

3) 바이브템플릿 적용하기
와이어프레임을 생성한 다음 요구사항 기반 바이브코딩을 진행하기 위해 바이브템플릿을 적용합니다.
CODE를 클릭하여 Code Viewer 화면을 생성한 다음, 'Base:'를 클릭 > 'MARKETPLACE'를 클릭을 통해 마켓플레이스 화면에 진입합니다.

'TOPPINGS'탭에 위치한 'Vibe Template for React'를 클릭하고 Apply를 클릭하여 토핑을 적용합니다.
이때, TEMPLATES 탭에 위치한 'Vibe Template for Spring Boot'를 적용하면 백엔드와 프론트엔드에 대한 바이브코딩을 진행할 수 있습니다.

적용이 완료되면, 상단 메뉴 중 '아카이브 다운로드'를 클릭하여 적용된 프로젝트를 다운받을 수 있습니다.

4) 바이브코딩 실행하기
바이브템플릿이 적용된 프로젝트를 'Cursor IDE'를 통해 실행하면 아래와 같은 화면을 확인할 수 있습니다.

'Ctrl + L'을 입력하여 우측에 Cursor LLM 영역을 활성화합니다. 이후 단계에서 해당 Prompt영역에 템플릿/토핑 적용을 통해 생성된 PRD를 Prompt에 추가하여 바이브코딩을 진행할 수 있으며 생성된 Rule과 PRD에 작성된 음식배달 시나리오 모델의 정보를 추출한 Metadata를 통해 요구사항에 맞는 코드 구현이 진행됩니다.
생성된 파일에 대한 설명은 다음과 같습니다.
- Rule
.cursor/rules 하위에 생성된 파일들은 Cursor LLM이 동작할 때 Prompt를 제외한 기본적으로 적용됩니다. 따라서 바이브코딩이 진행될 때, 프론트엔드 구현에 있어 일관성 유지 및 동작 가능한 애플리케이션을 생성하기 위한 요구사항들이 포함되어 있습니다.
대표적으로 기술 스택, 패키지 구조, 이벤트스토밍 스티커별 생성 예시, 디자인 예시, 생성 규칙이 있으며, 각각의 Rule은 바이브코딩이 진행됨에 따라 적절한 상황에 Rule이 적용되도록 처리되어 있습니다.
' width='2150' height='1192' xlink:href='data:image/png%3bbase64%2ciVBORw0KGgoAAAANSUhEUgAAAEAAAAAjCAYAAAAkCQwqAAAACXBIWXMAABYlAAAWJQFJUiTwAAAKyklEQVRo3s1ZWXLbSBLVIWa6LYs7FgIgdoKrKIqSrG6Hu2M%2bJuYC8zf3v0DOe1lVIEgx2nJLofBHsvZCVa4vi1fXvbF8uhlLnNYyCRL5PPDkBjQYT4VjIw99/YnWzdyR9DA%2bCjMJ41KyYiFZuZQ0b6Scb7RezLcyy%2baSgLJiqXMS7u8n0h8G0vdiGUwifCOUIcr%2bKNTvOWJ7aMfZ5nlucAaWPAvrn19JN535Zs%2bpljf2nlf8meAyIz9VGgcp2nl72V8/D9vLuz6uGWOTaVKLPy1kiE39qBAvyGQI8usd6qmEGA/iSoKo1Ho0m4PRC/HxvThtwMBK%2bziXewzIiAs0JKN48DfSy32ncnXdI4fGMoZ0wqSExGMcONf2L9cDZYApTZ1EDeDiEZhAOq8Pz/raMe0/jpl69MMH/7t0umeggrm6hkRHkIQfF5DKHBLNINlSmTGcTJUhk2CmDHHq2Rv4Lw72I5d4D2m%2bWRtgitTKq0%2bQ6KTcigcV5sVJXpiqfYdgSpI1SjHsmUwhg9Q2OxcZKFM8pf7QN/W%2bp4wi9UFuPj/ct31uro6j/70k/RpN4LfTcm0YMC7WqgF0WtGMtlpZZlRap4PkxWf5QhkxGJ9efjSJJatuJQcl2VLyGnX4AbZZZ5%2bx8whqB01Dm75gCvuf4dtxtlBfMvZnH0ITEM8cxjVNAAzIV60GBHHRmgBNgiYwtZJneQNp0aueMiDSi2TVVp0a63oxXJIUzRr9qDrLaa4XJpEBSb4EY1faz4gz/iCiP1IGfIJzowY4BoTWDCh91mn71AI6RhLNwznBrlrd9M9MYHDBBDjXmcDQmYD/4SZAYjhWBtBWfUoOds4YnpUrxPAG6ruWot5Iihhe1GstE2gEzaC1pY63Z4z/GZzb60OiZcCEKt7cy3r3JE/Pf8jjl2/y8PRNfvv6Lzk8ftVyu3uU%2b4fftX%2b1uYc9z1RiY1XrCHF9JjG0hZuqJFWagQE9SqElSr/bZ0qVyOA430mou9b0UYPC0/06Y2YP0z8Ydve4tKeNAvQBE3WCpaq6c4J0do58qD7NgnWaQH9kNqQtaYynXcHJqYMhkAIYoukE0Qy2DQoTrDNt04c2UCfH2D/26BxTMxbRUcVmnR3XObZvEsSmLzD7Eb3yDLp/nOrert/toes6e/JbI4R46wOcE8w17JECrRtfoH3WObL0pqlyb2gZQEbEMItq8yDF4lbK1V7y5k6KZi2r/UbqFcZAxaKW1d1ato87WezW2sdycbuSfF7L7dNOx%2babpY5xbbNdtnNmZalluWh0PsvNYatlnBW6jnOzupJ6vUCIK3VesZhLuWwkSjNJqwrnmuuZvJCAr7I4oNicaEBonSCjAJnB8Di14ZDkHKCJ6yE2z6Va4gDbTXvA1X6LQ61waB6qlrsvT%2bi7Q3SopNnwIgudW6%2bXONBSlrsNQuYcB6/BgKWOs86xZmv2YL1oGvRX%2bj3Wk6zUuc1mrdKleg9HU4MwWY54VtMe2LYjRqdWAybT/ChtXNp5fjKCIZBtqj%2b1wjkRDzkD1S9CSFvd/4kDPiIUor7byRqXXe/3sns84HJb%2bc9//yeP3/4tozHiLyBogLhP8rGHq5PCqDhpG8ov9HXI7sF9uf77ZL4/PSLBowbwgiw1/s%2bOlzeJ0NBmgwYKj21sZ8JTb59hBk%2bgZ8kXB0QLxHdEl2L5oD7hiP9/pkgQwglaDQhwycQ6PfUDBETKkKr1Dcd02FcfMLFZXKAosemYRtSph9/J9Dpj75j4vBYSd6CwkXxiGUAnSNjKOrWAXv2cAYqorAZUu2ep97%2bh/CIFHeLmIPnqXrLlncTA3OXtI%2bhJ26Tm4ZtUd8%2bo7yVtdjpWbB907awBhF4fdE0AATCsviZr/DFy6bDVADJgaqXuJB5aZOiBAUyJX2iAYupOiusnyiiaz1DDY2wk7FJkJVOfhKnJMK0kumucNrhHEYMovZO43rPo0qHJ3sDv1L1TpKlr/DYJO2peqwEbhcIO6jo/wIhA5OccIus8IB9EjiYQ6QNHAkfIhIe5ALWHbeJ8Ohrm3XwAYZ39LPXBBJqTas7Q2MeSRtcykUo1n1jZ3GKlSRXr2obAOM65abnRutsnqxCJmr35PpIuZnz6Xfok7MMchefuPIiMpYcGN2PYizTUGcDDsZPnJfsk5ZzgEVIiFCH2azKEQ/BDxXynh%2bYB2eYY69XyXsd4oGpxr5dhm%2btZUqtoekyOPDCWbTKL7YnN5Pg%2bwTFmdBxjXed36gaQmTY1Teu2Ta09YUDfXoIXn1rJU%2bIDVc1IelAfFwG6UcBtRlWlP/AsZ3kwRYlUZ8zTA/NA/kwPR41xl9JLdC7gIOugA2HbvhMn1mkPgxPzcOtP9jiDxa0JkAE8pAuBLh1O8uNDCC9CBpz4ADo/qLauTQqp4Lio0pQotYBpMENhUa2Mzfa7maL/8gHF0hGz%2b/bgodqtyxpPKWgzyb/rDFsNoOqT%2bOT1j19v5J%2bfeigN/XLd14ufM4BS4yH5AryBR8%2bhwgVU2ajzHZDhk6y3jzqPzKKEqd6evihXRgssiNHSzmGdYEXVP8pkmkIrc/gWlKyH9ElgOoltOulez2sZ0iXnKFumnmgCGECuR0luUZ9Bgb5FgA4JUjto/5dMwKh/bOwbNk1b42MH7TlVn7BQ%2b5%2bvHrSkX6CzqhDmaoTKORjUIASWCIdzhL1iscPYPSDyQVKk47P5Wpr9o%2bTLnc4vVjtZPjyj70nq3UHrWbMBI2plTDgrlUzbMFFDOpEimM7zse58yNUNOOQlFufrW37TmoILWSzp/M4ZwGcsbsLMason7qRu7VzhZuRgrEuuapUuGRbMCuADeP8C3r9EZMhgPjW8NpIolgEOHxcww3IJqG3yDxc9kop98%2bM4tCNbbLWfFMN8yRSO0/8wGkT29YlnctGESPbqM%2b1MVfIY%2bxkBaNvuWZx02QSKFhITDPl8OsNFmVlSLVmfoGTM137UOca2R09NZ2ifwtRr27kj9wdK%2b3ga2IdMm9df8AfqY7rtrgk4LDC4YAIqVfv276h74XM6YQC4STzAt71ssZdya9AeUVwBmt//LuniDlJZK/LjOFFgVCAE3n2RjKkz5iUVVX0rzeGrIsEEqv9Rz%2bdXly7ZvexfMkBNIGrDUlcK%2bix%2b1u4PLrW9i1L8sFzgrxjwPQ1gOkwkSJtmvkB/MLT/Aikkpn/wYvtqFB8xg4XLYzc2iS/%2by3RcH5/s7eYPu/Xx8V%2bp0dm8lxRbwb2RAQxbLOldCV8JQd2TNz0%2bnQ6jg/P%2bRIT0vqwr%2boPZMCK4Mc4LNSmbWyS508iSlZs2etChMdQqpAZg4xr9lv3voVoedK2iTELkcqNhmWfh/xSFItZbdahvZoBzTNxMw57F7/wYpcuyxoHc/wW8ED/u8LmDxwRPPCxDrmME17LkGFElgRUZxv24DyMN91EGYZ6uxdzMMpwlPb4yjGezTOSY%2bQ8ifh8G0KsS%2bZGz/Ajr/DjbDHmarFiqgQV4eErS4QZKR5GjxQ6UIBlJCaum2BxDmcG0HYcnyKK2mX%2bdFtomuYs7DcpsosS9yTzFLScPIm9kgIOtlKYzASc1909Qa9OezQ8mcZv%2bOttubd/OGXtHe%2bc%2bbl3XR7T/8Nh1LjVv97d7j%2b3/FUdn/Y5O0OAA86cIbVcP65sLfOTLzovk6BV/j7%2bLBjhuXzrEz/uP0OmL0P8BPVirOn4%2bkDgAAAAASUVORK5CYII=' /%3e%3c/svg%3e)
- FrontendPRD.txt
Cursor AI 기반 바이브코딩을 진행할 때, Prompt역할을 하며, 동시에 이벤트스토밍 모델 기반 생성된 데이터인 데타데이터를 제공합니다. 이를 통해 이벤트스토밍 모델에 따른 구현이 진행됩니다.
' width='2076' height='542' xlink:href='data:image/png%3bbase64%2ciVBORw0KGgoAAAANSUhEUgAAAEAAAAARCAYAAABtu6qMAAAACXBIWXMAABYlAAAWJQFJUiTwAAAGt0lEQVRYw62X227bRhCG9RBpHds6SyRFUQdKsmTZluzYsZM4BzQJkrYpWqDoRdv3f4HpfLM7BB0Y6U0uBrvc48y//xzYeHLQlKvrl7JYnclRO5HOIJd%2bOpVWL5O0WEmSL%2bTpcVeO2wNrkaNOIoOTS%2bn0R9JLJtIdFibWH4yrts28jnf6uc0/bfbkUKWr49vzZ7K7eiFXN/fy/O6tXFzeyut3n%2bT69o2UyzMZT1fS7AyrO7%2bXHBx1JBkv1c6x5NONNFAoy%2beqaC5HrYGCMJBmN9F%2bX1rd1ICgjxxGAwCjpUagYJs1KrTt3kiNzdT4POzVc1rV%2bMj2saejZw6SQtLRTMaTpRRqbDqamx65fg/TifTsjESO9V72fTdRG9t6P2ejZ6OfTLXDC07spfrpTA510WGzb4rzimxodhJDjbalko5KfaWNylqVPpEMVHX9uFiYUakyZ6QMYhyhzzoDR/c320OTI70HI5t6J4KCLR1vRXDrwr7qu96vJIwBcOgncV3yYC9nt6Idjev7L/L641/y/td/5P7Dn/LTL3/Lxy//yv7Fz7K/%2byy7208PhLFhNrODBkp1LsO46eJcxrONGl5af1KeyWy5q%2baK2antC4CtbWykgEwXZwZMMd/a/qwAsIXNp9ry3dd7wp6LCuxJuVUKrw1ovrm3mJ/ao7CesxDudR3Ym2RzG%2bMOzmysd6/k5v6zvHz3m7Wv3/8ubz78IcuzO1mc3spiWxP7vrMLQBZfBkUumJ/spdS4wOFuPArBFL98oka6MsYINWC2vLBxgKG1NQbMuRmWR4bNVzuVvZ3J2cvTazOAfdwZ7ljbuZyJ8exdrK%2bsj258s46zyvWl3dXALxL1xWE2VRTn1nYHIzk4bMsPGiBpvxYoFWgWaMkFGM3hXI74i5qSEZRSQWIMsHhZFEB5jGKePeytGKSK0p9qH6WZ9zvYO62A3hojgktubIx1MA7pqevSDjS4JxprYC6Mod%2bYL7dyvruR2xdvLRpfXb%2bSV6/fy/2bj3L38p1SJhzQ1yjugq9jfFdjBm1fA5qJzkEtXo7LGLMLtc8Yfaer92k9XjidAz1PTFjLOO4QFF/YHlgIU9iXKMv4pq3mdJxH8ljiPm%2bxwNoQZxpJiiKlAMRsoVQq9YUWUFUvTAsLescxYLl4oOnHGNAbjq0PAPQBDPcw4JI6cFkV4JCm9%2bO5rZo0yRj%2b3Rk%2b2OdBrFnfVzPKDGwPHwmSDwV9Gr3%2b2Fwgn64MeVwgUVc41oN%2beNp6NJdWAKhR9PEtfAyBnlDcqblSX11snpnP8mIODOyhdXaR9mxcW8SBDG1e9W2uknEFfrVex2FoNR/HuvE73BXGDYBsPFN/LPXFA/XI908Ojs1QUqHn/rp8DYBRVAXDAYNzCFjBd/fBZ2OMgKL46fr81uYIUvg31Cc%2bAJIDyTkACJgELcahNv6/2t5YTGF/GQMwcyNznbUsN9dVBgh37aq7eAz0AYTGSI0fZhOjPII7wIh2L5UfD1tWOQUw1Pjj3gMGeCAcau0QgtxlFXU9WhOlCXgAQyDCaAIW/oohrlgRMwGG%2b9o8ZgMYxBqrJwygvYHIdwW0jgEKerCXdIceq9MbA8HO1rv8MTjbGEDEx2DQJgtkEYRBOjHaUNlhvIPwGAAhoC1imtqGlGcvfqEv8awWnS8sI2C8pzpeg9e1oBeVpPV0OY3Ars/v7EzSKmyzbKL3VfsUbEAIGSRkBNM/BkJihOtclwYvndnrL833QwSGZhsrSwHlmwDowR61vQ4wmlqKujADAyNCistitAcIm1eAMMTrgiLWAnXXgSVG73gua2AF7uFgIYxbvo8ZxIozBcKApE7QtYBSD4SNlgWxldGfSX6OCH5I6DfNDdz4xxkQ0g8vCQAY6IpDS9yhmJ1WlaFVhLEeONk%2bN2PYw7p5pKkZRP1Qqw3Kk33lIh4rcA3uD9XhWXAVXC4WXiFAFoHR/bxK4RUDsnwWXaC012Yh331tyQihMMq/4QKJ5WoUNgDmp6aMFzcYZyXqLLjAKJajXtrCgDL6d3jBfVXoOIhe6Xl8AQAvvswtYNQ0AIrh41jxeWkc6o3gOmSLBwCkkeaBxkszPtQAExlkAQT%2b5L7tAsvqRbjUY8AsMsCUtZfc2Tru8iAZovllRW9ABACP2PbiseBhPd8ENmKC/S8o%2bLw4ILHHmRP2hyzhfcBFV69kQxAk2Mz5aQC1UABhNC4A9Q%2bO2v/rAh51nbpUfqPixAz3/wBXLFRqRcUSpzdn8EL1KB1q/Y2dzbyX184M4gjVoZ8HQF%2bf4xnAf4DQra7/fzdcWw5uAivrAAAAAElFTkSuQmCC' /%3e%3c/svg%3e)
- wireframe.txt
UI스티커를 통해 생성한 와이어프레임에 대한 HTML 코드로 구성된 파일입니다. 이는, 바이브코딩이 진행될 때, 파일 상단에 작성한 요구사항대로 React기반으로 변경되어 구현이 진행됩니다.' width='2156' height='748' xlink:href='data:image/png%3bbase64%2ciVBORw0KGgoAAAANSUhEUgAAAEAAAAAWCAYAAABwvpo0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAHFElEQVRYw82Y2XLbRhBF9RWxLe4gQQDcQFISKVmWHW9JVSr5/8%2bZ9LkzDYAUJVfiPOSha7aexnTP7WVw1RtOQzZfh2lRh0m%2bCllu/fkmvOtPwmA8D6OsCqNppf5wUhiVgT0z21OubkO1ugvl8ibMy20Y2dpyvQ/lYhfm1S4Ui71aaGj7%2b8NZGIxyUexHGo7z2O%2bsizo8kfIL43OKclxm95uS52Rrk2kZrq4HmZSbzJam%2bDqMTdlZsZayGIF12nf9TH0IoeMMPjPadBEqM8Bm/xjW2/dhuTmE%2buaD0VNY1fdGR7VbG6%2b3D2awW%2bM5xvHuvagwA8FT7z9obbE%2byKiMN7YOuSzWkUOLrMX6Tt%2bkhTjDZveoC5FMOwvzyJMsOye0Mhn1/n24Qrm%2bWWNe1aFa30j5arU3Y6zCm%2buRlH/bG59QX7c2D5kZDctyGBTmw7R8dHf3SQqg4MIOyHh/%2bFWKHx5/U//m%2bEU8HJSx1m8/RgNZKxkmiwP7HP3d3UcZgTEKw4dCOxtHGU/i2aax77l7%2bKYxMvfHz%2bHm/qsbIDe4bkOx3MkIhUEYJLy5HkrhiIBJYwwMMDKEgBracVaa6yxlEFA0mS3C1NyJdlZs1IIU1qDckAN/brfEOnO4Ca3Gtne%2b6IztMtg/a/aBvIhA8dpezsK8UGnfw/38e5nxsAYKZubeyOIMGzP%2b1ZvrsS3UIa82QkFpRsitXZghFuvbEyRcNkApYQh3wfNqm2gnPtASKVcLappW/fx0rmnb9edrl9u2P0v7OmvEhrQOYaSrt/1xyKYrWbI06FerG6EBQ4yyQj7fRUHXAFlCAMEQqPvN4cOV%2bR0BEnRcOmBDr61dpFapto19GbsrZ3RhvSOrsEu7QiEUQenV9qCbmxYRvqxx%2b5diQNcAuEuW0BDhHseCvTLLUi0wdPgCywjjTYLoVhTdKV6I73X3ctfyYC2IiycSe5EXZS4F97g/7bHALX6Thass6wdiQCYXkAHqgx1iE3qDqRQl3UHXg2mTAZQ1RtGaCKbl4GsLgECKgKbonoIUfgYReBQQ1we5RhOJLSgyRyC7tSAFcgiaHq0Jft6CNOSstvdCmoJgyiTKJja3O3yKe8X3oPMsjW7uvzTf5RvwEwivuKW1Kf7w%2bDl8//2v8O23P8PTp%2b/h89c/lOuBCjxdwtI%2bP7I%2bRojCP%2bgQHHYpQ0Ql6pTyVkqDMSX54XcWlXVQUpulOQ4HSlhb6vBHKeP7UZ4%2bPHyn3XvftOxxw0KcC6OyD3TILS0eFAtzAW6YCYLeqr4TCja7o9yBIEhMQMlrQ0ovIUEIMANM87X2AkeMwMfam3qSouXyVh8vlnsdDpTge%2buUq2OsuNVe9kTjHeMe442GOEqWK7hO%2bRwEcsOVCrLb2Dd5GMmRBvS7BZb7v8cuxYDBZK70R%2bDDZ1B4gu/Mo99hpIsxIPkdvgWBCLc2ypwHNfZ0A9F5UDof/9P51/hOKRnALkeV4NhKwiplACpAD3y/vHulDjDF81T%2bugG4MW7I09//hc6N0CAAA5Avy4UVFFYBzimGRPjxnQwCMmg9HbYIKPVm8CwAEgRPg6lXiJfS3Xn/NN9317qQzRsanKW2di4/SYEvKf/MAD0grOiN7xylOEYA%2bv4GuFwJdgzQcQH8lQCHEXEFfJfW/TdPNfrKAxwRvj6e%2bLeCoI3d/z0grlJmIVUTTF0OmcH5KHVZf0n5Zwa4tgDRSwvjWaXiZ2g%2b0jMlz/P/uQHIpY0LKBCWCjp6gCiI7doskuoD5flUI6h%2bSDne52iZh1fl9FkGinxRTpyrmvK72Z8y04%2boCYJvzeffnNG5719CAClldBIEq1gTpNtj3EtZo28ZZNh5kvYtsPpTlb740vygmZ9pX/N0Hs46z%2bi8kaF2MO3InXbWW57mGZ7kzymFLynZVfZ1A9QnQZA%2b6YiiBgQs0jM1prB7GQyryy14xnpaTOmOeaXE5DoEU3jK9ITWkzu5A7cen8CHmALN6GV6ltf2GuRbXiN44YNrsQ5fkWqRVw3wOgKKZwbgA/5Rbt8fRZm/2FLpe1IW82K0WMKheHjxmPJSNr70ts2L0MtcCjQ9vFQ%2b1%2bk1uY0vzbKW62lOP2a2zc8Z3INxs8f2/2sDeN3dBsEy/qzYPehwXWjS76UfKT4%2bh32vn7X8Dnvf53sGp%2btxLmtk%2bVqPJ37jCrNnf4naoij/bw3AjSxTZTZtHjjxecwNCHrpNxl7qQ7hiW5w%2bgvN/xXAw5rcR9DdN3zcqN74RS1%2bl%2b/VKOsvZgKdu/gZF0iFUNaNAYVgRypSOWu%2b509k9%2bN44Ahl1oEhypDW/FeYxwXkEw8wKDyKH6nsZS9uEvl38RGVyl%2bPLbjXj1LhT8aAzUkMgPB3vQkIVNZv6/DTCN7%2b9Dz7YXn20/N0TwvnCOl5u9aJ7g79bnn8kgH%2bBppj9csOdiiPAAAAAElFTkSuQmCC' /%3e%3c/svg%3e)
- openapi.yaml
설계 단계에서 생성한 Command기반 API 명세에 대한 내용으로 바이브코딩이 진행될 때, 생성되는 버튼 및 화면상에 필요한 API를 제시하고 백엔드와의 통신에 있어 일관성있는 API를 제공하는 역할을 담당합니다.
' width='2148' height='754' xlink:href='data:image/png%3bbase64%2ciVBORw0KGgoAAAANSUhEUgAAAEAAAAAWCAYAAABwvpo0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAFR0lEQVRYw9VYSZLbRhDkJxwaDTeQ2HeAILgvs0ly6GCFj/7/Q8qZ1WwOZiTZOsgY%2bVDR3SCAQGVnVmVzMJy4MvdzccNS5kEuMz/T%2bfvRTEZTX2ZeKlM3lvEslLETiuMmMhy74uK%2bOGsRS4nzVoK4Fmcei%2bfm4gelhEmDawuJ0kbvmeM9E8eXKd4zcYJfImbIa3A7nmuiDhZ%2bXOrohbk4Xiw3Q0eBsKONEUBjInOAYGN5eJT2/EGa3b0U1Vqa9U5Wh4Mk%2bVLBCaJS/LBA2PFtw8NmZ0UrA7PTnnhRoR/L5ONsIW6Qybvb6TXpLhijiacIOvMIKCYKxvIEAI4PEl2e9UJEAPbMIpk6kRkRziwGqxJ97q2DjFUAJkiASfPj7UggXifeBWA6uwDgGQBCPFO0O4w15JFIWpZSNI1kdY15JQnW%2baLWGE98fd5SsTufzPqVweAdEgrTErrPxAdNA8iAbAgTfDgoQlm8ZoIBIJSpApBe5JBK2mykXB%2bQ9Erqdim7%2b71ULSWQmUhyAJvKaOzJGLJjjADGEGuONgwoYS8xUO37ler2cHqS0/0n2R8f5Xj3UbWitAVVuNvduEoADJigOBK05ngvmYJwlHK1k2qF%2bbIBwLlGlBUvxiBBIc0LsGIBhlQ6T4oS74x7A2HADhCnrZwfPssff/4lT5%2b%2byGb/KM3qhN3ix%2bTaJZ6jgH5SA4AbKwM4p2QsAMVqj3EL9lSaKCWgUVUqiayqryAw4Xq1VBD4e9EsVEK9ATCZJ9rGlpuznB8/S7u5QwfIZDjFDW5qAvdMOjGdxxcGxC8kwOTr3VnyJZIH1b0oUcrPXMMaPzJgDUeeysDS/3boPstg/CyBPkAYvLt1oM9CE6DeWQN8rQGVav63m5GpAdD%2bzSVMGzQSIAtYCygVymBxuMdurrHLlSx3a6nXre40d3Z92sEX5ArI3Cd4EToGQUqU9s78%2bcN6Y4DpAoEmHGcNPhB6LJagbKtrtkZ%2bnC2E1yJ4YQANjgUgSGvd/bRYyPZur7HYrHQ8fzrL%2brg189/v5MOXJ9k/HK6xOe8AfKaFsa8CeAVgjGQifHwAzWpRmxl9O9gptki6xa/a4KUGzC8SIBuivJHl%2bUlBSPJad58sYDTbFYwRJLICsHmJ9fpaTL9F%2bd4YQCfIRNn7zW4nX/X%2bW1hfu%2b4aIZcWGo5K5yiCTLxAG6wQYVK8sL06n3573o3vAfKfAUAXGNEHIBFbAygHgkFW0BjF2Nkhkn4NgNrgCwMoAR/PNacHyVEMF9h9VnhWdlb5CsH71APYfg8QxggtiONnd9lP8ub9gyHpiwNLVq40cvgBmiAWxddngNdWmMkTBLujBJBuMCubq97pAziePpoasD5tVRqUA9ftfq365/zwdJQW1/tKnuPgPeg9tBaUiWBkTbC678ZrANgCCQJlw/a32N/h0FPobzQ5rP5sfWFijJCOCLpCa4503rnOrtArA0xyU63y3fjW7n/FgMtJkF2A9C83R6kQcYlagg4xHJn%2bzr6v/d6uO9dG3flFFv3UgOC5C3wv/lUCFgDtAjF2vZJqe9I6UMAJJkWl1Z/nATpBtkTOeUiy9ledICTBa10H2BsD/gmAH2EAO4G%2bEOeBkG2QR%2bLU1BC6QOv5Oaf9pSR8UJ3Ba6Q8f6cH0Lbb20HoJwBga4D1AXSCKVwgCyHBsRVfg9V%2b4l9PgSZMFxhfrvfZ/n4aA6wE%2bAeDngqDTBa7A6q7sb32b7Afjf8VA1QCgZGAOkfUAf4blC3gAA97qTdb9RV9nu/foAZkHQAi1T7rwOruozT7e3WYvzIAfwOT79sTGwNigQAAAABJRU5ErkJggg==' /%3e%3c/svg%3e)
5) 프론트엔드 기본 구조 생성하기
프론트엔드 구현에 앞서 frontend-setup.txt에 작성된 내용을 Prompt 영역에 복사 및 붙여넣기를 진행하고 'Enter'를 입력합니다. 해당 파일은 모듈별 프론트엔드 코드를 구현하기에 앞서 기초가 되는 React 기반의 패키지 구조 및 실행 환경을 사전에 생성하기 위한 파일이며, 생성이 진행되면 파일에 입력한 순서에 따라 frontend폴더 생성과 기본 실행 환경을 구성하는 파일들이 생성됩니다.

6) 모듈별 바이브코딩 실행하기
frontend-setup.txt를 통해 기본 구조가 생성되었다면 BoundedContext 하위에 생성된 FrontendPRD.txt에 작성된 내용을 새로운 Cursor AI Prompt창을 활성화하여 동일한 방법으로 바이브코딩을 진행하면 이전에 설명한 Rule 기반 프론트엔드 구현이 시작되는 것을 확인할 수 있습니다.

바이브코딩이 완료되면, BoundedContext별 설계된 모델에 따른 UI와 와이어프레임에 따른 버튼 및 폼 생성이 진행된 프론트엔드 UI를 확인할 수 있습니다.

이를 통해 분석/설계를 통해 도출된 요구사항을 토대로 생성된 이벤트스토밍 모델이 구현단계의 요구사항으로 전달되어 설계와 구현의 일관성이 유지되고, 마이크로서비스 아키텍처 설계를 보장한 UI가 구현된 프론트엔드가 구현된 것을 확인할 수 있습니다.





