AI 도서관 · Claude · 단축 명령어 · 코딩
심각도 순으로 정리된 코드 리뷰
[/codereview] 코드 리뷰
아래 코드를 리뷰해줘.
형식
🔴 치명적 — 버그·보안 문제 (재현 조건까지)
🟡 개선 — 동작은 하지만 고치면 좋을 것
🟢 취향 — 무시해도 되는 것
각 항목에
• 해당 코드 인용
• 왜 문제인지
• 수정 코드
조건
• 개수를 채우려고 억지로 지적하지 말 것
• 🔴 이 없으면 없다고 명확히 말할 것
• 이 코드의 맥락(용도·규모)을 모르면 먼저 물어볼 것
코드:
{{INPUT}}
💡 "심각한 것만" 이라고 하지 마세요
최신 모델은 그 말을 곧이곧대로 따라서 실제로 덜 보고합니다.
전부 보고하게 하고, 무엇을 먼저 고칠지는 따로 거르는 쪽이 낫습니다.
위 형식이 🔴🟡🟢 으로 나눠 **전부** 받는 이유가 이것입니다.
"보수적으로 봐줘" "확실한 것만" 같은 표현도 같은 효과를 냅니다.
{{INPUT}} 자리에 내 내용을 넣어 쓰는 프롬프트입니다. 아래 버튼으로 열면 넣는 칸이 나옵니다.
언제 쓰나 · 코드를 합치거나 배포하기 전에 다른 눈으로 한 번 보고 싶을 때
// 가상의 예시입니다 — 쿠폰 적용 API
app.post('/coupon/apply', async (req, res) => {
const { userId, code } = req.body;
const rows = await db.query(
`SELECT * FROM coupons WHERE code = '${code}' AND used = 0`
);
if (!rows.length) return res.json({ ok: false });
const coupon = rows[0];
await db.query(`UPDATE coupons SET used = 1 WHERE id = ${coupon.id}`);
await db.query(
`INSERT INTO user_coupons (user_id, coupon_id) VALUES (${userId}, ${coupon.id})`
);
res.json({ ok: true, discount: coupon.discount });
});우리가 쓴 예시입니다. 실제 실행 결과가 아니고, 답변은 매번 조금씩 다릅니다.
먼저 확인할 것 — 이 API 가 로그인된 사용자만 호출할 수 있는 경로인가요?
아래 🔴 첫 항목이 그 답에 따라 달라집니다.
🔴 치명적
1. userId 를 요청 본문에서 그대로 받습니다
`const { userId, code } = req.body;`
호출하는 쪽이 userId 를 아무 값으로 보내면 남의 계정에 쿠폰이 적용됩니다.
재현 — 다른 사람의 userId 를 넣어 요청하면 그대로 처리됩니다.
수정 — 인증된 세션에서 사용자 id 를 가져올 것
2. 값을 문자열로 이어 붙여 질의를 만듭니다
`WHERE code = '${code}'`
code 에 따옴표가 섞이면 질의가 바뀝니다.
수정 — 파라미터 바인딩 사용
3. 조회와 UPDATE 사이에 틈이 있습니다
두 요청이 동시에 들어오면 같은 쿠폰이 두 번 사용됩니다.
재현 — 같은 코드로 동시에 두 번 호출
수정 — 조건부 UPDATE 후 영향 행 수를 확인하거나 트랜잭션·잠금 사용
🟡 개선
4. UPDATE 와 INSERT 가 한 트랜잭션이 아닙니다
INSERT 가 실패하면 쿠폰만 사용 처리된 채 남습니다.
🟢 취향
5. 실패 응답이 `{ ok: false }` 뿐이라 이유를 알 수 없습니다.
⚠️ 「🔴 이 없다」고 말할 상황이면 없다고 분명히 말해야 합니다.
개수를 채우려고 억지로 지적했다면 잘못 나온 것입니다.
⚠️ 「심각한 것만 알려줘」라고 요청하지 마세요. 실제로 덜 보고합니다.개수를 채우려고 억지로 지적하지 마. 🔴 이 없으면 없다고 말해줘. 각 항목에 해당 코드를 인용하고, 왜 문제인지와 수정안을 붙여줘. 🔴 에는 어떻게 재현되는지도 적어줘.