☰ 분류

남의 코드 읽고 이해하는 프롬프트

처음 보는 코드가 무엇을 하는지 설명받습니다. 줄마다 해설하는 대신 전체 흐름부터 잡고 중요한 부분만 파고듭니다.

분류개발 › 코딩
태그분석개발자코드
프롬프트 (영어 본문 · 답은 한국어로 옵니다)
Help me understand this code.

Order:
1. ***What the whole thing does, in three lines.*** **Start here.**
2. Entry point and flow of execution — where it starts and where it goes
3. What each major part does. **In blocks, not line by line**
4. What it depends on — external libraries, config, other modules
5. ***What is needed to understand it and is not visible here*** — which files I should read next
6. Why it was written this way, where you can infer it (**mark inference as inference**)
7. Where to be careful when changing it

Rules:
- Pitch it at my level given below.
- ***Do not invent behavior that is not in the code.*** Where unsure, mark it "needs checking".
붙여 넣으면 맨 아래에 채울 칸(내수준 · 환경 · 코드)이 나옵니다

어떤 프롬프트인가

줄마다 해설하는 설명은 이 코드가 무엇을 위한 것인지 말해주지 않는다. 이 프롬프트는 전체가 하는 일 세 줄에서 시작해 진입점과 실행 흐름을 잡고, 덩어리 단위로 역할을 설명한다. 이해에 필요한데 이 파일에 없는 것이 무엇인지, 추측인 부분이 어디인지도 표시한다.

모델 비교

ChatGPT가 코드 특유의 가격·구독 함정까지 가장 정확히 짚었다. Gemini도 충실하지만 장황하고 일부 표현이 과하며, [C]는 미제출이다.

ChatGPT종합 1위
46/ 50

+ 코드 근거와 추론을 구분하고 반응성 함정을 짚었다.

- 예시 코드가 많아 조금 길고 일부 확인 대상이 추상적이다.

Gemini
39/ 50

+ Java 개발자 관점의 비유와 위험 설명이 구체적이다.

- 다소 장황하며 구독·직접 변경 설명이 지나치게 단정적이다.

기준ChatGPTGemini앞선 모델
지시 준수109ChatGPT +11%
정확성97ChatGPT +29%
구체성109ChatGPT +11%
구성·가독성98ChatGPT +13%
분량 적정성86ChatGPT +33%

gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-24). 측정값이 아니라 AI 심사 결과입니다.

답 전문 보기

같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.

넣은 입력
내수준: 백엔드 3년차(Java/Spring 위주), React는 이번 프로젝트에서 처음 접함

환경: React 18 + TypeScript, Vite, 상태관리는 Zustand, 스타일은 Tailwind

코드: import { create } from 'zustand';

interface CartItem {
  productId: string;
  quantity: number;
  price: number;
}

interface CartState {
  items: CartItem[];
  addItem: (item: CartItem) => void;
  removeItem: (productId: string) => void;
  totalPrice: () => number;
}

export const useCartStore = create<CartState>((set, get) => ({
  items: [],
  addItem: (item) => set((state) => {
    const existing = state.items.find((i) => i.productId === item.productId);
    if (existing) {
      return {
        items: state.items.map((i) =>
          i.productId === item.productId
            ? { ...i, quantity: i.quantity + item.quantity }
            : i
        ),
      };
    }
    return { items: [...state.items, item] };
  }),
  removeItem: (productId) =>
    set((state) => ({ items: state.items.filter((i) => i.productId !== productId) })),
  totalPrice: () => get().items.reduce((sum, i) => sum + i.price * i.quantity, 0),
}));
gpt-5.6-luna (codex CLI · 에이전트 하네스) · 실행일 2026-09-24

1. 전체 동작 — 세 줄

이 코드는 Zustand로 장바구니 상태를 전역 관리하는 스토어를 만든다.
상품 추가 시 같은 productId가 있으면 수량을 합치고, 없으면 새 항목을 추가한다.
상품 삭제와 전체 금액 계산 기능도 제공한다.

2. 진입점과 실행 흐름

이 파일 자체의 진입점은 다음 export입니다.

export const useCartStore = create<CartState>(...)

컴포넌트에서 이 스토어를 import하고 호출하면서 사용합니다.

const items = useCartStore((state) => state.items);
const addItem = useCartStore((state) => state.addItem);

흐름은 다음과 같습니다.

  1. 모듈이 import되면 create가 스토어를 생성합니다.
  2. 초기 상태는 items: []입니다.
  3. 컴포넌트가 useCartStore(selector)를 호출해 상태나 함수를 구독합니다.
  4. addItem, removeItem이 호출되면 set이 상태를 갱신합니다.
  5. 해당 상태를 구독 중인 React 컴포넌트가 다시 렌더링됩니다.
  6. totalPrice()가 호출되면 현재 items를 기준으로 금액을 계산합니다.

3. 주요 부분별 역할

타입 정의

interface CartItem
interface CartState

장바구니 항목과 스토어의 형태를 정의합니다.

CartItem은 다음 데이터를 가집니다.

  • productId: 상품 식별자
  • quantity: 수량
  • price: 단가

CartState는 장바구니 목록과 세 가지 동작을 정의합니다.

스토어 생성

create<CartState>((set, get) => ({
  ...
}))

Zustand 스토어를 생성합니다.

  • set: 상태를 변경할 때 사용
  • get: 현재 상태를 읽을 때 사용

<CartState> 때문에 스토어의 상태와 함수가 타입 검사를 받습니다.

상품 추가

addItem: (item) => set((state) => {
  const existing = state.items.find(...)
  ...
})

먼저 같은 productId를 가진 상품이 있는지 찾습니다.

이미 있으면:

items: state.items.map(...)

기존 배열을 직접 수정하지 않고 새 배열을 만들면서 해당 상품의 quantity만 증가시킵니다.

없으면:

items: [...state.items, item]

기존 항목을 유지한 채 새 상품을 배열 뒤에 추가합니다.

상품 삭제

removeItem: (productId) =>
  set((state) => ({
    items: state.items.filter(...)
  }))

전달받은 productId와 다른 항목만 남깁니다. 즉, 해당 상품을 장바구니에서 완전히 제거합니다.

전체 금액 계산

totalPrice: () =>
  get().items.reduce(
    (sum, i) => sum + i.price * i.quantity,
    0
  )

현재 장바구니의 각 항목에 대해 다음을 더합니다.

price × quantity

장바구니가 비어 있으면 0을 반환합니다.

4. 의존성

코드에서 직접 보이는 외부 의존성은 다음 하나입니다.

import { create } from 'zustand';
  • zustand: 전역 상태 저장소 생성
  • React 컴포넌트에서 useCartStore를 호출할 수 있도록 함

프로젝트 환경인 React 18, TypeScript, Vite와 함께 사용되지만 이 코드 자체에서 React나 Vite를 직접 import하지는 않습니다.

Tailwind도 이 파일의 상태 로직에는 관여하지 않습니다.

추가로 필요한 설정이나 미들웨어가 있는지는 package.json, Zustand 설정 파일을 확인해야 합니다. 현재 코드만으로는 별도 미들웨어 사용 여부는 알 수 없습니다.

5. 다음에 읽어야 할 파일

이 코드의 실제 사용 방식은 이 파일만으로 완전히 알 수 없습니다. 다음 순서로 찾으면 됩니다.

  1. package.json
    • Zustand 버전
    • React/TypeScript 설정
  2. useCartStore를 import하는 파일
    • 상품 추가 버튼이 어디서 호출되는지
    • 삭제와 금액 표시 방식
  3. CartItem을 생성하는 상품 목록 또는 상세 컴포넌트
    • price와 quantity가 어디서 오는지
  4. 상품 API 또는 타입 파일
    • productId, 가격의 타입과 의미
  5. main.tsx, App.tsx 또는 라우팅 설정
    • 어떤 화면에서 스토어가 사용되는지
  6. 테스트 파일
    • 중복 상품, 수량 변경, 가격 처리에 대한 기대 동작

프로젝트에서 다음 검색을 하면 사용처를 찾을 수 있습니다.

rg "useCartStore|addItem|removeItem|totalPrice" src

6. 왜 이렇게 작성했는가

다음은 코드에서 직접 확인되는 사실과 그로부터의 추론을 구분해야 합니다.

  • items를 직접 수정하지 않고 map, filter, 전개 연산자로 새 배열을 만듭니다.
    • 이는 React/Zustand에서 상태 변경을 감지하기 쉽도록 작성한 것으로 보입니다. (추론)
  • 같은 상품을 여러 줄로 저장하지 않고 productId 기준으로 수량을 합칩니다.
    • 장바구니에서 상품별로 한 항목만 유지하려는 의도로 보입니다. (추론)
  • totalPrice를 상태에 저장하지 않고 호출 시 계산합니다.
    • items와 합계가 서로 어긋나는 문제를 피하려는 설계로 보입니다. (추론)
  • totalPrice는 값이 아니라 함수입니다.
    • 호출 시점의 items를 읽기 위해 이렇게 작성한 것으로 보입니다. (추론)

다만 다음은 코드만으로 의도를 확정할 수 없습니다.

  • 가격이 상품 추가 시점의 가격인지, 항상 최신 가격이어야 하는지 — needs checking
  • 음수 수량을 허용하는지 — needs checking
  • quantity === 0일 때 삭제할지 — needs checking
  • 같은 상품을 다른 가격으로 추가할 수 있는지 — needs checking

7. 변경 시 주의할 점

  • state.items를 직접 push, splice로 수정하지 않는 것이 안전합니다. 현재처럼 새 배열을 반환해야 합니다.
  • 같은 상품을 추가할 때 기존 항목의 price는 유지됩니다. 새로 전달된 item.price로 갱신되지 않습니다.
    • 가격 변경을 허용해야 한다면 별도 정책이 필요합니다. needs checking
  • removeItem은 수량을 하나 줄이는 것이 아니라 상품 전체를 제거합니다.
  • quantity가 음수이면 합계가 잘못 계산될 수 있습니다. 입력 검증은 이 코드에 없습니다.
  • price가 원 단위 정수인지, 소수점 금액인지 확인해야 합니다. 소수점 금액을 JavaScript number로 계산할 때 금액 오차가 생길 수 있습니다.
  • totalPrice를 컴포넌트에서 호출할 때는 보통 다음처럼 사용합니다.
const totalPrice = useCartStore((state) => state.totalPrice);

const price = totalPrice();

totalPrice 자체를 구독하는 것과 그 함수가 읽는 items의 변경을 구독하는 것은 별개의 문제일 수 있으므로, 실제 사용 방식은 확인이 필요합니다.

같은 분류의 프롬프트

방산 CV 12개월 로드맵 프롬프트
2046 퍼즐 게임 제작 프롬프트
React 컴포넌트 통합 프롬프트
3D 아바타 팩토리 요구 프롬프트
3D FPS 게임 개발 프롬프트