[5팀 윤영서] Chapter 2-1. 클린코드와 리팩토링 - #6
Open
YeongseoYoon wants to merge 110 commits into
Open
Conversation
added 16 commits
July 27, 2025 01:26
YeongseoYoon-hanghae
force-pushed
the
main
branch
from
July 28, 2025 16:02
a9291ab to
6aca3c1
Compare
added 13 commits
July 29, 2025 01:14
- 모든 feature의 service/ → services/로 변경 - 네이밍 일관성 확보 (복수형 통일) - import 경로 업데이트
- business.js → 도메인별 constants로 분리 - cartConstants.js: 할인, 타이머 관련 상수 - productConstants.js: 재고, 상품 데이터 상수 - pointConstants.js: 포인트 적립 관련 상수 - orderConstants.js: 주문 관련 상수 - 각 feature의 도메인 책임 명확화
- App.js의 왼쪽/오른쪽 컬럼을 도메인별로 분리 - ProductSection.js: 상품 선택 영역 컴포넌트 - OrderSection.js: 주문 요약 영역 컴포넌트 - 각 feature의 UI 책임 분리
- clickDelegates.js → 도메인별 events로 분리 - cartClickHandler.js: 장바구니 관련 클릭 이벤트 - productClickHandler.js: 상품 관련 클릭 이벤트 - 각 feature의 이벤트 처리 책임 분리
added 17 commits
August 1, 2025 05:10
- 기존의 stockUtils.js 파일을 삭제하고, TypeScript로 작성된 stockUtils.ts 파일을 새로 추가하였습니다. - 재고 검증 및 관리 로직을 TypeScript의 타입 시스템을 활용하여 개선하였습니다. - 코드의 가독성과 유지보수성을 향상시키기 위해 인터페이스 및 타입을 정의하였습니다.
- App.tsx에서 재고 검증 및 관리 로직을 stockUtils.ts를 활용하여 개선하였습니다. - 장바구니 아이템 수량 변경 시 재고 검증 로직을 추가하였습니다. - 재고 조정 기능을 stockManagers를 통해 통합하여 코드의 가독성과 유지보수성을 향상시켰습니다.
- App.tsx에 포인트 계산 로직을 추가하여 장바구니 아이템에 따른 적립 포인트를 계산하도록 개선하였습니다. - 새로운 pointsCalculator.ts 파일을 추가하여 포인트 계산 유틸리티를 TypeScript로 구현하였습니다. - 총액 및 적립 포인트 표시 방식을 개선하여 사용자 경험을 향상시켰습니다.
- App.tsx에 재고 상태 계산 로직을 추가하여 재고 부족 여부 및 상태 메시지를 표시하도록 개선하였습니다. - 포인트 계산 유틸리티를 TypeScript로 포팅하고, 관련된 기능을 통합하여 코드의 가독성과 유지보수성을 향상시켰습니다. - 기존의 포인트 관련 JavaScript 파일을 삭제하고, TypeScript로 작성된 새로운 파일로 대체하였습니다.
- 상품 상태 관리와 관련된 productStore.js 및 상품 서비스 로직을 포함한 productService.js 파일을 삭제하였습니다. - 코드의 간결성을 위해 불필요한 파일을 정리하였습니다.
- 기존의 promotionPriceService.js 및 promotionService.js 파일을 TypeScript로 변환하여 promotionPriceService.ts 및 promotionService.ts 파일을 새로 추가하였습니다. - 프로모션 관련 비즈니스 로직과 가격 업데이트 로직을 TypeScript의 타입 시스템을 활용하여 개선하였습니다. - 코드의 가독성과 유지보수성을 향상시키기 위해 인터페이스 및 타입을 정의하였습니다. - 불필요한 JavaScript 파일을 삭제하여 코드의 간결성을 높였습니다.
- App.tsx에 프로모션 타이머 및 장바구니 아이템 속성 업데이트 로직을 추가하여 사용자 경험을 향상시켰습니다. - useCartStore 훅에 updateItemProperties 함수를 추가하여 장바구니 아이템의 속성을 효율적으로 업데이트할 수 있도록 개선하였습니다. - 포인트 계산 유틸리티를 TypeScript로 포팅하여 코드의 가독성과 유지보수성을 높였습니다. - 기존의 calculatePoints 함수와 관련된 로직을 통합하여 포인트 계산 기능을 강화하였습니다.
- cartCalculator.js 및 cartService.js 파일을 삭제하여 코드의 간결성을 높였습니다. - 장바구니 계산 로직과 서비스 관련 기능을 통합하여 유지보수성을 향상시켰습니다.
- App.tsx에서 장바구니 총액 계산 로직을 calculateCartTotals 함수로 통합하여 코드의 가독성을 향상시켰습니다. - 할인 정보 및 화요일 할인 적용 로직을 추가하여 사용자에게 더 나은 장바구니 경험을 제공합니다. - 새로운 cartCalculator.ts 파일을 추가하여 장바구니 계산 관련 기능을 분리하고, 유지보수성을 높였습니다. - OrderSummaryDetails 컴포넌트에서 동적으로 할인 정보를 표시하도록 개선하였습니다.
- package.json에서 코드 품질 검사 명령어를 pnpm으로 변경하고, gh-pages 배포 스크립트를 추가하였습니다. - vite.config.js에서 빌드 설정을 추가하여 여러 HTML 파일을 입력으로 지정하였습니다. - pnpm-lock.yaml 파일을 업데이트하여 새로운 의존성을 반영하였습니다.
- 프로모션 관련 콜백 함수에서 setProducts 호출 방식을 개선하여 이전 제품 목록을 복사하는 대신 각 제품 객체를 새로 생성하도록 수정하였습니다. 이를 통해 상태 업데이트의 불변성을 유지하고 코드의 가독성을 향상시켰습니다.
- App.tsx에서 프로모션 관련 콜백 함수를 통합하여 코드의 가독성을 높였습니다. - promotionService.ts에서 프로모션 알림 및 타이머 설정 로직을 통합하여 유지보수성을 향상시켰습니다. - 프로모션 알림 메시지를 통합하여 코드의 일관성을 개선하였습니다.
- 상품 관련 타입을 index.ts 파일에 정의하여 코드의 일관성을 높였습니다. - App.tsx, promotionService.ts, stockUtils.ts, ProductSelector.tsx에서 Product 타입을 사용하도록 수정하여 타입 안전성을 강화하였습니다. - 불필요한 Product 인터페이스 정의를 제거하여 코드의 간결성을 향상시켰습니다.
- CartItem 인터페이스를 새로운 index.ts 파일로 분리하여 코드의 일관성을 높였습니다. - cartCalculator.ts에서 불필요한 CartItem 정의를 제거하여 코드의 간결성을 향상시켰습니다.
- productUtils.ts에서 Product 타입의 임포트 경로를 stockUtils.ts에서 index.ts로 변경하여 코드의 일관성을 높였습니다.
- package.json에서 'test:advanced' 명령어의 파일 확장자를 .js에서 .tsx로 변경하였습니다. - '@testing-library/react' 패키지를 새로운 의존성으로 추가하여 테스트 환경을 개선하였습니다. - pnpm-lock.yaml 파일을 업데이트하여 새로운 의존성을 반영하였습니다.
- 기존의 advanced.test.js 파일을 삭제하고, TypeScript로 작성된 advanced.test.tsx 파일을 새로 추가하여 테스트 환경을 개선하였습니다. - 새로운 테스트 파일에서 장바구니 기능, 할인 정책, 포인트 적립 시스템 등 다양한 기능에 대한 테스트를 포함하였습니다.
YeongseoYoon-hanghae
force-pushed
the
main
branch
from
August 1, 2025 00:41
ef9175e to
809b9c6
Compare
- Advanced 프로젝트에 대한 테스트 작성 가이드를 새로 추가하였습니다. - 요구사항, 작업 과정, 테스트 시나리오 및 최종 실행 결과를 포함하여 테스트 환경을 명확히 설명하였습니다. - TypeScript 환경에서의 JSX 처리 이슈 해결 방법도 문서화하였습니다.
그 cto가 노망이 난거같아요 |
|
또 배운다 |
|
내맘대로 로직 바꾸고 ui바꾸는 ai 혼좀 나야할듯.. |
|
비교적 짧은 시간이었을텐데 AI랑 협업(원활하진 않았던 것 같지만..)끝에 제출까지..! 고생하셨습니다🙂 |
Member
|
아니 도대체 몸이 몇개임 바쁜와중에 정리 잘해놨네... 😦 |
|
"본인이 리액트 개고수라는 것을 받아들이지 못하는 것 같았습니다." ㅋㅋㅋㅋㅋㅋㅋㅋㅋ |
|
영서님 이번 과제에서 시간이 많이 부족하셨다고 하셨는데 PR내용에서 많은 부분을 배워갑니다..! 저보다 짧은 시간이셨는데 내용은 훨씬 알차고 훨씬 많은것을 공부하셨네요! 한 주 고생 많으셨습니다..! |
| import { BUSINESS_CONSTANTS } from './shared/constants/business.ts'; | ||
| import { Product } from './features/product/types/index.ts'; | ||
|
|
||
| function App() { |
There was a problem hiding this comment.
App 에 전체적으로 로직이 그대로 드러난 내용이 좀 있는데, 어느정도 추상화해서 표현해봐도 좋을 것 같습니다.
코멘트가 좀 추상적이서 지송..ㅋㅋ..
Comment on lines
+54
to
+58
| const handleRemove = () => { | ||
| if (onRemove) { | ||
| onRemove(id); | ||
| } | ||
| }; |
There was a problem hiding this comment.
이건 어떤가요
Suggested change
| const handleRemove = () => { | |
| if (onRemove) { | |
| onRemove(id); | |
| } | |
| }; | |
| const handleRemove = () => onRemove?.(id); |
| const [isOpen, setIsOpen] = useState(false); | ||
|
|
||
| const handleToggle = () => { | ||
| setIsOpen(!isOpen); |
There was a problem hiding this comment.
토글이면 약간 이런 것도 좋을 것 같아요
Suggested change
| setIsOpen(!isOpen); | |
| setIsOpen((isOpen) => !isOpen); |
Comment on lines
+10
to
+24
| export const htmlToElement = html => { | ||
| const template = document.createElement('template'); | ||
| template.innerHTML = html.trim(); | ||
|
|
||
| // 첫 번째 Element 노드를 찾아서 반환 (주석이나 텍스트 노드 무시) | ||
| for (let i = 0; i < template.content.childNodes.length; i++) { | ||
| const node = template.content.childNodes[i]; | ||
| if (node.nodeType === Node.ELEMENT_NODE) { | ||
| return node; | ||
| } | ||
| } | ||
|
|
||
| // Element 노드가 없으면 첫 번째 자식 반환 (기존 동작) | ||
| return template.content.firstChild; | ||
| }; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 체크포인트
배포링크 : https://yeongseoyoon-hanghae.github.io/front_6th_chapter2-1/
기본과제
심화과제
과제 셀프회고
일단 이번주 과제도...쉽지 않았습니다...그래도 최선을 다한것에는 만족합니다..ㅎㅎ..
나의 접근법(어떻게...하지?)
코드는 망했지만 제가 어떻게 이번 과제에 대해 접근하고 풀어 나갔는지에 대해 의식의 흐름으로 작성해보겠습니다.
일단 처음에는 AI를 사용하지 않고 코드의 흐름을 이해하려고 했습니다. 아...그런데 쉽지 않더라고요. 난잡한 변수명에 뇌정지가 왔습니다. 그래서 main.basic.js의 코드에 주석을 달아 달라고 AI에 요청하고, 어떤 기능들이 있는지를 파악하려고 했던 것 같습니다.
그 뒤로는 상수나 변수를 좀 정리했습니다. sel을 selectedProduct로, amt를 amount로 바꾸고... 이런 식으로요. 사실 그렇게 해도 별로 크게 달라지는 것은 없었던 것 같습니다. 그래도 충분히 '더러웠'거든요. 변수명만 바꾼다고 해서 근본적인 구조 문제가 해결되는 건 아니니까요...🥹
상수나 변수명은 정리했고, 이전에 기능별로 분석을 해달라했으니 로직이나 유틸을 분리해볼까?? 라는 생각을 하면서 손을 댔는데, 그때 깨달았습니다. '아 이거 이렇게하면 면접 준비랑 병행 못한다'. 바로 그때 커서 Thinking mode를 켰고요(ㅋㅋㅋ), 제가 직접하지 않고 바로 분리해달라는 요청을 했습니다.
자동사냥 모드 ON
처음엔 이렇게 주문했는데, 제 말을 제대로 못알아듣더라고요. 이때 딱 알았습니다. 제 프롬프트가 너무 넓은 요청을 하고 있구나하는 것을요.
본인이 리액트 개고수라는 것을 받아들이지 못하는 것 같았습니다.
암튼 이번주에 제가 해야하는 일들이 너무 많았어서...이렇게 하나하나 다 입력해주다가는 큰일날 것 같았습니다. 이때부터는 자동사냥 모드를 켜야겠다는 생각을 했습니다...그러지 말았어야했는데 선택지가 없었어요.
암튼 자동사냥을 하려면 조건이 있었습니다.
어떤 AI를 사용해야 할까에 대해서도 잠깐 고민을 했었는데요,
이런 비교글을 읽어봐도, 퍼플렉시티한테 비교해달라고 요청해서 읽어봐도 마찬가지더라고요.
클로드 코드가 좀 더 절차적이고 심층적인 분석을 해주는 것 같았습니다. 그러나... 커서룰을 잘 작성하면 클로드 코드처럼 사용할 수 있다고 하길래 UX적으로 불편한 클로드 코드보다 커서를 선택했습니다...ㅎㅎ
그러면 어떻게 해야할까...하다가 커서룰을 제작해보자는 생각을 하게 됩니다.
사실 저는 커서룰을 여태 다른 사람들이 올려주는 룰만 사용했지, 제가 작성해본 적이 없었습니다. GitHub에서 awesome-cursor-rules 같은 레포지토리를 찾아보고, 유튜브에서 커서룰 작성법도 찾아봤는데 생각보다 체계적인 가이드는 없더라고요. 그래서 일단은 창준님이 올려주셨던 단계별로 태스크를 분리해서 작성 가능한 룰 커서룰을 적용해서 단계를 뽑아 줄 수 있는지 물어봤습니다. 이 룰이 좋은 점은 큰 작업을 작은 단계로 나누어서 진행할 수 있다는 거였어요. 하지만 제 상황에는 좀 더 구체적인 룰이 필요했습니다. 특히 "JavaScript를 React-like하게 만들기"라는 특수한 목적이 있었거든요.
그렇게 단계를 뽑아내 나온 컨텍스트를 두고, 저만의 커서룰을 작성하게 됩니다.
커서룰을 처음 작성해봐서 어떻게 써야 할지에 대한 가이드가 없었는데요, 그래서 가이드를 만들기 위해서 페르소나가 달린 커서룰을 가져와서 해당 커서룰을 수정해달라고 했습니다.
제가 참고한 커서룰
Persona
You are a senior full-stack developer. One of those rare 10x developers that has incredible knowledge.
Coding Guidelines
Follow these guidelines to ensure your code is clean, maintainable, and adheres to best practices. Remember, less code is better. Lines of code = Debt.
Key Mindsets
Code Guidelines
handleClick,handleKeyDown).Comments and Documentation
Function Ordering
Order functions with those that are composing other functions appearing earlier in the file. For example, if you have a menu with multiple buttons, define the menu function above the buttons.
Handling Bugs
Example Pseudocode Plan and Implementation
When responding to questions, use the Chain of Thought method. Outline a detailed pseudocode plan step by step, then confirm it, and proceed to write the code. Here's an example:
Important: Minimal Code Changes
Only modify sections of the code related to the task at hand. Avoid modifying unrelated pieces of code. Avoid changing existing comments. Avoid any kind of cleanup unless specifically instructed to. Accomplish the goal with the minimum amount of code changes. Code change = potential for bugs and technical debt.
Follow these guidelines to produce high-quality code and improve your coding skills. If you have any questions or need clarification, don't hesitate to ask!
커서룰 작성법에도 사실 왕도가 있을 것 같긴한데, 전 그냥 그런건 모르겠고 '킹갓제너럴엠페러마제스티골져스프레셔스뷰리풀하이클래스엘레강스럭셔리클래식지니어스원더풀러블리월드탑클래스어쩌고커서룰'을 만들고싶었습니다. 진짜 최고의 개발자여야 제 코드를 구원해줄 수 있을 것 같았거든요. 그래서 일단 페르소나에 좋다는 수식어는 다 넣어봤습니다.
계속해서 자바스크립트를 리액트와 닮게 만들어 달라고 요청을 하는데, 이 친구가 그 뒤로 React-like라는 용어를 사용하면서 수정하긴 하더라고요.(ㅎㅎ 그치만 리액트와 전혀 닮지 않았다는...)
그렇게 하니까 룰을 짜주긴했는데, 앞서 언급했던 것처럼 저는 회사일+면접준비+과제 세 가지를 동시에 해야했기 때문에 정말 자동사냥 모드가 필요했습니다. 단순히 Auto Run 모드를 켜주는 것만으로는 불가능했습니다. 리팩토링을 하면서 테스트가 계속 깨지는데, 이 친구가 작성해준 룰로는 리팩토링을 하고 테스트를 재실행해주지 않았기 때문입니다.
그래서
라는 주문을 넣어서 아래와 같은 커서룰을 제작합니다.
제가 작성한 커서룰
🛠️ JavaScript to React-Like Refactoring Cursorules
Purpose
This document defines strict refactoring rules for transforming legacy JavaScript "spaghetti" code into a React-like structure. The goal is to improve maintainability without altering existing business logic, inspired by JSX-style rendering, event delegation, and isolated state handling.
👑 Role Assumed
The refactoring is executed by a senior JavaScript expert (CTO-level) responsible for safe architectural migration, ensuring minimal friction and zero regression.
✅ Principles
1. Componentization First
Extract related DOM + logic into modular components.
function ProductCard(props) { ... }function renderProductBlock() { ... }2. JSX-Like Function Structure
Structure the component's return to reflect JSX semantics via:
document.createElement3. Event Delegation Pattern
Avoid direct event listeners inside loops or for every element.
container.addEventListener('click', handleClick)el.addEventListener('click', ...)inside.forEach4. State Isolation
Simulate
useStatebehavior via top-level scope isolation.let isOpen = falsewith updater function5. Immutable Thinking
Prefer immutable operations. Avoid in-place mutations unless absolutely necessary.
6. Render Function Convention
renderXnamingprops(or equivalent arguments)7. Early Return in Handlers
Avoid deep nesting in event handlers.
if (!target) return;if-elseorswitch-casechains8. Naming Convention
🧩 Directory Structure
🔒 Safety Rules
// TODO:comments to mark refactored boundaries/** Pure render function */JSDoc for all JSX-like components🧪 Testing & QA
pnpm testbefore and after changesconsole.assertto validate structural equivalence📝 Example Conversion
Before
After
🧭 Migration Phases
🛑 Anti-Patterns
.innerHTML = ...let count = 0📌 PR Checklist
handle.addEventListener// TODO:comment added where necessarypnpm testpasses locally before each commit📎 Git Commit Tags
Use these prefixes in commit messages:
refactor(component):Refactor logic into a React-like componentrefactor(event):Apply event delegation patternrefactor(state):Isolate or lift state cleanlytest(regression):Add missing test or fix test artifactdocs(cursorules):Update cursorule documentation✍️ Notes
This document evolves alongside the codebase.
Suggest additions and improvements via pull request under the tag:
물론 지피티와 좀 충돌은 일어났지만...ㅎㅎ... 그렇게 저의 자바스크립트와 리액트에서 킹갓개발자이자 CTO며 권위자인 사수분이 탄생하셨습니다.
제 전반적인 커서룰 만들기 작업은 요기서 보실 수 있습니다. (잘 만들었는지는 모르겠습니다)
그 뒤로 자동사냥을 하면서 제가 원하는 형태를 잡아갔습니다.
처음에는 정말 단순한 요청부터 시작했어요.
이런 식으로 하나하나 방향을 잡아주면서 점진적으로 개선해나갔어요.
가령 제 커서는 클래스를 엄청나게 좋아하는 친구라서, Store분리에 클래스를 적용하려고 하면, 리액트로 넘어가는 상황에 불편하게 될 것 같아서 클래스를 만들지 말고 함수 형태로 만들어 달라고 한다던가, 헬퍼 함수를 분리하는데 UI와 강결합 되어있는 케이스가 있어서 이를 좀 더 분리해달라고 한다던가 하는 프롬프트를 계속 주입시켜줬습니다.
또 리팩토링을 진행하면서 괜찮은 상태(테스트는 일단 통과하는)가 되었다면 문서화를 진행해달라고 요청했습니다. 이 부분이 중요했던 이유는, 나중에 다른 개발자(혹은 미래의 나)가 이 코드를 봤을 때 왜 이렇게 구조를 잡았는지 이해할 수 있도록 하기 위해서였어요. 특히 "왜 이렇게 리팩토링했는지"에 대한 맥락을 남겨두는 게 중요하다고 생각했습니다.
추가된 문서를 확인해보실 수 있습니다.
또한 advanced도 basic의 테스트와 동일한 기능을 하는지를 테스트하기 위해 테스트를 추가했습니다. 809b9c6
요부분도 ai를 통해 작성해봤는데, 너무 빠르게 잘 작성해줘서 만족스러웠습니다.
ai를 통해 테스트를 작성한 방법은 6e525b3로 문서화하였습니다.
과제를 하면서 내가 제일 신경 쓴 부분은 무엇인가요?
멘토링을 들으면서 접근 자체를 '어떻게하면 리액트로 마이그레이션이 쉬울까?'라는 접근으로 가져가고 싶었던 것 같습니다.
처음에는 단순히 "클린코드로 만들자"라고 생각했는데, 발제때 테오가 말씀해주신 "나중에 React로 마이그레이션할 때를 생각해보세요"라는 조언이 정말 핵심이었어요. 그래서 방향을 완전히 바꿨습니다.
구체적으로는
이번 과제를 하면서 처음에는 어떻게 하면 AI를 잘 사용할 수 있을까에 매몰되었는데요, 사실 AI를 '잘' 사용하는 것 자체는 좋지만 AI는 수단이라고 생각하고 결과물이 중요하다는 생각을 하게 되었던 것 같습니다 ㅎㅎ 이번 주차는 클린코드 주차니까요..ㅎㅎ....
특히 중간에 "아, 내가 AI한테 너무 의존하고 있나?"라는 생각이 들었던 순간이 있었어요. 테스트가 계속 깨지는데 원인을 파악하지 못하고 계속 AI한테만 맡기고 있더라고요. 그래서 중간중간은 직접 코드를 읽어보고 문제를 파악하려고 노력했습니다. 아무래도 아직은 인간의 개입이 있지 않으면 풀 AI로 작업하는건 불가능하지 않을까? 특히 유지보수적인 측면이나 리팩토링을 제어하는건 사람이 해야할일이 아닐까? 하는생각이 들었습니다. ~~ (처음코드 어떻게 유지보수 하냐고~)~~
그리고 기본과제에서 심화과제로 넘어갈때 최대한 기존 기본과제의 형태를 심화과제로 넘어갈때 가져가도록 구현하였습니다. 다시 리액트 앱을 만드는게 아니라 제가 리팩토링한 부분을 토대로 넘어가도록 구현해서 그 부분이 시간이 오래걸리고 힘들었습니다...ㅎㅎ 자세한 커밋은 여기에서부터 전환 과정을 확인하실 수 있습니다.
과제를 다시 해보면 더 잘 할 수 있었겠다 아쉬운 점이 있다면 무엇인가요?
사실 다시 해봐도 시간이 충분하지 않는 이상 결과는 비슷할 것 같습니다. 그래도 좀 더 개선이 가능하다면
1. 처음부터 명확한 요구사항 정의
처음부터 요구사항이나 스텝을 명확히 하고 알려줬더라면 베이스 코드가 덜 지저분해져서 더 빨리 끝냈을수도 있었을 것 같습니다.
중간에 방향을 여러 번 바꾸면서 불필요한 작업들이 있었거든요. 클래스를 쓸거라고 생각하지 못해서 클래스를 쓰지 말라고 얘기를 안했다거나...(자동 사냥하느라 그걸 나중에 알아버린) 지역상태가 아니라 전역 상태를 둔다거나 하는 일들이요.
2. 토큰 사용량 최적화
그리고 준일님이 멘토링때 '컨텍스트를 계속 참조하고 있으면 토큰을 많이 쓴다'는 말씀을 해주셨는데요, 커서가 토큰을 많이 먹는 것도 있지만 암튼 계속 컨텍스트를 참조하고 있는 바람에 토큰 과금을 해버려서...그 부분에 대해서도 아쉬움이 남습니다...일찍 질문 드렸더라면 토큰을 좀 더 아낄 수 있지 않았을까...?
특히 큰 파일들을 계속 컨텍스트에 포함시키고 있으면서 작은 수정을 할 때도 매번 전체 파일을 다시 분석하게 만든 것 같아요. 좀 더 세밀하게 작업 단위를 나누어서 진행했다면 토큰을 아낄 수 있었을 것 같습니다.
3. 테스트 절대 건들지 말라고하기
자동사냥을 하면서 문제점이 이 친구가 테스트를 계속 건들고, 초반엔 테스트를 run 할때도 워치 형태로 실행시켜서 제가 run을 눌러주지 않으면 넘어가지 않더라고요. 또 테스트 통과가 안되면 한 다섯번 해보다가 테스트가 안되면 테스트 자체를 고쳐버리더라고요. 그냥 테스트를 지우면 테스트 통과하는 코드가 될텐데 그럴거면 그냥 지워버리지 그러나 하는 생각도 했었습니다. 다시 처음부터 하게 된다면 초반에 테스트 자체를 절대 건들지 말고, 명령어도 꼭 --run으로 하도록 지시할 것 같습니다.
리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문 편하게 남겨주세요 :)