docs: 실전 티켓 풀 20개 전부 구체화 — mirim-app 실코드 기준
- 20개 패턴 각각에 '🎯 우리 건' 블록 추가: 대상 파일 경로, 현재 상태(검증된 사실),
구체적 할 일, 티켓 간 연계(FE-01↔FE-04, DZ-01↔FE-05 등)
- 전 항목을 실제 코드로 검증 후 작성: '불러오는 중' 9곳 하드코딩(grep),
hero compact 7페이지 복붙, ProblemSummary에 attempts 부재, SubmitRequest 길이 제한 부재,
ControllerAdvice 부재, SubmissionService·CourseProgressService 테스트 0개,
README 최근 기능 미반영, DocViewer notFound 잠재 결함(감사 기각 건 활용) 등
- 이미 구현돼 있던 후보(과제 빈 상태, 퀴즈 성적 API)는 검증 과정에서 다른 실존 대상으로 교체
- 현황판 20행 제목·구체화 체크 채움, 헤더를 '구체화 완료 · 배정 대기'로 갱신
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
57a334545a
commit
2c8bbf3574
@ -119,6 +119,9 @@
|
|||||||
footer { margin-top: 46px; padding-top: 22px; border-top: 1px solid var(--line); color: var(--ink-faint); font-size: 13px; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
|
footer { margin-top: 46px; padding-top: 22px; border-top: 1px solid var(--line); color: var(--ink-faint); font-size: 13px; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
|
||||||
@media (max-width:560px){ .tk-body .row { grid-template-columns: 70px 1fr; gap: 8px; } }
|
@media (max-width:560px){ .tk-body .row { grid-template-columns: 70px 1fr; gap: 8px; } }
|
||||||
@media print { body{background:#fff;} .card,header.mast,.ticket,.cat-badge{box-shadow:none;} .ticket{break-inside:avoid;} td .fill{border-color:#999;} }
|
@media print { body{background:#fff;} .card,header.mast,.ticket,.cat-badge{box-shadow:none;} .ticket{break-inside:avoid;} td .fill{border-color:#999;} }
|
||||||
|
|
||||||
|
.row.target { background: var(--primary-soft); border-radius: 10px; padding: 9px 11px; margin-top: 8px; }
|
||||||
|
.row.target .lab { color: var(--primary-deep); font-weight: 800; }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
@ -126,11 +129,11 @@
|
|||||||
<header class="mast">
|
<header class="mast">
|
||||||
<div class="wordmark"><b>AWESOMEDEV</b> · 수습 실전 티켓 풀</div>
|
<div class="wordmark"><b>AWESOMEDEV</b> · 수습 실전 티켓 풀</div>
|
||||||
<h1>실전 티켓 풀 20<br>템플릿 & 아이디어 카탈로그</h1>
|
<h1>실전 티켓 풀 20<br>템플릿 & 아이디어 카탈로그</h1>
|
||||||
<p class="lede">5~6주차에 수습생에게 줄 실전 티켓을 미리 준비하는 문서예요. 아래 20개는 <strong>어떤 프로젝트에나 있는 안전한 티켓 패턴</strong>이고, 각 패턴마다 "우리 프로젝트에서 찾는 법"이 붙어 있어요. 멘토가 실제 코드에서 해당 건을 찾아 뒤쪽 양식으로 구체화하면 티켓 풀이 완성됩니다.</p>
|
<p class="lede">5~6주차에 수습생에게 줄 실전 티켓 20개예요. 각 패턴마다 <strong>🎯 우리 건</strong> — 여러분이 매일 쓰는 이 학습 플랫폼(mirim-app)의 실제 코드에서 찾아 둔 구체적인 일감이 붙어 있어요. 여러분이 고치면 이 플랫폼이 정말로 좋아집니다. 파일 경로까지 적어 뒀으니, 배정받으면 바로 코드를 열어 보세요.</p>
|
||||||
<div class="mast-meta">
|
<div class="mast-meta">
|
||||||
<span class="chip"><span class="dot"></span>프론트 7 · 백엔드 6 · 품질 4 · 디자인 3</span>
|
<span class="chip"><span class="dot"></span>프론트 7 · 백엔드 6 · 품질 4 · 디자인 3</span>
|
||||||
<span class="chip"><span class="dot"></span>난이도 ★(반나절~1일) · ★★(2~3일)</span>
|
<span class="chip"><span class="dot"></span>난이도 ★(반나절~1일) · ★★(2~3일)</span>
|
||||||
<span class="chip"><span class="dot"></span>멘토용 · D-7까지 구체화</span>
|
<span class="chip"><span class="dot"></span>구체화 완료 · 배정 대기</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@ -164,6 +167,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">각 화면에서 데이터 0건으로 조회해 보기. <code>.map()</code> 돌리는 목록 중 <b>length가 0일 때 분기가 없는 곳</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">각 화면에서 데이터 0건으로 조회해 보기. <code>.map()</code> 돌리는 목록 중 <b>length가 0일 때 분기가 없는 곳</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">0건일 때 지정된 문구·아이콘 노출, 1건 이상이면 기존과 동일, 스크린샷 첨부된 PR.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">0건일 때 지정된 문구·아이콘 노출, 1건 이상이면 기존과 동일, 스크린샷 첨부된 PR.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 화면 지정, 문구 확정(디자이너 수습생과 협업시키면 좋음).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 화면 지정, 문구 확정(디자이너 수습생과 협업시키면 좋음).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>코딩 문제 필터 결과 0건 빈 상태</b> — <b>FE-04(필터)와 짝 티켓.</b> 코딩 문제 목록 <code>frontend/src/pages/CodingPage.jsx</code>에 FE-04로 언어·난이도 필터가 생기면 "조건에 맞는 문제 0건"이라는 새 상태가 태어난다. 0건일 때 "조건에 맞는 문제가 없어요" 안내 + [필터 초기화] 버튼을 보여줄 것. FE-04 담당자와 둘이 짝으로 진행 — 남의 코드 위에 얹는 연습.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -174,6 +178,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">네트워크를 느리게(개발자도구 throttling) 하고 화면 이동 — <b>흰 화면이나 깜빡임이 보이는 곳</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">네트워크를 느리게(개발자도구 throttling) 하고 화면 이동 — <b>흰 화면이나 깜빡임이 보이는 곳</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">로딩 중 표시 노출, 로드 완료 시 자연스럽게 교체, 에러 시 로딩이 무한히 남지 않음.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">로딩 중 표시 노출, 로드 완료 시 자연스럽게 교체, 에러 시 로딩이 무한히 남지 않음.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">기존 공용 로딩 컴포넌트가 있으면 알려주기(새로 만들지 재사용할지).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">기존 공용 로딩 컴포넌트가 있으면 알려주기(새로 만들지 재사용할지).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>공용 로딩 컴포넌트(스켈레톤) 도입</b> — "불러오는 중…" 텍스트가 <b>9곳에 하드코딩</b>되어 있다(<code>grep -rn "불러오는 중" frontend/src</code>로 직접 세어 보기). <code>components/Loading.jsx</code>를 만들어 카드 모양 스켈레톤으로 통일하고, 우선 대시보드(<code>DashboardPage.jsx</code>)와 학습 문서(<code>DocsPage.jsx</code>) 2곳만 교체. 나머지는 후속 티켓.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -184,6 +189,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">각 폼에 일부러 빈 값/이상한 값 넣고 제출해 보기 — <b>서버 에러로만 알게 되는 폼</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">각 폼에 일부러 빈 값/이상한 값 넣고 제출해 보기 — <b>서버 에러로만 알게 되는 폼</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">정의된 규칙별 에러 문구 노출, 통과 시 정상 제출, 에러 문구는 한국어로 친절하게.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">정의된 규칙별 에러 문구 노출, 통과 시 정상 제출, 에러 문구는 한국어로 친절하게.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">검사 규칙 목록 확정(무엇을 필수로, 어떤 형식으로).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">검사 규칙 목록 확정(무엇을 필수로, 어떤 형식으로).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>비밀번호 변경: 새 비번 = 현재 비번 차단</b> — <code>frontend/src/pages/ChangePasswordPage.jsx</code> — 지금은 새 비밀번호를 현재 것과 똑같이 넣어도 통과된다(바꾼 게 아닌데 바꿨다고 안내됨). 프론트 validate에 "현재와 다른 비밀번호를 써 주세요" 추가 + <b>백엔드 <code>AuthService.changePassword</code>에도 같은 검사</b>(프론트는 우회 가능 — 서버가 최종 방어선이라는 걸 몸으로 익히는 티켓).</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -194,6 +200,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">운영/관리 화면 중 <b>항목이 20개 이상 쌓이는 목록</b>에서 사용자가 스크롤로만 찾는 곳.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">운영/관리 화면 중 <b>항목이 20개 이상 쌓이는 목록</b>에서 사용자가 스크롤로만 찾는 곳.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">옵션 변경 시 목록 갱신, 새로고침해도 기본값 정상, 기존 기능 회귀 없음.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">옵션 변경 시 목록 갱신, 새로고침해도 기본값 정상, 기존 기능 회귀 없음.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">정렬/필터 기준 확정, 서버 쿼리 지원 여부 확인(클라이언트 정렬로 충분한지).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">정렬/필터 기준 확정, 서버 쿼리 지원 여부 확인(클라이언트 정렬로 충분한지).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>코딩 문제 목록에 언어·난이도 필터</b> — <code>frontend/src/pages/CodingPage.jsx</code> — 문제 25개(JS 12·SQL 5·Java 8)가 한 줄로 길게만 나온다. 언어(전체/JS/SQL/Java)와 난이도(쉬움/보통/어려움) 필터 칩을 추가. <code>useState</code> 2개와 <code>.filter()</code>면 충분 — 새 API 불필요. 퀴즈 페이지의 탭 UI(<code>tabs</code> 클래스)를 참고. 완료되면 FE-01(0건 빈 상태)로 이어진다.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -204,6 +211,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">서버 꺼두고/네트워크 끊고 주요 동작 실행 — <b>알 수 없는 문구가 뜨는 곳</b> 수집.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">서버 꺼두고/네트워크 끊고 주요 동작 실행 — <b>알 수 없는 문구가 뜨는 곳</b> 수집.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">실패 상황별 지정 문구 노출, 콘솔 에러는 유지(디버깅용), 문구 목록 문서화.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">실패 상황별 지정 문구 노출, 콘솔 에러는 유지(디버깅용), 문구 목록 문서화.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">상황별 문구 톤 가이드 한 줄(사과·원인·해결 순).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">상황별 문구 톤 가이드 한 줄(사과·원인·해결 순).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>세션 만료 안내 메시지</b> — <code>frontend/src/api/client.js</code>의 401 인터셉터가 <code>/login</code>으로 보낼 때 아무 설명이 없다 — 학생 입장에선 "쓰다가 갑자기 로그인 화면"이다. 인터셉터에서 <code>/login?expired=1</code>로 보내고, <code>LoginPage.jsx</code>가 쿼리스트링(<code>useSearchParams</code>)을 읽어 "세션이 만료됐어요. 다시 로그인해 주세요"를 폼 위에 표시.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -214,6 +222,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">개발자도구 모바일 뷰(375px)로 주요 화면 전부 훑기 — <b>가로 스크롤 생기는 곳</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">개발자도구 모바일 뷰(375px)로 주요 화면 전부 훑기 — <b>가로 스크롤 생기는 곳</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">375px·768px·데스크톱 3구간 스크린샷 첨부, 기존 데스크톱 레이아웃 변화 없음.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">375px·768px·데스크톱 3구간 스크린샷 첨부, 기존 데스크톱 레이아웃 변화 없음.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">깨지는 화면 목록 미리 수집(학생이 찾는 것부터 시키면 반나절 추가).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">깨지는 화면 목록 미리 수집(학생이 찾는 것부터 시키면 반나절 추가).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>상단 메뉴 가로 스크롤 힌트</b> — 모바일에서 상단 메뉴(<code>global.css</code>의 <code>.topnav-menu</code>)가 "코딩 문…"처럼 잘리는데, 스크롤바까지 숨겨져 있어(<code>::-webkit-scrollbar</code>) 더 있다는 표시가 전혀 없다. 오른쪽 가장자리 그라데이션 페이드(<code>mask-image</code> 또는 <code>::after</code>)로 "더 있음"을 암시할 것. CSS만으로 해결 — JS 불필요.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -224,6 +233,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">비슷한 JSX 덩어리를 검색(클래스명·문구로 grep) — <b>3곳 이상 반복되는 블록</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">비슷한 JSX 덩어리를 검색(클래스명·문구로 grep) — <b>3곳 이상 반복되는 블록</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">추출한 컴포넌트 1개 + 기존 사용처 전부 교체, 화면 픽셀 변화 없음(전후 스크린샷).</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">추출한 컴포넌트 1개 + 기존 사용처 전부 교체, 화면 픽셀 변화 없음(전후 스크린샷).</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 지정 필수(범위 폭주 방지). props 설계는 착수 계획서에서 함께 리뷰.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 지정 필수(범위 폭주 방지). props 설계는 착수 계획서에서 함께 리뷰.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>페이지 히어로 공통 컴포넌트 추출</b> — <code>hero compact</code> 블록(eyebrow + 제목 + 설명)이 <b>7개 페이지에 복붙</b>되어 있다. <code>components/PageHero.jsx</code>로 추출(<code>eyebrow·title·children</code> props 설계)하고 2~3개 페이지부터 적용. "언제 컴포넌트로 뽑는가(3번 반복되면)"와 props 설계를 연습하는 티켓.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -240,6 +250,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">프론트에서 <b>두 번 요청해서 조합하거나, 하드코딩으로 때운 값</b>이 있는 화면의 API가 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">프론트에서 <b>두 번 요청해서 조합하거나, 하드코딩으로 때운 값</b>이 있는 화면의 API가 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">응답 DTO에 필드 추가, 기존 호출부 회귀 없음, 화면에 값 표시, API 문서/주석 갱신.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">응답 DTO에 필드 추가, 기존 호출부 회귀 없음, 화면에 값 표시, API 문서/주석 갱신.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">추가할 필드와 출처(어느 테이블/계산) 지정.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">추가할 필드와 출처(어느 테이블/계산) 지정.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>코딩 문제 목록에 시도 횟수(attempts) 내려주기</b> — <code>CodingController</code>의 <code>ProblemSummary</code> record에는 <code>attempts</code>가 없다(상세 <code>ProblemDetail</code>에는 있음). 목록 응답에 추가하고, 프론트 <code>CodingPage.jsx</code> 목록에 "3번째 도전 중" 배지 표시. record 필드 추가 → 서비스 → 화면까지 <b>세로로 관통</b>하는 첫 티켓으로 적당.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -250,6 +261,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">등록/수정 API에 일부러 이상한 값 보내 보기 — <b>500이 뜨는 곳</b>이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">등록/수정 API에 일부러 이상한 값 보내 보기 — <b>500이 뜨는 곳</b>이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">정의된 규칙 위반 시 400 + 명확한 메시지, 정상 값은 기존대로, 테스트 1개 추가.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">정의된 규칙 위반 시 400 + 명확한 메시지, 정상 값은 기존대로, 테스트 1개 추가.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">검증 규칙 표(필드·규칙·에러 메시지) 초안.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">검증 규칙 표(필드·규칙·에러 메시지) 초안.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>코딩 제출 코드 길이 제한</b> — <code>CodingController.SubmitRequest</code>의 <code>code</code> 필드에 길이 제한이 없다 — 수 MB를 보내도 DB가 그대로 받는다. <code>@Size(max = 20000)</code>(약 500줄) + 컨트롤러 <code>@Valid</code> 확인 + 프론트 초과 시 안내. "받을 수 있는 것"과 "받아도 되는 것"은 다르다는 검증 원칙 티켓.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -260,6 +272,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">최근 장애/문의 때 <b>로그 보고도 원인을 몰랐던 지점</b>을 선임에게 물어 수집.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">최근 장애/문의 때 <b>로그 보고도 원인을 몰랐던 지점</b>을 선임에게 물어 수집.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">지정 지점 로그에 식별자·원인 포함, 개인정보(전화번호 등) 마스킹 확인.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">지정 지점 로그에 식별자·원인 포함, 개인정보(전화번호 등) 마스킹 확인.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">개인정보 로깅 금지 규칙 브리핑(이 티켓이 보안 교육 기회).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">개인정보 로깅 금지 규칙 브리핑(이 티켓이 보안 교육 기회).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>검증 실패(400) 응답 메시지 한국어 통일</b> — <code>@Valid</code> 실패 시 응답 message가 "Validation failed for object='loginRequest'…" 영어 원문이다(기본기 감사에서 발견). <code>@RestControllerAdvice</code> + <code>MethodArgumentNotValidException</code> 핸들러를 만들어 <b>첫 번째 필드 에러의 한국어 메시지</b>(DTO에 이미 다 적어 둠)를 <code>{"message": "..."}</code>로 내려주기. 전역 예외 처리 입문 티켓.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -270,6 +283,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">관리/통계 화면에서 <b>"이 목록도 보고 싶다"고 미뤄둔 요구</b>가 후보 (신규 화면과 세트로 주면 FE 수습생과 협업 티켓이 됨).</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">관리/통계 화면에서 <b>"이 목록도 보고 싶다"고 미뤄둔 요구</b>가 후보 (신규 화면과 세트로 주면 FE 수습생과 협업 티켓이 됨).</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">API 동작(페이징 포함 여부 명시), 계층 구조 준수, 테스트 1개, API 명세 공유.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">API 동작(페이징 포함 여부 명시), 계층 구조 준수, 테스트 1개, API 명세 공유.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 테이블·조건·응답 형태 스펙 한 장. 참고할 기존 유사 API 지정.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 테이블·조건·응답 형태 스펙 한 장. 참고할 기존 유사 API 지정.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>학생 한 명의 과제 제출 모아보기 API</b> — 멘토 화면(<code>MentorController</code>)에는 전체 제출 최신순(<code>GET /api/mentor/submissions</code>)만 있고 <b>학생별로 모아보기가 없다</b>. <code>GET /api/mentor/students/{userId}/submissions</code> 신규 작성(단순 R) + <code>MentorPage.jsx</code>에서 학생 이름 클릭 시 필터. <code>hasRole("MENTOR")</code> 권한이 어떻게 걸리는지(SecurityConfig) 함께 확인.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -280,6 +294,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">서비스 코드에서 <b>의미를 알 수 없는 숫자 리터럴</b> grep — 선임이 "이건 바뀔 수 있는 값"이라고 확인해준 것만.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">서비스 코드에서 <b>의미를 알 수 없는 숫자 리터럴</b> grep — 선임이 "이건 바뀔 수 있는 값"이라고 확인해준 것만.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">동작 변화 없음(값 동일), 상수 이름이 의미를 설명, 어디서 왜 쓰는지 주석.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">동작 변화 없음(값 동일), 상수 이름이 의미를 설명, 어디서 왜 쓰는지 주석.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">추출 대상 목록 지정(전체 수색은 범위 폭주).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">추출 대상 목록 지정(전체 수색은 범위 폭주).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>로그인 잠금 정책을 설정값으로 추출</b> — <code>LoginAttemptService</code>의 5회/5분이 <code>static final</code> 상수로 박혀 있다. <code>security.login-lock.max-failures</code>·<code>lock-minutes</code>를 <code>application.yml</code>에 <code>${ENV:기본값}</code> 패턴으로 추출(<code>@Value</code> 주입) — 컨테이너 재빌드 없이 정책을 조정할 수 있게. 기존 테스트(<code>LoginAttemptServiceTest</code>)가 깨지지 않게 유지하는 것까지가 완료 조건.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -290,6 +305,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">쿼리 로그 켜고 목록 화면 열기 — <b>같은 모양 쿼리가 수십 번 반복</b>되는 곳이 후보.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">쿼리 로그 켜고 목록 화면 열기 — <b>같은 모양 쿼리가 수십 번 반복</b>되는 곳이 후보.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">쿼리 수 전/후 비교 기록(예: 51→2), 결과 데이터 동일함 검증, 개선 설명 PR에 작성.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">쿼리 수 전/후 비교 기록(예: 51→2), 결과 데이터 동일함 검증, 개선 설명 PR에 작성.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 지점 확정 필수. JPA 페치 전략을 함께 리뷰(혼자 두면 위험한 티켓).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 지점 확정 필수. JPA 페치 전략을 함께 리뷰(혼자 두면 위험한 티켓).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>N+1 지점 측정하고 개선하기</b> — <code>MentorController</code>·<code>CodingService</code> 주석에 "학생 4~5명이라 괜찮다(N+1)"고 적어 둔 지점이 있다(<code>grep -rn "N+1" backend/src</code>). SQL 로그를 켜고(<code>logging.level...SQL: DEBUG</code>) 멘토 화면을 열어 <b>쿼리가 몇 번 나가는지 직접 센 뒤</b>, 학생 100명 가정으로 IN 절/JOIN FETCH로 줄이기. 측정→개선→재측정 수치를 PR에 첨부.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -306,6 +322,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">이슈 트래커/메모에 쌓인 <b>"급하지 않은 버그"</b> 목록에서 데이터 파손 위험 없는 것.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">이슈 트래커/메모에 쌓인 <b>"급하지 않은 버그"</b> 목록에서 데이터 파손 위험 없는 것.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">재현 절차 문서, 수정 PR, 실패했다가 통과하는 테스트 1개.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">재현 절차 문서, 수정 PR, 실패했다가 통과하는 테스트 1개.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">버그 후보 2~3개 골라두기(1개는 막힐 경우의 교체용).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">버그 후보 2~3개 골라두기(1개는 막힐 경우의 교체용).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>잠재 버그: 문서 뷰어 notFound 상태 미리셋</b> — <code>frontend/src/pages/DocViewerPage.jsx</code> — <code>notFound</code>가 한 번 true가 되면 되돌리는 코드가 없다. 지금은 문서 간 직행 링크가 없어 안 터질 뿐(전수 감사에서 "결함 실재, 현재 도달 불가"로 판정된 건). <b>재현 경로를 직접 구성</b>(없는 slug 접속 → 정상 문서로 이동)해 버그를 드러내고, slug 변경 시 상태 리셋으로 수정. "도달 불가한 결함은 언제 고치는가"를 토론해 보는 티켓.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -316,6 +333,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt"><b>if 분기가 3개 이상인데 테스트 0개인 함수</b>를 서비스 코드에서 찾기.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt"><b>if 분기가 3개 이상인데 테스트 0개인 함수</b>를 서비스 코드에서 찾기.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">케이스 5개 이상(경계값 포함), 전부 통과, 테스트 이름만 봐도 뭘 검증하는지 알 것.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">케이스 5개 이상(경계값 포함), 전부 통과, 테스트 이름만 봐도 뭘 검증하는지 알 것.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 함수 지정 + 기존 테스트 파일 1개를 본보기로 알려주기.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">대상 함수 지정 + 기존 테스트 파일 1개를 본보기로 알려주기.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>SubmissionService·CourseProgressService 단위 테스트</b> — 이 두 서비스만 테스트가 0개다(<code>backend/src/test/.../service/</code> 목록과 대조). <code>ProgressServiceTest</code> 패턴(Mockito + 한국어 <code>@DisplayName</code>) 그대로 — 재제출 시 상태가 SUBMITTED로 돌아오는지, 없는 과제 404, 빈 내용 400 등 <b>분기마다 1개</b>. 전체 테스트가 25개+로 늘어나는 걸 확인.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -326,6 +344,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">본인의 <b>1주차 세팅 메모</b>가 그대로 재료. (이 티켓은 사실상 준비돼 있음)</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">본인의 <b>1주차 세팅 메모</b>가 그대로 재료. (이 티켓은 사실상 준비돼 있음)</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">문서만 보고 다른 수습생이 클린 세팅 성공(상호 검증), 시크릿 값은 문서에 안 씀.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">문서만 보고 다른 수습생이 클린 세팅 성공(상호 검증), 시크릿 값은 문서에 안 씀.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">문서 위치 지정, 시크릿 기재 금지 재강조.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">문서 위치 지정, 시크릿 기재 금지 재강조.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>README 현행화 — 따라 하면 실행되게</b> — <code>README.md</code>에 텔레그램 알림·로그인 잠금·내 정보·주소찾기 등 최근 기능이 하나도 없다(grep 0건). <b>README만 보고 처음부터 로컬 실행을 따라 해 보고</b>, 막히는 지점(환경변수·포트·시드 계정)을 전부 고쳐 쓰기. "문서는 새 팀원이 검증한다" — 여러분이 그 새 팀원이다.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -336,6 +355,7 @@
|
|||||||
<div class="row find"><span class="lab">찾는 법</span><span class="txt">에디터/린트의 <b>unused 경고</b> + 주석 블록 검색. 삭제 전 "정말 안 쓰나" 확인 방법을 배우는 게 포인트.</span></div>
|
<div class="row find"><span class="lab">찾는 법</span><span class="txt">에디터/린트의 <b>unused 경고</b> + 주석 블록 검색. 삭제 전 "정말 안 쓰나" 확인 방법을 배우는 게 포인트.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">빌드·테스트 통과, 삭제 목록을 PR 설명에 정리, 확신 없는 건 삭제 대신 질문.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">빌드·테스트 통과, 삭제 목록을 PR 설명에 정리, 확신 없는 건 삭제 대신 질문.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">범위 폴더 지정(전체 수색 금지), 리뷰 꼼꼼히.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">범위 폴더 지정(전체 수색 금지), 리뷰 꼼꼼히.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>미사용 import·변수 정리 (frontend/src/pages 한정)</b> — <code>npm run lint</code> 결과를 기준으로 <code>frontend/src/pages</code> 디렉터리의 미사용 import·변수만 정리. <b>범위를 벗어난 "김에 수정"은 금지</b> — 정리 PR은 작아야 리뷰가 된다는 걸 배우는 티켓. lint 경고 개수 before/after를 PR 설명에 기록.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -351,6 +371,7 @@
|
|||||||
<div class="row what"><span class="lab">무엇을</span><span class="txt">FE-01·FE-05와 짝: 빈 상태/에러 상태의 일러스트·문구·레이아웃을 디자인하고 개발자에게 핸드오프.</span></div>
|
<div class="row what"><span class="lab">무엇을</span><span class="txt">FE-01·FE-05와 짝: 빈 상태/에러 상태의 일러스트·문구·레이아웃을 디자인하고 개발자에게 핸드오프.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">시안 + 문구 + 간격/색 명세, 개발 구현 결과가 시안과 일치하는지 확인까지.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">시안 + 문구 + 간격/색 명세, 개발 구현 결과가 시안과 일치하는지 확인까지.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">기존 디자인 톤 참고 자료 전달.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">기존 디자인 톤 참고 자료 전달.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>빈 상태·오류 화면 디자인 세트</b> — FE-01·FE-05와 짝. 플랫폼 공통 상태 3종(데이터 없음 / 검색 결과 없음 / 오류) 일러스트+문구 톤을 피그마로 설계. 현재 화면들은 회색 텍스트 한 줄뿐이다. 개발 수습생과 협업해 <b>1종은 실제 반영까지</b> — 디자인이 코드가 되는 전 과정을 경험.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -360,6 +381,7 @@
|
|||||||
<div class="row what"><span class="lab">무엇을</span><span class="txt">2주차 UI 인벤토리에서 찾은 불편 지점 1개를 개선 시안으로 만들고, 팀 리뷰 통과분을 개발 티켓으로 넘기기.</span></div>
|
<div class="row what"><span class="lab">무엇을</span><span class="txt">2주차 UI 인벤토리에서 찾은 불편 지점 1개를 개선 시안으로 만들고, 팀 리뷰 통과분을 개발 티켓으로 넘기기.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">현행 문제 정의 → 개선 시안(2안) → 선택안 핸드오프 문서 → 구현 확인.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">현행 문제 정의 → 개선 시안(2안) → 선택안 핸드오프 문서 → 구현 확인.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">개선 후보 화면 2~3개 승인해 두기(고객사 승인 필요 화면 제외).</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">개선 후보 화면 2~3개 승인해 두기(고객사 승인 필요 화면 제외).</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>퀴즈 결과 화면 UX 관찰·개선 제안</b> — 퀴즈 결과 화면(<code>QuizPage.jsx</code> 채점 후) — 틀린 문제를 다시 보는 흐름을 <b>동료 2명이 쓰는 걸 관찰</b>하고(어디서 머뭇거리나), 개선안 1장(before/after 스케치)을 멘토에게 제안 → 승인되면 개발 티켓으로 전환. "관찰 → 제안 → 반영"의 UX 사이클 한 바퀴.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -369,6 +391,7 @@
|
|||||||
<div class="row what"><span class="lab">무엇을</span><span class="txt">서비스에서 쓰이는 버튼·입력·카드·색·글자 크기를 한 장으로 정리한 "컴포넌트 정리표" 제작 — FE-07(공통 컴포넌트화)의 근거 자료가 됨.</span></div>
|
<div class="row what"><span class="lab">무엇을</span><span class="txt">서비스에서 쓰이는 버튼·입력·카드·색·글자 크기를 한 장으로 정리한 "컴포넌트 정리표" 제작 — FE-07(공통 컴포넌트화)의 근거 자료가 됨.</span></div>
|
||||||
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">컴포넌트별 변형 수 집계, 통일 제안 포함, 팀 공유 발표 10분.</span></div>
|
<div class="row dod"><span class="lab">완료 조건</span><span class="txt">컴포넌트별 변형 수 집계, 통일 제안 포함, 팀 공유 발표 10분.</span></div>
|
||||||
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">범위(화면 몇 개까지) 지정.</span></div>
|
<div class="row prep"><span class="lab">멘토 준비</span><span class="txt">범위(화면 몇 개까지) 지정.</span></div>
|
||||||
|
<div class="row target"><span class="lab">🎯 우리 건</span><span class="txt"><b>미니 디자인 시스템 정리표</b> — <code>global.css</code>의 버튼(btn·btn-primary·btn-ghost)·배지(badge-*)·칩·카드 변형을 화면 캡처로 전수 수집해 피그마 정리표로. 색·간격·글자 크기 토큰까지 뽑으면 <b>이 플랫폼의 미니 디자인 시스템 v0.1</b>이 된다. DZ-01·FE-07과 자연스럽게 연결.</span></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -401,31 +424,31 @@
|
|||||||
<section id="tracker">
|
<section id="tracker">
|
||||||
<div class="eyebrow">배정 트래커</div>
|
<div class="eyebrow">배정 트래커</div>
|
||||||
<h2>티켓 풀 현황판</h2>
|
<h2>티켓 풀 현황판</h2>
|
||||||
<p class="sub">D-7까지 각 패턴을 실제 건으로 구체화하고, 5~6주차에 배정하면서 채워 나가세요. 학생 1명당 5~6주 동안 2~4건이 적당해요.</p>
|
<p class="sub">✅ 2026-07-17 구체화 완료 — 20건 모두 이 학습 플랫폼(mirim-app) 실코드 기준으로 검증했습니다. 이제 5~6주차에 배정만 하면 됩니다. 학생 1명당 5~6주 동안 2~4건이 적당해요.</p>
|
||||||
<div class="tblwrap">
|
<div class="tblwrap">
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th>패턴</th><th>실제 티켓 제목</th><th>구체화</th><th>배정 대상</th><th>배정일</th><th>상태</th></tr></thead>
|
<thead><tr><th>패턴</th><th>실제 티켓 제목</th><th>구체화</th><th>배정 대상</th><th>배정일</th><th>상태</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td class="num">FE-01</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-01</td><td>코딩 문제 필터 결과 0건 빈 상태</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-02</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-02</td><td>공용 로딩 컴포넌트(스켈레톤) 도입</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-03</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-03</td><td>비밀번호 변경: 새 비번 = 현재 비번 차단</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-04</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-04</td><td>코딩 문제 목록에 언어·난이도 필터</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-05</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-05</td><td>세션 만료 안내 메시지</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-06</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-06</td><td>상단 메뉴 가로 스크롤 힌트</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">FE-07</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">FE-07</td><td>페이지 히어로 공통 컴포넌트 추출</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-01</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-01</td><td>코딩 문제 목록에 시도 횟수(attempts) 내려주기</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-02</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-02</td><td>코딩 제출 코드 길이 제한</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-03</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-03</td><td>검증 실패(400) 응답 메시지 한국어 통일</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-04</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-04</td><td>학생 한 명의 과제 제출 모아보기 API</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-05</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-05</td><td>로그인 잠금 정책을 설정값으로 추출</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">BE-06</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">BE-06</td><td>N+1 지점 측정하고 개선하기</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">QA-01</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">QA-01</td><td>잠재 버그: 문서 뷰어 notFound 상태 미리셋</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">QA-02</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">QA-02</td><td>SubmissionService·CourseProgressService 단위 테스트</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">QA-03</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">QA-03</td><td>README 현행화 — 따라 하면 실행되게</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">QA-04</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">QA-04</td><td>미사용 import·변수 정리 (frontend/src/pages 한정)</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">DZ-01</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">DZ-01</td><td>빈 상태·오류 화면 디자인 세트</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">DZ-02</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">DZ-02</td><td>퀴즈 결과 화면 UX 관찰·개선 제안</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
<tr><td class="num">DZ-03</td><td><span class="fill"></span></td><td>☐</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
<tr><td class="num">DZ-03</td><td>미니 디자인 시스템 정리표</td><td>☑</td><td><span class="fill"></span></td><td><span class="fill"></span></td><td><span class="fill"></span></td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user