Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AI 코딩 에이전트 더 똑똑하게 쓰기

AI 코딩 에이전트 더 똑똑하게 쓰기

* 제목: AI 코딩 에이전트 더 똑똑하게 쓰기
* 일시: 2025년 4월 23일
* 2025년 4월 구름 Commit(https://tech.goorm.io/2504_commit/)

nacyot

May 02, 2025
Tweet

More Decks by nacyot

Other Decks in Technology

Transcript

  1. Daegwon Nacyot Kim • @nacyotkim • 44BITS 팟캐스트, 블로그 •

    2018 - 2023 당근마켓, SRE 팀 리더 • 2025 - 당근마켓
  2. 데드락 • 5년 이상 방치된 오래된 코드, 컨텍스트 없음 •

    너무 오래된 node 버전, Node.js 11로 작성 • AWS Lambda 기반으로 동작해서, 코드를 실행이 어려움 • Node.js 버전은 deprecated. 의존성 문제로 배포 불가능 • 실행해보려면 인터페이스부터 뜯어고쳐야함
  3. "저는 '바이브 코딩'이라고 부르는 새로운 종류의 코딩을 하고 있어요. 완전히

    분위기에 몸을 맡기고, 기하급수적 발전을 받아들이며, 코드가 존재한다는 사실조차 잊어버리는 방식이죠. 이게 가능한 이유는 LLM(예: Cursor Composer와 Sonnet)이 너무 좋아지고 있기 때문입니다. 게다가 저는 SuperWhisper로 Composer와 대화하기 때문에 키보드를 거의 만질 필요도 없어요. 제가 너무 게을러서 코드를 찾기 싫을 때는 '사이드바의 패딩을 반으로 줄여줘'와 같은 가장 바보 같은 요청들을 합니다. 항상 '모두 수락'을 누르고, 더 이상 차이점을 읽지도 않아요. 오류 메시지가 나타나면 아무 설명 없이 그냥 복사해서 붙여넣기만 하는데, 보통 그러면 해결됩니다. 코드는 제가 일반적으로 이해할 수 있는 범위를 넘어 성장하기 때문에, 정말로 이해하려면 한참 동안 읽어봐야 할 거예요. 때로는 LLM이 버그를 수정하지 못해서 그냥 우회하거나 버그가 사라질 때까지 무작위 변경을 요청합니다. 주말에 한번 만들어보는 프로젝트에는 크게 나쁘지 않지만, 꽤 재미있기는 해요. 프로젝트나 웹앱을 만들고 있지만, 실제로 코딩이라고 할 수는 없어요 - 그냥 보고, 말하고, 실행하고, 복사-붙여넣기를 하니까 대체로 잘 작동하네요." ‒ Andrej Karpathy https://x.com/karpathy/status/1886192184808149383
  4. "저는 '바이브 코딩'이라고 부르는 새로운 종류의 코딩을 하고 있어요. 완전히

    분위기에 몸을 맡기고, 기하급수적 발전을 받아들이며, 코드가 존재한다는 사실조차 잊어버리는 방식이죠. 이게 가능한 이유는 LLM(예: Cursor Composer와 Sonnet)이 너무 좋아지고 있기 때문입니다. 게다가 저는 SuperWhisper로 Composer와 대화하기 때문에 키보드를 거의 만질 필요도 없어요. 제가 너무 게을러서 코드를 찾기 싫을 때는 '사이드바의 패딩을 반으로 줄여줘'와 같은 가장 바보 같은 요청들을 합니다. 항상 '모두 수락'을 누르고, 더 이상 차이점을 읽지도 않아요. 오류 메시지가 나타나면 아무 설명 없이 그냥 복사해서 붙여넣기만 하는데, 보통 그러면 해결됩니다. 코드는 제가 일반적으로 이해할 수 있는 범위를 넘어 성장하기 때문에, 정말로 이해하려면 한참 동안 읽어봐야 할 거예요. 때로는 LLM이 버그를 수정하지 못해서 그냥 우회하거나 버그가 사라질 때까지 무작위 변경을 요청합니다. 주말에 한번 만들어보는 프로젝트에는 크게 나쁘지 않지만, 꽤 재미있기는 해요. 프로젝트나 웹앱을 만들고 있지만, 실제로 코딩이라고 할 수는 없어요 - 그냥 보고, 말하고, 실행하고, 복사-붙여넣기를 하니까 대체로 잘 작동하네요." ‒ Andrej Karpathy https://x.com/karpathy/status/1886192184808149383
  5. "저는 '바이브 코딩'이라고 부르는 새로운 종류의 코딩을 하고 있어요. 완전히

    분위기에 몸을 맡기고, 기하급수적 발전을 받아들이며, 코드가 존재한다는 사실조차 잊어버리는 방식이죠. 이게 가능한 이유는 LLM(예: Cursor Composer와 Sonnet)이 너무 좋아지고 있기 때문입니다. 게다가 저는 SuperWhisper로 Composer와 대화하기 때문에 키보드를 거의 만질 필요도 없어요. 제가 너무 게을러서 코드를 찾기 싫을 때는 '사이드바의 패딩을 반으로 줄여줘'와 같은 가장 바보 같은 요청들을 합니다. 항상 '모두 수락'을 누르고, 더 이상 차이점을 읽지도 않아요. 오류 메시지가 나타나면 아무 설명 없이 그냥 복사해서 붙여넣기만 하는데, 보통 그러면 해결됩니다. 코드는 제가 일반적으로 이해할 수 있는 범위를 넘어 성장하기 때문에, 정말로 이해하려면 한참 동안 읽어봐야 할 거예요. 때로는 LLM이 버그를 수정하지 못해서 그냥 우회하거나 버그가 사라질 때까지 무작위 변경을 요청합니다. 주말에 한번 만들어보는 프로젝트에는 크게 나쁘지 않지만, 꽤 재미있기는 해요. 프로젝트나 웹앱을 만들고 있지만, 실제로 코딩이라고 할 수는 없어요 - 그냥 보고, 말하고, 실행하고, 복사-붙여넣기를 하니까 대체로 잘 작동하네요." ‒ Andrej Karpathy https://x.com/karpathy/status/1886192184808149383
  6. 코딩 에이전트 모델의 조건 • 코드 편집을 위한 포맷팅 능력

    • 문제 해결을 위한 에이전틱한 동작 가능 • 도구 사용 가능 - 에디터, 터미널
  7. Vibe Coding Using LLMs for code responsibly LLM이 작성한 코드를

    검토하지 않고 LLM으로 소프트웨어를 구축하는 것
  8. “Using LLMs for code responsibly is not vibe coding” Not

    all AI-assisted programming is vibe coding (but vibe coding rocks)
  9. 1. 그런데 왜 Cursor가 아닌가요? 2. 모델은 어떤 걸 선택해야하나요?

    3. 프롬프트는 어떻게 써야하나요? 4. 내 에이전트는 왜 알아서 동작하지 않나요? 5. YOLO 모드 쓰면 알아서 하는 거 아닌가요? 5가지 질문 혹은 배움
  10. 하나의 세션이 길어진다는 의미 • 모든 대화를 전달 = 컨텍스트

    윈도우가 커진다 • 대화가 길어지면, Input 비용이 빠르게 증가함 • 특히, 코딩 에이전트는 ◦ 파일 목록, 파일 내용, 문서, 컨텍스트, 수정사항 등 모든 내용을 전달 ◦ (Cursor의) 컨텍스트 윈도우 관리 전략은 비공개
  11. Poor Example “랜딩 페이지에 다크 테마를 만들고, 오른쪽 상단에 토글

    기능 만들어줘.” 어디 랜딩 페이지? 어떤 다크 테마? 오른쪽 상단?
  12. 프롬프트 예제 현재 번역 상태는 TranslationChunk 모델의 정보를 @/app/jobs/fetch_fulltext_job.rb 에서

    업데이트하면서 관리하고 있어. 이러한 TranslationChunk의 상태를 종합적으로 판단해서 Fulltext 모델에서 텍스트에 속한 모든 Chunk의 번역 상태를 판단하는 메서드를 만들어줘. 특히 청크 없음, 번역중(청크중 하나라도 processing), 번역 완료(모든 청크 complete, 번역 실패 (청크중 하나라도 실패 상태인 경우)를 알 수 있어야해. 현재 Admin/Bookmarks#index에서도 번역 상태를 보여주는데, 이 새로운 메서드를 사용해서 번역 상태를 보여주는 방식으로 변경해줘. 특히 청크가 없거나 실패한 상태에서만 번역 버튼을 활성화해야해.
  13. 프롬프트 예제: 설정보다 관례 현재 번역 상태는 TranslationChunk 모델의 정보를

    @/app/jobs/fetch_fulltext_job.rb 에서 업데이트하면서 관리하고 있어. 이러한 TranslationChunk의 상태를 종합적으로 판단해서 Fulltext 모델에서 텍스트에 속한 모든 Chunk의 번역 상태를 판단하는 메서드를 만들어줘. 특히 청크 없음, 번역중 (청크중 하나라도 processing), 번역 완료(모든 청크 complete, 번역 실패(청크중 하나라도 실패 상태인 경우)를 알 수 있어야해. 현재 Admin/Bookmarks#index에서도 번역 상태를 보여주는데, 이 새로운 메서드를 사용해서 번역 상태를 보여주는 방식으로 변경해줘. 특히 청크가 없거나 실패한 상태에서만 번역 버튼을 활성화해야해.
  14. . ├── app │ ├── assets │ ├── channels │

    ├── controllers │ ├── helpers │ ├── javascript │ ├── jobs │ ├── mailers │ ├── models │ ├── services │ └── views ├── bin ├── config ├── db ├── lib ├── log ├── public ├── script ├── spec ├── storage ├── tmp └── vendor Convention over Configuration 설정보다 관례
  15. 프롬프트 예제: 설정보다 관례 현재 번역 상태는 TranslationChunk 모델의 정보를

    @/app/jobs/fetch_fulltext_job.rb 에서 업데이트하면서 관리하고 있어. 이러한 TranslationChunk의 상태를 종합적으로 판단해서 Fulltext 모델에서 텍스트에 속한 모든 Chunk의 번역 상태를 판단하는 메서드를 만들어줘. 특히 청크 없음, 번역중(청크중 하나라도 processing), 번역 완료(모든 청크 complete, 번역 실패 (청크중 하나라도 실패 상태인 경우)를 알 수 있어야해. 현재 Admin/Bookmarks#index에서도 번역 상태를 보여주는데, 이 새로운 메서드를 사용해서 번역 상태를 보여주는 방식으로 변경해줘. 특히 청크가 없거나 실패한 상태에서만 번역 버튼을 활성화해야해.
  16. Goal & Non Goal ## 해결해야하는 문제(Goal) <<TASK_DEFINITION>> ## 지금

    해결할 문제가 아님(Non Goal) - 코드 리팩터링 작업 - 프로젝트 관련 설정이나 구조 변경
  17. 사전 작업 - 다음 문서들을 반드시 읽을 것 - .memory-bank/activeContext.md

    - .memory-bank/cheatsheet-test.md - 마지막 커밋 이후에 변경사항이 있는지 Git으로 확인할 것 - rspec을 실행해서 깨지는 테스트가 있는지 확인할 것 - 깨지는 테스트가 있으면 작업 중지. 강조 사항 - 작업에 대한 설명은 간결하게만 해줘. - 문제는 최대한 단순하게 접근하고, 최대한 쉽게 해결할 것 - 테스트 먼저 구현하고 코드 구현 - 코드 작성 이후 반드시 테스트 실행해서 문제 확인할 것 - 파일 읽기에 실패하면, 해당 파일을 만들지 말고 검색해볼 것. 그래도 없으면 중지. - 개발 서버 실행하지 말 것. 브라우저 도구는 명시적인 요청시에만 사용.
  18. • 왕도는 없지만, 기본에 충실 • 작업 내용은 최대한 자세히

    작성 ◦ 너무 추상적이지 않은, 적절한 작업 단위로 작성 ◦ 예상되는 부작용과 영향 범위에 대해서도 전달 • Goal과 Non Goal을 정의 • Snipetty 등 스니펫 앱이나 확장 사용 • 사용자 프롬프트로 작성할지 고민 필요 ◦ 강조 사항, 사전 작업 등 프롬프트 정리
  19. 사전 작업 - 다음 문서들을 반드시 읽을 것 - .memory-bank/activeContext.md

    - .memory-bank/cheatsheet-test.md - 마지막 커밋 이후에 변경사항이 있는지 Git으로 확인할 것 - rspec을 실행해서 깨지는 테스트가 있는지 확인할 것 - 깨지는 테스트가 있으면 작업 중지. 강조 사항 - 작업에 대한 설명은 간결하게만 해줘. - 문제는 최대한 단순하게 접근하고, 최대한 쉽게 해결할 것 - 테스트 먼저 구현하고 코드 구현 - 코드 작성 이후 반드시 테스트 실행해서 문제 확인할 것 - 파일 읽기에 실패하면, 만들지 말고 검색해볼 것. 그래도 없으면 중지. - 개발 서버 실행하지 말 것. 브라우저 도구는 명시적인 요청시에만 사용.
  20. 사전 작업 - 다음 문서들을 반드시 읽을 것 - .memory-bank/activeContext.md

    - .memory-bank/cheatsheet-test.md - 마지막 커밋 이후에 변경사항이 있는지 Git으로 확인할 것 - rspec을 실행해서 깨지는 테스트가 있는지 확인할 것 - 깨지는 테스트가 있으면 작업 중지. 강조 사항 - 작업에 대한 설명은 간결하게만 해줘. - 문제는 최대한 단순하게 접근하고, 최대한 쉽게 해결할 것 - 테스트 먼저 구현하고 코드 구현 - 코드 작성 이후 반드시 테스트 실행해서 문제 확인할 것 - 파일 읽기에 실패하면, 만들지 말고 검색해볼 것. 그래도 없으면 중지. - 개발 서버 실행하지 말 것. 브라우저 도구는 명시적인 요청시에만 사용.
  21. 사전 작업 - 다음 문서들을 반드시 읽을 것 - .memory-bank/activeContext.md

    - .memory-bank/cheatsheet-test.md - 마지막 커밋 이후에 변경사항이 있는지 Git으로 확인할 것 - rspec을 실행해서 깨지는 테스트가 있는지 확인할 것 - 깨지는 테스트가 있으면 작업 중지.
  22. cheatsheet-test.md#1 ## 공통 - rspec을 사용중. - 테스트 위치는 /spec,

    팩토리 파일은 /spec/factories - 테스트 팩토리 파일은 단수를 사용함(예: User 팩토리 = uesr.rb) - 작업 전에 테스트 설정 파일을 미리 확인할 것.
  23. cheatsheet-test.md#2 ## 테스트 실패 시 디버깅 전략 - 기본 원칙

    - 디버깅 시에는 라우트나 Rails 설정 파일을 함부로 수정하지 말 것(좋은 디버깅 접근이 아님) - rspec/Rails 설정이 문제일 가능성은 크지 않음. 기존의 팩토리나 테스트를 확인 - 테스트 실행 중 모델 객체의 내용이 예상과 다르다면 모델의 콜백을 염두해두어야함. - 한 번에 하나씩 - 테스트 작성 후 직접 실행하고 실패하는 테스트는 하나씩 성공시키자. - 변경 사항과 에러메시지를 집중적으로 분석 후 테스트 실행 - 다수가 실패하는 경우엔 카테고리화하되, 한꺼번에 해결하지 말 것. - 하나 해결하고, 다시 테스트하는 방식으로.
  24. 프롬프트와 컨텍스트 개입 • 사용자 프롬프트 진입점 ◦ 그 때

    그 때 동적으로 변경하기 좋음 • 시스템 프롬프트 사전 정의 ◦ .cursor/rules, .clinerules, 메모리 뱅크 등 • MCP를 통한 피드백 ◦ 작업 중간에 추가적인 컨텍스트 제공 • 코멘트 ◦ 파일에 대한 컨텍스트를 동적으로 제공
  25. 컨텍스트 개입 • 적용할 규칙이 많다고 좋은 건 아님 ◦

    기본 컨테스트 윈도우가 커짐, Input 토큰 소모 ◦ 규칙이 많아지면, 무시하는 경우도 많아짐 ◦ 꼭 필요한 최소한만 Active하게 유지(적용 범위, 규칙 수) • 모든 내용을 지키지는 않음 ◦ 파일 읽기나 규칙이 무시되는 경우가 많음 ◦ 모델에 따라서 동작이 일관적이지 않음
  26. Cline, Roo Code 버그 명령어 종료 지점을 구분 못하는 경우

    oh-my-zsh 환경 https://github.com/cline/cline/wiki/Troubleshooting-%E2%80%90-Shell-Integration-Unavailable
  27. 시스템 테스트 • 브라우저 자동화를 통한 테스트 ◦ 피드백 환경

    구축이 어려움 • 피드백 개선 전략 ◦ console.log나 네트워크 호출 로그를 터미널로 전달 ▪ Playwright를 사용해서 구현 가능 ◦ 테스트 실패한 스크린샷을 전달하는 방법 ▪ 에이전트 작업 중간에 이미지를 Input으로 넣기가 어려움 ▪ Claude Code에서는 MCP의 이미지 반환 결과를 사용 가능
  28. https://x.com/miyatti/status/1909979519735431183 그러고 보니 오늘 Cursor 사용하던 중에 갑자기 종료 돼서

    뭐지? 했는데 혼자서 자폭 중이라 쫄음 ㅋㅋㅋ Cursor 에이전트 자유로운 영혼 ㅋㅋㅋ 에, 뭐한 거야? 4초간 생각 죄송합니다. Cursor를 강제 종료하는 명령어를 실행했습니다. 이건 적절하지 않았습니다.
  29. Dev Container 구축 • 설정 파일 ◦ .devcontainer/devcontainer.json ◦ dockerfile.dev

    ◦ docker-compose.yml • 처음 셋업하는 게 어려움 • 프로젝트 별로 셋업하기 번거로움 • Cursor에서 일부 플러그인이 실행시 설치 안 되는 버그 ◦ github.copilot 등
  30. Dev Container 구축 • 설정 파일 ◦ .devcontainer/devcontainer.json ◦ dockerfile.dev

    ◦ docker-compose.yml • 처음 셋업하는 게 어려움 • 프로젝트 별로 셋업하기 번거로움 • Cursor에서 일부 플러그인이 실행시 설치 안 되는 버그 ◦ github.copilot 등 🤖
  31. 1. 그런데 왜 Cursor가 아닌가요? 2. 모델은 어떤 걸 선택해야하나요?

    3. 프롬프트는 어떻게 써야하나요? 4. 내 에이전트는 왜 알아서 동작하지 않나요? 5. YOLO 모드 쓰면 알아서 하는 거 아닌가요? 5가지 질문 혹은 배움
  32. 코딩 에이전트 모델 • Model • Messages 에디터 • 도구

    실행 환경 • 개발 환경 ◦ Dev Container MCP • 도구 확장 에이전트 • 인터페이스 • 시스템 프롬프트 ◦ 도구 정의 • 컨텍스트 윈도우 관리 사용자 • 컨텍스트 윈도우 활용 • 피드백 루프 ◦ 개발 환경 ◦ 테스트 • 프롬프트 개선 • 컨텍스트 관리 ◦ 문서 ◦ .cursor/rules
  33. 코딩 에이전트 모델 • Model • Messages 에디터 • 도구

    실행 환경 • 개발 환경 ◦ Dev Container MCP • 도구 확장 에이전트 • 인터페이스 • 시스템 프롬프트 ◦ 도구 정의 • 컨텍스트 윈도우 관리 사용자 • 컨텍스트 윈도우 활용 • 피드백 루프 ◦ 개발 환경 ◦ 테스트 • 프롬프트 개선 • 컨텍스트 관리 ◦ 문서 ◦ .cursor/rules 두뇌 작업 환경
  34. 지금은 가능성의 경계를 실험하는 단계 • 큰 프로젝트에서도 도입 가능한지?

    • 특정 언어에서도 사용가능한지? • 팀 프로젝트에 도입 가능한지? • 돈을 쓰면서 실험해야함 • 실험과 경험에 따라서 완전히 다른 인식
  35. “AI Will Be Writing 90% of Code in 3 to

    6 Months.” Dario Amodei Anthropic CEO
  36. Similarly, once the physical act of coding can be automated,

    the meaning of “programming” will change to refer to the act of arranging ideas into executable programs. Mehran Sahami, the chair of Stanford’s CS department, put it simply: “Computer science is about systematic thinking, not writing code.” – Chip Huyen, the author of the new book AI Engineering https://www.oreilly.com/radar/the-end-of-programming-as-we-know-it/
  37. “AI Will Be Writing 90% of Code in 3 to

    6 Months.” Dario Amodei Anthropic CEO