00:00:00여러분 대부분은 이미 shad cn을 가장 널리 사용되는 UI 라이브러리 중 하나로 알고 계실 겁니다.
00:00:05하지만 AI 에이전트를 사용해서 개발하면 문제가 생길 수 있습니다.
00:00:09원샷 랜딩 페이지를 만든다면 큰 문제가 없겠지만,
00:00:12새로운 앱을 만들거나 새로운 기능을 구현할 때는 오류가 발생하고 앱의 다른 부분까지 망가뜨립니다.
00:00:17하지만 이건 새로운 문제가 아닙니다.
00:00:19이미 해결된 문제이고, 현재 엔지니어들이 앱을 개발하는 방식이죠.
00:00:23AI 에이전트는 항상 자신이 작성한 코드를 테스트하지만,
00:00:26컨텍스트가 커지면 이런 에이전트들이 신뢰할 수 없게 됩니다.
00:00:29따라서 에이전트가 주어진 작업을 완수하도록 보장하는 방법이 필요합니다.
00:00:33바로 여기서 에이전트 루프 개념이 등장합니다.
00:00:35Anthropic은 RALPH 루프를 사용해서 이를 해결하죠.
00:00:39제 UI 문제를 해결하기 위해 RALPH 루프를 구현해봤는데, 처음엔 완전히 실패했습니다.
00:00:44하지만 곧 RALPH 루프 때문이 아니라 제가 함께 구현한 프로세스 때문이라는 걸 알게 됐습니다.
00:00:49RALPH는 사실 Anthropic이 직접 출시한 새로운 플러그인입니다.
00:00:53하지만 이건 그들의 독창적인 아이디어가 아니라 다른 사람의 기술을 기반으로 Anthropic이 구현하고 오픈소스화한 것입니다.
00:01:00기본적으로 RALPH는 루프이고,
00:01:02Claude Code Hook을 알고 계시다면 Claude가 답변 출력을 멈출 때 실행되는 stop hook을 사용합니다.
00:01:09멈추는 즉시 AI 에이전트에게 초기 프롬프트 파일이 다시 입력되고,
00:01:13이를 통해 반복적으로 작업을 개선할 수 있습니다.
00:01:15이제 중요한 질문입니다.
00:01:17언제 루프를 빠져나올까요?
00:01:18완료 프로미스(completion promise)라는 게 있는데,
00:01:22이는 여러분이 입력하는 어떤 단어든 될 수 있습니다.
00:01:24Claude가 작업이 완료됐다고 느끼면 이 프로미스를 스스로 출력합니다.
00:01:28예를 들어 이 경우엔 프로미스가 'complete'라는 단어입니다.
00:01:32반환 프롬프트에 프로미스가 있으면 루프가 다시 실행되지 않습니다.
00:01:36따라서 Claude가 프로미스를 출력할 때까지 멈추지 않습니다.
00:01:39이렇게 하면 Claude가 원할 때마다 그냥 종료하지 않게 됩니다.
00:01:43플러그인을 설치하면 세 가지 명령어를 사용할 수 있습니다.
00:01:46RALPH 루프 명령어, 취소 명령어, 그리고 도움말 명령어입니다.
00:01:50루프 명령어에서는 에이전트에게 반복적으로 입력될 프롬프트를 제공해야 합니다.
00:01:54때로는 해결할 수 없는 불가능한 작업을 받아서 무한 루프에 빠질 수도 있으므로 최대 반복 횟수를 설정하는 게 정말 좋은 관행입니다.
00:02:01RALPH 루프에 제공할 수 있는 프롬프트에 대한 좋은 모범 사례가 있는 레포 링크를 아래에 남겨두겠습니다.
00:02:07하지만 이 영상에서는 제가 보여드릴 UI 워크플로우와 관련된 것들만 다루겠습니다.
00:02:12그럼 이 앱에 두 가지 기능을 구현한다고 가정해봅시다.
00:02:15하나는 앱을 검색하고 다른 명령어를 실행할 수 있는 메뉴를 추가하는 커맨드 팔레트입니다.
00:02:20이 새로운 기능이 앱의 다른 부분을 망가뜨리지 않도록 하려면 테스트부터 시작해야 합니다.
00:02:25이를 테스트 주도 개발(TDD)이라고 합니다.
00:02:27익숙하지 않다면 Claude Code에게 TDD 구조를 설정해달라고 요청할 수 있습니다.
00:02:32end-to-end 테스트 폴더, UI 문제를 확인할 스크린샷 폴더, 그리고 해당 테스트도 만들어줍니다.
00:02:38구현할 또 다른 기능은 Notion의 데이터베이스처럼 데이터베이스에서 보드 뷰를 구현하는 것입니다.
00:02:43눈치채셨다면, 테스트 주도 개발은 코드를 구현하기 전에 테스트를 먼저 작성하는 접근 방식입니다.
00:02:49하지만 이는 초기 테스트가 항상 실패한다는 의미입니다.
00:02:52커맨드 팔레트 기능을 구현한다면 코드 작성부터 시작하지 않습니다.
00:02:55대신 먼저 정교한 테스트를 작성합니다.
00:02:57그런 다음 그 테스트를 통과하는 데 필요한 최소한의 코드를 작성합니다.
00:03:01그게 완료되면 리팩토링하고 더 많은 기능을 추가합니다.
00:03:04그리고 추가할 때마다 테스트가 여전히 통과하는지 확인합니다.
00:03:08또 다른 흥미로운 점은 이런 테스트들이 자동화되어 있고 Playwright를 가져와서 시각적 검증에 사용할 수 있다는 것입니다.
00:03:15Playwright MCP를 사용해서 브라우저를 통해 자율적으로 검증한다고 생각하신다면 틀렸습니다.
00:03:20TDD에서는 각 기능적 동작마다 스크린샷을 찍을 수 있습니다.
00:03:24예를 들어 기능적 동작이 카드 추가라면 스크린샷은 보드에 카드가 추가된 것을 보여줍니다.
00:03:28이제 AI 에이전트가 해야 할 일은 그 스크린샷들을 보고 이 shad cn 컴포넌트들이 구현된 방식에 문제가 없는지 확인하는 것뿐입니다.
00:03:36이런 테스트 파일들은 새로운 것이 추가되거나 기능이 구축되는 동안 모든 동작 요구사항이 충족되도록 보장합니다.
00:03:42하지만 우리의 경우 스크린샷을 순수하게 UI 검증용으로만 사용하려고 합니다.
00:03:46하지만 TDD가 이미 있는데 왜 RALPH 루프가 필요할까요?
00:03:50제가 이미 말씀드렸듯이 더 큰 작업과 컨텍스트 윈도우가 거의 가득 차게 되면 이런 모델들이 갑자기 작업을 중단하고 지속적인 사람의 입력을 요구합니다.
00:03:58따라서 원하는 모든 유형의 함수에 대해 미리 테스트를 작성한 다음,
00:04:02루프를 사용해서 무엇을 해야 하는지 지시하면 자율적으로 작업할 수 있습니다.
00:04:06어떤 워크플로우를 따라야 하는지 알려주고,
00:04:08언제 프로미스를 출력할 수 있는지 조건을 제공하면 작업을 완료하고 루프를 종료합니다.
00:04:13이 경우엔 25개의 고유한 테스트를 모두 통과했을 때입니다.
00:04:16RALPH 슬래시 명령어를 사용해서 커맨드 팔레트 기능을 반복적으로 구축하도록 프롬프트를 제공했습니다.
00:04:22프롬프트에서는 기본적으로 몇 가지 기본 요구사항과 함께 기능을 구현하라고 말했습니다.
00:04:27요구사항은 테스트에서도 찾을 수 있기 때문에 실제로 중요하지 않지만, 전체 워크플로우는 명시했습니다.
00:04:32그 워크플로우에서는 테스트를 실행하는 것으로 시작하도록 되어 있었습니다.
00:04:36테스트가 실패할 것을 알고 있고, 그 후에는 테스트를 통과시키기 위해 컴포넌트를 구현해야 합니다.
00:04:42그게 전체 목표입니다.
00:04:43이제 이것이 훨씬 더 광범위한 작업이었다면 컨텍스트 윈도우가 가득 차거나 Claude가 혼란스러워질 때 자동으로 종료될 가능성이 높습니다.
00:04:51완료 프로미스를 절대 출력하지 않을 것이고,
00:04:53프로미스를 출력하지 않았기 때문에 프롬프트가 다시 입력되고 처음부터 다시 시작해야 합니다.
00:04:58즉 반복적으로 계속 작업할 것입니다.
00:05:00하지만 이건 작은 작업이었기 때문에 실제로 한 번에 모든 것을 구현하고 모든 컴포넌트를 작성하고 모든 테스트를 통과시킬 수 있었습니다.
00:05:07이제 테스트가 통과한 후 워크플로우는 커맨드 팔레트의 모든 스크린샷을 검토하라고 지시합니다.
00:05:13이것들은 UI가 shad cn이든 다른 컴포넌트 라이브러리든 올바르게 구현되었고 사소한 문제가 없는지 확인하기 위해 다양한 단계에서 찍은 스크린샷입니다.
00:05:21그 후에는 테스트를 다시 실행하고 UI 변경 후에도 여전히 통과하는지 확인해야 합니다.
00:05:26모든 테스트가 통과하고 스크린샷이 검토되었기 때문에 완료 프로미스를 출력했습니다.
00:05:30여기서 루프가 멈추고 다시 계속되지 않았습니다.
00:05:33하지만 여기에는 정말 큰 문제가 있었는데, 커맨드 팔레트 기능에서는 눈치채지 못했습니다.
00:05:38UI 오류가 발생할 가능성이 매우 적었기 때문입니다.
00:05:41하지만 보드 뷰 구현으로 넘어갔을 때 시스템에 큰 실수가 있다는 걸 깨달았습니다.
00:05:45같은 프롬프트로 보드 구현을 시작했습니다.
00:05:48요구사항은 물론 달랐지만 워크플로우는 거의 동일했습니다.
00:05:51한 번에 모든 요구사항을 완료했을 때 좀 놀랐습니다.
00:05:54오해하지 마세요, 실제로 모든 테스트가 통과하는지 확인하고 있었습니다.
00:05:57하지만 그러는 동안 성공한 테스트 수가 실제로 감소하는 경우가 있었습니다.
00:06:02무언가를 변경해서 다른 것이 망가졌기 때문입니다.
00:06:04이것이 바로 TDD가 정말 중요한 이유입니다.
00:06:07이런 재귀적 테스트와 모든 것이 작동하는지 확인하는 것 때문입니다.
00:06:10하지만 주요 문제는 완료됐다고 검증한 후 제가 UI를 확인했을 때 대부분은 올바르게 구현되었지만 이것과 같은 일부 UI 오류를 완전히 놓쳤다는 것입니다.
00:06:19스크린샷도 확인했는데 그 스크린샷에도 오류가 나타나고 있었습니다.
00:06:23그래서 물어봤고 실제로 무엇이 잘못됐는지 분석했습니다.
00:06:26진짜 문제는 프로세스 실패였습니다.
00:06:27특히 UI 수정 측면에서요.
00:06:29무슨 일이 있었냐면,
00:06:30테스트 파일을 반복해서 실행해야 했기 때문에 모든 테스트를 통과하긴 했지만,
00:06:34스크린샷 외에는 UI에 대한 특정 테스트가 없었습니다.
00:06:37몇 개만 훑어봤고 심지어 본 UI 오류 중 일부를 무시하기도 했습니다.
00:06:41일부 파일은 완전히 무시됐습니다.
00:06:43따라서 주요 문제는 프로미스 문구를 너무 일찍 출력하고 UI가 실제로 수정되었는지 검증하지 않았다는 것입니다.
00:06:49우리는 이를 어떻게 해결할 수 있을지 브레인스토밍 세션을 진행했고,
00:06:53심지어 레포의 프롬프트 작성 모범 사례를 Claude Code에 제공하기도 했습니다.
00:06:57하지만 결국 UI가 항상 올바르도록 보장할 몇 가지 특정 규칙과 프로세스 변경을 생각해냈습니다.
00:07:03이제 이건 테스트와는 아무 관련이 없습니다.
00:07:05테스트는 항상 실행될 것이기 때문입니다.
00:07:07커맨드 팔레트에 사용한 프롬프트는 기능이나 구현이 매우 클 때 정말 유용합니다.
00:07:12Claude가 작업을 완료했다고 환각을 일으키는 게 아니라 가득 찬 컨텍스트 윈도우나 작업의 복잡성 때문에 갑자기 종료하는 경우에요.
00:07:19Claude Code는 이미 정말 자율적입니다.
00:07:22의심의 여지가 없죠.
00:07:23하지만 여전히 이런 문제들을 해결해야 합니다.
00:07:25그래서 메인 프롬프트에서 여러 가지를 변경했습니다.
00:07:28첫 번째는 스크린샷 검증 프로토콜이었습니다.
00:07:31각 이미지에 간단한 접두사를 추가해서 Claude가 스크린샷을 읽었는지 아닌지 알려줬습니다.
00:07:36하지만 처음 구현했을 때 여전히 모든 이미지를 읽지 않았습니다.
00:07:39몇 개만 읽고 그 위에 verified를 쓴 다음 이전처럼 일찍 종료했습니다.
00:07:43그래서 이를 해결하기 위해 다른 방식으로 생각하도록 유도했습니다.
00:07:47모든 스크린샷 이름을 바꾼 후에는 아직 프로미스를 출력하지 말라고 했습니다.
00:07:51즉, 작업이 완료됐다고 간주하지 말고 다음 반복에서 완료를 확인하도록 하라는 것입니다.
00:07:56그래서 최소 두 번의 루프가 실행돼야 합니다.
00:07:59다음 검증에서는 Claude가 모든 파일에 verified 접두사가 있는지 확인합니다.
00:08:03물론 이는 테스트를 변경하고 이미지 검증을 기능 테스트와 분리해야 한다는 의미였습니다.
00:08:08다음 반복에서는 모든 이미지에 verified 결과가 있는지 확인하고,
00:08:12Claude가 놓친 게 있으면 다시 보고 출력을 수정합니다.
00:08:15이 변경으로 우리가 직면했던 사소한 UI 오류가 마침내 수정되었고 이 모든 기능을 올바르게 구현할 수 있었습니다.
00:08:22다음 루프에 진입했을 때 테스트를 다시 실행했습니다.
00:08:25몇 가지 오류를 발견했기 때문에 수정했고,
00:08:27모든 파일에 verified라는 단어가 있었기 때문에 최종 테스트를 실행했습니다.
00:08:31이번에는 두 번의 루프로 작업을 완료하고 앱의 모든 주요 UI 오류를 수정할 수 있었습니다.
00:08:36이제 Automata에 대해 이야기해봅시다.
00:08:39수백만 명에게 AI로 구축하는 방법을 가르친 후 우리는 이런 워크플로우를 직접 구현하기 시작했습니다.
00:08:44그 어느 때보다 빠르게 더 나은 제품을 만들 수 있다는 걸 발견했습니다.
00:08:48여러분의 아이디어를 실현시켜 드립니다.
00:08:51앱이든 웹사이트든 말이죠.
00:08:52아마 우리 영상을 보면서 '좋은 아이디어가 있는데 구축할 기술 팀이 없어'라고 생각하셨을 겁니다.
00:08:57바로 그게 우리가 개입하는 지점입니다.
00:08:59우리를 여러분의 기술 부조종사라고 생각하세요.
00:09:02우리는 수백만 명에게 가르쳤던 동일한 워크플로우를 여러분의 프로젝트에 직접 적용해서 개발팀을 고용하거나 관리하는 골칫거리 없이 컨셉을 실제 작동하는 솔루션으로 전환합니다.
00:09:11여러분의 아이디어를 현실로 가속화할 준비가 되셨나요?
00:09:14hello@automata.dev로 연락주세요.
00:09:17채널을 지원하고 이런 영상을 계속 만들 수 있도록 돕고 싶으시다면 아래 슈퍼 땡스 버튼을 사용하시면 됩니다.
00:09:23언제나처럼 시청해주셔서 감사드리고, 다음 영상에서 뵙겠습니다..