강의를 들으며 장바구니 페이지에 대해 Cypress로 테스트 코드를 작성하다가 궁금한 점이 몇가지 있어서 질문을 작성합니다 :) 장바구니 페이지에서 '장바구니의 상품을 삭제한 후 장바구니에 담겨있는 총 수량과 가격이 변경된다.'라고 테스트 시나리오를 작성했는데 이런 걸 e2e로 테스트 하는 게 맞는지 잘 모르겠습니다. 이런 부분은 unit 테스트로 넘겨야 하는 부분일까요? e2e테스트는 어떤 걸 중심으로 하면 좋을지 잘 모르겠습니다. 그냥 제가 필요하다고 생각되는 게 있으면 진행을 하면 되는 걸까요? 저도 모르게 저 대신 클릭 등을 수행하고 값을 확인하는 용도로 다루게 되는 것 같습니다. 그래도 일단 1번 질문에서 작성한 테스트 시나리오에 대한 코드를 직접 작성해봤습니다. 이 때, 장바구니 페이지에서 장바구니 아이템 데이터가 getServerSideProps를 통해 주입되고 있더라구요. 이 상황에서 API 모킹을 어떻게 해야할지 몰라서 Claude Sonnet 4.6이랑 구글링을 통해 몇가지 코드를 작성해봤습니다. 단순하게 테스트 코드가 작성되지 않고 다소 복잡하게 작성이 되는 것 같아서 뭔가 이 방향이 맞지 않는 것 같다는 생각이 들었습니다. 그래서 테스트 시나리오 자체를 제가 잘못 생각한 것 같다는 생각이 들기도 했습니다. SSR 환경에서 어떤 코드로 작성을 하는 게 맞는 방식인지 알 수가 없어서 한 번 확인해봐주시면 감사하겠습니다 :) a. nock + intercept 사용 - SSR은 서버 프로세스에서 진행되기 때문에 intercept 할 수 없다고 하여 nock을 사용했습니다. 코드는 해당 링크 를 참고 했습니다. - 그리고 router.replace를 통해 데이터를 refetch 될 때도 백엔드 api를 intercept를 할 수 없다고 해서 '/_next/data/**/*.json'를 intercept 했습니다. - 개인적으로 아래 코드는 'nock'과 'intercept'를 혼용해서 쓰다보니 장기적으로 봤을 때 유지보수성 측면에서 좋지 않은 코드라고 느꼈습니다. it.only('장바구니의 상품을 삭제한 후 총 수량과 가격이 변경된다', () => { // 1) 초기 로드용 nock (SSR - 서버사이드 fetch) cy.task('nock', { hostname: Cypress.env('API_URL'), method: 'GET', path: '/carts', statusCode: 200, body: FIVE_CART_ITEMS, }); // 2) router.replace 후 재조회용 intercept (클라이언트사이드 fetch) cy.intercept('GET', '/_next/data/**/cart.json', { body: { pageProps: { carts: FOUR_CART_ITEMS_AFTER_DELETE }, __N_SSP: true, }, }).as('refetch'); // 삭제 API mock cy.intercept('POST', '/api/cart', { statusCode: 200, body: { data: { name: '4' } }, }).as('deleteCart'); cy.visit('/cart'); // action cy.getByCy('cart-item-delete-button').first().click(); cy.wait('@deleteCart'); cy.wait('@refetch'); // 페이지 갱신 대기 // assertion cy.contains('Unbranded Rubber Chair').should('not.exist'); cy.getByCy('cart-item').should('have.length', 4); cy.getByCy('cart-item-total-amount').should('have.text', '4'); cy.getByCy('cart-item-total-price').should('have.text', '836.00'); }); b. intercept 사용 그래서 초기 로드에도 intercept를 사용했습니다. it.only('장바구니의 상품을 삭제한 후 총 수량과 가격이 변경된다', () => { // 1) 초기 로드용 (SSR - 서버사이드 fetch) cy.intercept('GET', '/_next/data/**/*.json', { body: { pageProps: { carts: FIVE_CART_ITEMS }, __N_SSP: true, }, }); // 2) router.replace 후 재조회용 intercept (클라이언트사이드 fetch) cy.intercept('GET', '/_next/data/**/*.json', { body: { pageProps: { carts: FOUR_CART_ITEMS_AFTER_DELETE }, __N_SSP: true, }, }).as('refetch'); // 삭제 API mock cy.intercept('POST', '/api/cart', { statusCode: 200, body: { data: { name: '4' } }, }).as('deleteCart'); cy.visit('/cart'); // action cy.getByCy('cart-item-delete-button').first().click(); cy.wait('@deleteCart'); cy.wait('@refetch'); // 페이지 갱신 대기 // assertion cy.contains('Unbranded Rubber Chair').should('not.exist'); cy.getByCy('cart-item').should('have.length', 4); cy.getByCy('cart-item-total-amount').should('have.text', '4'); cy.getByCy('cart-item-total-price').should('have.text', '836.00'); }); c. API 모킹을 사용하지 않기 - ssr 환경에서 delete 테스트를 위해 api 모킹을 사용하는 게 오히려 복잡하게 느껴져서 API 모킹을 사용하지 않고 코드를 작성하는 방식을 생각했습니다. - 대신에 테스트 할 때마다 수량과 가격이 변경될 거라고 생각해서 수량과 가격을 캡쳐하는 코드를 추가했습니다. it.only('장바구니의 상품을 추가한 뒤 삭제하면 해당 상품이 사라진다', () => { const cartItem = { "id": "24", "name": "Practical Frozen Pants", "price": "607.00", "imageUrl": "https://cdn.pixabay.com/user/2023/05/21/19-38-51-804_250x250.jpg" } // prepare: API로 상품 직접 추가 cy.request('POST', `${Cypress.env('API_URL')}/carts`, cartItem).then(({ body }) => { cy.visit('/cart'); // 삭제 전 수량과 가격 캡처 cy.getByCy('cart-item-total-amount').invoke('text').then((beforeAmount) => { cy.getByCy('cart-item-total-price').invoke('text').then((beforePrice) => { // action: 방금 추가한 항목 삭제 cy.contains('Practical Frozen Pants') .closest('[data-cy="cart-item"]') .find('[data-cy="cart-item-delete-button"]') .click(); // assertion cy.contains('Practical Frozen Pants').should('not.exist'); cy.getByCy('cart-item-total-amount').should('have.text', String(Number(beforeAmount) - 1)); cy.getByCy('cart-item-total-price').should('have.text', (Number(beforePrice) - cartItem.price).toFixed(2)); }); }); }); }); 일반적으로 delete에 대해 테스트할 때 어떤 식으로 하는지 궁금합니다. 삭제 성공 여부 / 해당 데이터가 보이지 않는지 체크 정도만 하고 삭제가 진행됨으로써 총 아이템 개수 수량이 변경되는 것에 대해서는 테스트 코드로 굳이 짚고 넘어가지 않나요? 실무에서 테스트 데이터는 보통 어떻게 관리하나요? 전부 api 모킹으로 테스트 해야하는 건지, 아니면 테스트용 DB를 따로 생성해서 거기서 테스트를 진행해야하는 건지 궁금합니다. 아니면 상황에 따라서 api 모킹을 해야할 때가 있고, DB를 연결해서 테스트 해야할 때가 있나요? 한번에 질문이 다소 많아서 죄송합니다 ㅠㅠ 완강하고 며칠동안 혼자서 공부해보다가 제대로 제가 하고 있는 건지 모르겠어서 여쭤봅니다 ㅠㅠ 긴 글 읽어주셔서 감사합니다!!
노션을 처음 사용해봅니다. DB 연결에서 노션이 나오는데 영상과 실제 노션 앱과 화면이 다르게 나오고 화면대로 하려니 다른거 같습니다. 예) invoice-web 페이지를 생성하고 invoice DB 전체 item DB 이렇게 두개를 생성 하는데 연결에 가니 invoice-web이 화면과 달리 보이지 않습니다. 다른 LLM 툴에 물어보니 웹페이지를 만들어서 연결하는게 아니라 DB를 만들고 그 아래에 invoice DB와 item DB를 만들어야 한다는데 현재 이부분에서 더이상 진도가 나가지 못하고 있습니다.
현재 1-5 듣고 있었습니다. lovable, replit이 심할정도로 무료 credit을 많이 잡아먹네요.. 그러니까 지금 가이드라인 주신 질문 한번하면 약 70%정도의 코인이 소모되고, 추가 질문시 upgrade하라고 끊겨버립니다. 실제 강의는 좋지만.. 무료로 한번 시도해보기가 쉽지않아 보입니다.
분명히 노션 세팅 잘 했고 연결까지 했는데 데이터베이스 조회 안 되는 분들은 참고해주세요. 강의 영상 촬영 날짜가 아마도 2025년 09월 이전으로 생각 됩니다. 그 이후에 노션 API 버전이 바뀌면서 데이터베이스 조회가 안 되는게 원인입니다. [ 노션 API 업그레이드 가이드 ] https://developers.notion.com/guides/get-started/upgrade-guide-2025-09-03 해결 방법은 2가지인데 API를 구버전을 쓰도록 프롬프트를 유도하거나, 신규 API 버전에 맞춰서 해야 하는데 신규 버전은 "데이터베이스 ID"가 아닌 "데이터베이스 소스 ID"를 필요로 합니다. [ 구버전 프롬프트 ] 노션 api를 "2022-06-28" 버전으로 사용하고 관련 코드 전부 수정해줘. [ 최신 버전 해결 방법 ] 데이터베이스를 열면 위 사진처럼 보일텐데 새로 만들기 왼쪽에 설정 누르면 밑에서 3번째에 데이터 소스 관리 있습니다. 소스 관리에서 위 사진처럼 데이터 소스 ID 복사하시고 그 값을 env에 넣으시면 됩니다.
38강의 4:40초 쯤에, clear 또는 compact, 아님 이미 생성된 파일들을 간략하고 명확하게 정리할 수 있다고 하셨는데, 이 영상에서 알려주신 clear나 compact는 파일을 간략하게 정리하는 명령어는 아니지 않나요? 그냥 클로드 코드와 대화한 내용을 간략하게 정리하는 거 아닌가요? 파일은 어떻게 간략하게 할 수 있다는건지 알려주세요!
(AI 퀀트) 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
💡 수강생 안내 사항 (커뮤니티 가이드) 학습 관련 질문 : 구체적으로 적을수록 정확한 답변을 받을 수 있습니다. 작성 팁 : 마크다운과 단축키를 활용하면 글을 더 편리하게 작성할 수 있습니다. 사전 검색 : 질문을 남기기 전, 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해 보세요. 커뮤니티 매너 : 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요. 서비스 문의 : 인프런 서비스 관련 문의는 1:1 문의하기 를 이용해 주세요. 어떻게 해결해야할까요
WSL 환경에서 수강하시는 분들, tasks.json 파일에 내용이 기록이 안 되면 아래 문제로 보여집니다 https://github.com/cjo4m06/mcp-shrimp-task-manager/issues/61#issuecomment-3240079086 해결법은 딱히 없고 그냥 클로드한테 수동으로 내용 채워달라고 하는게 현재로서는 쓸만해보입니다.
그냥 바로 /init 하는 것 vs. 프로젝트 분석 프롬프트 요청하기 -> /init 이 프로젝트가 어떤 프로젝트인지 전체적으로 분석해줘. 프로젝트의 목적, 주요 기능, 사용된 기술, 파일 구조를 자세히 설명해줘. 바로 /init 하는 것과 프롬프트로 요청 후에 /init 하는것에 차이가 있나요? 후자가 더 효과가 좋은건지 궁금합니다.
skill 은 클로드가 프롬프트 문맥을 파악하여 자동으로 실행 시킨다는 내용을 여기에서도 보았고 다른 여러 영상 에서도 보았습니다. 그런데 정말로 자동으로 실행되는게 맞는지 문의 드립니다. 자동으로 실행 된다는 것은 프롬프트를 클로드가 확인 해서 알아서 필요한 스킬을 실행 시킨다는 의미 일텐데요. 제가 작업 하면서 스킬이 실제로 자동으로 알아서 실행되는 것을 거의 본 적이 없습니다. 프롬프트에서 꼭 스킬을 지정 해줘야지만 실행이 되었습니다. 웃기는 것은 작업을 중지 시키고, 이러한 프롬프트 에서는 XX 스킬을 사용 해야 하는 것이 아니냐고 물어보면.. '나의 실수 이다. 사용 했어야 한다. 할말이 없다' 라는 대답을 합니다. 그러고선 또 스킬을 사용해야 할 상황에서는 사용을 하지 않습니다. 그래서 프롬프트의 절반이 욕 입니다. 다른 커뮤니티 에서도 저 처럼 자동으로 실행 되는 경우가 없어서 스킬을 지정을 해서 사용 한다는 것을 봐서 저만 그런 것은 아닌 것 같습니다. 제가 뭔가 설정을 안한 건가요? 혹자는 스킬 작성 시 description 작성을 잘 해야 한다고 하던데, 그게 만일 기술 이라면 그것을 배워야 겠습니다만..그런 것을 알려주는 곳은 없는 것 같고요.. 컨텍스트 소모량만 뺸다면 커스텀커맨드랑 별반 차이 없는 상황 이라..참..애매 하네요.. 스킬을 자동 실행 되게끔 하려면 어떤 방법이 있는 걸까요?
해당 1번 내용에서요 실무적으로 적용을 해본다면 prd generator로 최초 prd 생성 > development-planner로 로드맵 구현! 해당 로드맵으로 만족스러우면 진행 이 과정으로 이해했는데 이 문항대로면 로드맵 구현 후 PRD에 로드앱을 업데이트 한다는것인데 어떻게 해야할지 모르겠네요 아마 영상 속에 있을것 같은데 관련 내용이 어디에 있는지 알려주실 수 있을까요>? 두번째 질문입니다. 사이트 리뉴얼에 대한 계획을 짜다 보니 욕심이 생겨 Plan mode에서 PRD-generator 에이전트를 써놓고 계속 계획 수정을 하고 있습니다 반복해서 하다보니 5시간 리미트까지 걸릴 정도로 계획만 계속 수정 중인데요 설사 그렇더라도 짐코딩님 말씀처럼 마음에 들 때까지 계획을 계속 조금씩 수정하는 것은 옳은 방식일까요? 아니면 지금 이 행동이 투머치인것이 아닌가 궁금합니다
(AI 퀀트) 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
💡 수강생 안내 사항 (커뮤니티 가이드) 학습 관련 질문 : 구체적으로 적을수록 정확한 답변을 받을 수 있습니다. 작성 팁 : 마크다운과 단축키를 활용하면 글을 더 편리하게 작성할 수 있습니다. 사전 검색 : 질문을 남기기 전, 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해 보세요. 커뮤니티 매너 : 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요. 서비스 문의 : 인프런 서비스 관련 문의는 1:1 문의하기 를 이용해 주세요. 정말 못찾겠습니다.
클로드 코드내에서 Bash(pwd) 가 오류가 발생합니다. ~/.claude/settings.json 과 프로젝트 내 settings.local.json을 모두 비워진 상태로 다시 calude 실행 후 해도 동일한 증상입니다. 어떤 이유때문인지 알수있을까요? gitbash, CMD, PowerShell 에서 모두 동작하지 않습니다. 터미널 자체에서는 정상적으로 pwd 명령어가 입력됩니다.