4
Codex 사용법 4강. Task Decomposition
Lesson 04

큰 요구사항은 그대로 맡기지 말고
검증 가능한 작은 task로 쪼개야 합니다.

이번 강의는 로그인 실패 시 에러 메시지가 사라지는 문제를 기준으로, 설명, 재현, 원인 파악, 국소 수정, 테스트 추가처럼 작은 task로 나누는 방법을 다룹니다.

기준 날짜 2026-04-13

이 가이드는 OpenAI Codex 제품, 정책, 표준 변경에 따라 이후 달라질 수 있습니다.

공통 예시 — 로그인 에러 메시지 사라지는 문제 (펼치기)
문제: 로그인 실패 시 에러 메시지가 화면에서 사라집니다.
범위: auth/LoginForm.tsx, auth/useLogin.ts, auth/LoginForm.test.tsx
제약: UI 문구 유지, API 스펙 유지, auth 범위 안에서만 수정, npm test -- auth로 검증합니다.
Why Large Tasks Fail

왜 큰 요구사항을 한 번에 맡기면 실패하기 쉬운가

  • 문제를 정확히 재현하기 전에 바로 구현으로 들어가게 됩니다.
  • 범위가 커지면서 auth 바깥까지 수정이 번질 수 있습니다.
  • 무엇이 해결됐고 무엇이 남았는지 확인하기 어렵습니다.
  • 테스트와 리뷰가 어느 단계에 필요한지 흐려집니다.
Bad Request

예를 들면 이런 요청입니다

로그인 경험 전반을 더 좋게 바꿔주세요.
에러 처리도 안정화하고 테스트도 보강해주세요.

이 요청은 범위, 순서, 완료 조건이 한 번에 섞여 있어 실패 원인을 추적하기 어렵습니다.

Decomposition Pattern

같은 문제를 이렇게 쪼개는 편이 낫습니다

1
현재 동작 설명 에러 상태가 어디서 만들어지고 사라지는지 먼저 설명합니다
2
재현 실패 케이스를 테스트로 재현하거나 재현 경로를 확인합니다
3
원인 파악 에러 state가 reset되는 지점이나 렌더링 조건을 좁혀갑니다
4
국소 수정 auth 범위 안에서만 수정하고 UI·API 스펙은 유지합니다
5
테스트 추가 LoginForm.test.tsx 보강 후 npm test -- auth 로 검증합니다
1. 현재 동작 설명로그인 실패 시 에러 상태가 어디에서 만들어지고 어디에서 사라지는지 설명합니다.
2. 재현실패 케이스를 테스트로 재현하거나 현재 재현 경로를 확인합니다.
3. 원인 파악에러 state가 reset되는 지점이나 렌더링 조건 문제를 좁혀갑니다.
4. 국소 수정auth 범위 안에서만 수정하고 UI 문구와 API 스펙은 유지합니다.
5. 테스트 추가auth/LoginForm.test.tsx를 보강하고 npm test -- auth로 검증합니다.
Bad Plan

나쁜 분해

  • 로그인 전체 리팩터링
  • 에러 UX 개선
  • 테스트 추가
  • 문서 정리

각 항목이 여전히 크고, 완료 기준도 불명확합니다.

Good Plan

좋은 분해

  • 현재 동작 설명
  • 실패 재현
  • 원인 파악
  • 국소 수정
  • 테스트 추가

각 단계마다 완료 조건이 있고, 중간에 멈춰도 리뷰와 재개가 쉽습니다.

Task Template

작은 task는 이 다섯 줄이면 충분합니다

목표: 로그인 실패 시 에러 메시지가 사라지는 문제를 수정합니다.
수정 범위: auth/LoginForm.tsx, auth/useLogin.ts
금지사항: UI 문구와 API 스펙은 유지하고 auth 바깥은 수정하지 않습니다.
검증 명령: npm test -- auth
완료 조건: 실패 시 메시지가 유지되고 관련 테스트가 통과합니다.
수정 전 코드

Task 3: 원인 파악 후 찾은 코드

auth/useLogin.ts — 버그 지점
const login = async (email: string, password: string) => {
  setError(null);      // ← 매번 에러 초기화
  setIsLoading(true);
  try {
    await authApi.login(email, password);
  } catch (err) {
    setError('로그인에 실패했습니다.');
  } finally {
    setIsLoading(false); // ← 로딩 끝나도 에러 유지 안됨
  }
};
수정 후 코드

Task 4: 국소 수정 결과

auth/useLogin.ts — 수정 후
const login = async (email: string, password: string) => {
  setIsLoading(true);  // ← 에러 초기화 제거
  try {
    setError(null);    // ← 성공 시에만 초기화
    await authApi.login(email, password);
  } catch (err) {
    setError('로그인에 실패했습니다.');
  } finally {
    setIsLoading(false);
  }
};
Workshop

실습

실습 1

“로그인 UX를 개선해달라”는 큰 요구사항을 4~5개 task로 다시 분해해보세요.

실습 2

그중 “국소 수정” task 하나를 실제 Codex 요청 형태로 작성해보세요.

References

공식 문서