- 1빈칸 채우기
- 2복사하기
- 3AI에 붙여넣고 결과 받기
다른 예시로 채워보기
💡 더 잘 쓰는 팁
- 코드가 길면 바뀐 부분과 그 함수 전체만 넣으세요. 파일 통째로 넣으면 중요한 지적이 묻힙니다.
- "확인 필요"라고 나온 함수는 이어서 보여주면 그 부분까지 같이 봐줍니다.
0자빈칸 0 채움붙여넣고 엔터만 누르면 돼요
ChatGPT·Claude 버튼은 완성된 프롬프트를 그 서비스 주소에 담아 새 창으로 열어요.
써 보니 어땠나요? 업무에 실제로 썼는지가 다음 프롬프트를 고르는 가장 큰 기준이 돼요
고마워요! 남겨 주신 반응은 이름 없이 숫자로만 모아요.
CClaude의 실제 답변기본값으로 받은 답변 · 사실 검수함
1. 꼭 고쳐야 할 것
① SQL 인젝션 (4번째 줄, 보안)
f-string으로 값을 SQL에 직접 붙이고 있습니다. status에 x' OR '1'='1 같은 값이 들어오면 조건이 무력화돼 다른 회원의 주문까지 조회됩니다.
② 주문이 0건이면 에러 (9번째 줄, 버그)
rows가 비어 있으면 total / len(rows)가 0으로 나누기가 되어 ZeroDivisionError가 납니다. 주문 없는 회원이 조회하면 바로 터집니다.
2. 고치면 좋은 것
- 연결을 닫지 않습니다. 호출이 많아지면 연결이 쌓일 수 있습니다. (get_conn이 연결 풀을 쓰는지 확인 필요)
- SELECT * 대신 필요한 칼럼만 고르면 응답이 가벼워집니다.
- r["amount"]는 커서가 행을 딕셔너리로 돌려줄 때만 동작합니다. (get_conn 설정 확인 필요)
3. 고친 코드
def get_orders(user_id, status):
conn = get_conn()
try:
cur = conn.cursor()
# 값은 SQL에 붙이지 않고 매개변수로 넘김 (인젝션 방지)
cur.execute(
"SELECT * FROM orders WHERE user_id = %s AND status = %s",
(user_id, status),
)
rows = cur.fetchall()
finally:
conn.close() # 에러가 나도 연결을 닫음
total = sum(r["amount"] for r in rows)
avg = total / len(rows) if rows else 0 # 주문 0건이면 0
return {"orders": rows, "avg": avg}
※ 매개변수 표시가 %s인지 ?인지는 DB 드라이버에 따라 다릅니다. (확인 필요)
4. 추가할 테스트
- 주문이 0건인 회원 → avg가 0이고 에러가 나지 않는지
- status에 ' OR '1'='1 를 넣었을 때 다른 회원 주문이 나오지 않는지
- 주문 3건(1,000 / 2,000 / 3,000원) → avg가 2,000인지