mirim-app/frontend/public/docs/week3-assignments.html
AWESOMEDEV 111590104e feat: 수습 학습 플랫폼 최초 구축 (React + Spring Boot + PostgreSQL)
- 로그인/회원가입/아이디찾기/비밀번호재설정 (세션 기반)
- 대시보드(주차별 진도 체크리스트), 학습 문서 뷰어(17종), 과제 제출/멘토 피드백
- 코딩 기초·개발 환경 설치 가이드 학습 페이지
- 전 소스 한국어 학습 주석 — 수습생 교육용 저장소
- Docker 배포 구성 (Caddy + Spring Boot + PG + Gitea)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:18:12 +09:00

871 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<title>AWESOMEDEV 3주차 일일 과제집 — 첫 소과제 실전</title>
<style>
:root {
--paper: #FAFBFD; --card: #FFFFFF; --ink: #101A28; --ink-soft: #46536A;
--ink-faint: #7B8798; --line: #E4E8F0; --line-soft: #EFF2F7;
--primary: #2159C5; --primary-soft: #E5EDFB; --primary-deep: #163F8F;
--amber: #B9772A; --amber-soft: #F6EBDA; --amber-line: #E4C79A;
--teal: #0E8C86; --teal-soft: #E0F1EF;
--rose: #B4463C; --rose-soft: #F7E7E4;
--code-bg: #F1F4F9;
--shadow: 0 1px 2px rgba(16,26,40,.05), 0 8px 24px -12px rgba(16,26,40,.16);
--radius: 14px;
}
@media (prefers-color-scheme: dark) {
:root {
--paper: #0B1017; --card: #131A24; --ink: #E8EDF4; --ink-soft: #A4B0C0;
--ink-faint: #74808F; --line: #263140; --line-soft: #1C242F;
--primary: #6AA0F0; --primary-soft: #172A44; --primary-deep: #AECBF8;
--amber: #DBA25C; --amber-soft: #2C2318; --amber-line: #4A3B23;
--teal: #4FC7BE; --teal-soft: #14302E; --rose: #E08A80; --rose-soft: #331E1B;
--code-bg: #161E28;
--shadow: 0 1px 2px rgba(0,0,0,.35), 0 10px 30px -14px rgba(0,0,0,.65);
}
}
:root[data-theme="light"] {
--paper: #FAFBFD; --card: #FFFFFF; --ink: #101A28; --ink-soft: #46536A;
--ink-faint: #7B8798; --line: #E4E8F0; --line-soft: #EFF2F7;
--primary: #2159C5; --primary-soft: #E5EDFB; --primary-deep: #163F8F;
--amber: #B9772A; --amber-soft: #F6EBDA; --amber-line: #E4C79A;
--teal: #0E8C86; --teal-soft: #E0F1EF; --rose: #B4463C; --rose-soft: #F7E7E4;
--code-bg: #F1F4F9;
--shadow: 0 1px 2px rgba(16,26,40,.05), 0 8px 24px -12px rgba(16,26,40,.16);
}
:root[data-theme="dark"] {
--paper: #0B1017; --card: #131A24; --ink: #E8EDF4; --ink-soft: #A4B0C0;
--ink-faint: #74808F; --line: #263140; --line-soft: #1C242F;
--primary: #6AA0F0; --primary-soft: #172A44; --primary-deep: #AECBF8;
--amber: #DBA25C; --amber-soft: #2C2318; --amber-line: #4A3B23;
--teal: #4FC7BE; --teal-soft: #14302E; --rose: #E08A80; --rose-soft: #331E1B;
--code-bg: #161E28;
--shadow: 0 1px 2px rgba(0,0,0,.35), 0 10px 30px -14px rgba(0,0,0,.65);
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body { margin: 0; background: var(--paper); color: var(--ink);
font-family: "Pretendard","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",system-ui,sans-serif;
line-height: 1.7; -webkit-font-smoothing: antialiased; letter-spacing: -0.01em; }
.wrap { max-width: 860px; margin: 0 auto; padding: clamp(20px,4vw,48px); }
.eyebrow { font-size: 12px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--primary); display: flex; align-items: center; gap: 10px; }
.eyebrow::before { content:""; width: 22px; height: 2px; background: currentColor; border-radius: 2px; }
header.mast { border: 1px solid var(--line); border-radius: var(--radius);
background: radial-gradient(120% 140% at 100% 0%, var(--primary-soft) 0%, transparent 55%), var(--card);
box-shadow: var(--shadow); padding: clamp(26px,4vw,42px); }
.wordmark { font-size: 13px; font-weight: 800; letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink-soft); }
.wordmark b { color: var(--primary); }
header.mast h1 { font-size: clamp(27px,5.4vw,40px); line-height: 1.15; margin: 16px 0 0; font-weight: 800; letter-spacing: -0.03em; text-wrap: balance; }
header.mast .lede { margin: 16px 0 0; font-size: clamp(15px,2.4vw,17px); color: var(--ink-soft); max-width: 58ch; }
.mast-meta { margin-top: 22px; display: flex; flex-wrap: wrap; gap: 10px; }
.chip { font-size: 13px; font-weight: 600; color: var(--ink-soft); background: var(--paper); border: 1px solid var(--line); padding: 6px 12px; border-radius: 999px; display: inline-flex; align-items: center; gap: 7px; }
.chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--primary); }
section { margin-top: clamp(30px,5vw,46px); scroll-margin-top: 20px; }
section > h2 { font-size: clamp(20px,3.4vw,25px); font-weight: 800; letter-spacing: -0.025em; margin: 12px 0 0; text-wrap: balance; }
section > .sub { color: var(--ink-soft); margin: 9px 0 0; font-size: 15px; max-width: 64ch; }
.card { background: var(--card); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); padding: clamp(18px,3vw,26px); }
.mt { margin-top: 16px; }
p { margin: 0; } strong { font-weight: 700; }
.time { display: grid; gap: 0; }
.time .row { display: grid; grid-template-columns: 128px 1fr; gap: 16px; padding: 11px 0; border-top: 1px solid var(--line-soft); align-items: baseline; }
.time .row:first-child { border-top: 0; }
.time .t { font-weight: 700; font-size: 13.5px; font-variant-numeric: tabular-nums; color: var(--ink); white-space: nowrap; }
.time .v { font-size: 14.5px; color: var(--ink-soft); } .time .v b { color: var(--ink); font-weight: 600; }
.day-div { margin-top: clamp(38px,6vw,56px); display: grid; grid-template-columns: auto 1fr; gap: 18px; align-items: center; }
.day-badge { width: 58px; height: 58px; border-radius: 14px; background: var(--primary); color: #fff; display: grid; place-items: center; text-align: center; line-height: 1.05; box-shadow: var(--shadow); }
@media (prefers-color-scheme: dark){ .day-badge { color:#0B1017; } }
:root[data-theme="dark"] .day-badge { color:#0B1017; }
.day-badge .w { font-size: 10px; font-weight: 700; letter-spacing: 0.08em; opacity: .85; }
.day-badge .n { font-size: 22px; font-weight: 800; }
.day-div h2 { margin: 0; font-size: clamp(21px,3.6vw,27px); font-weight: 800; letter-spacing: -0.025em; }
.day-div .dm { margin-top: 3px; color: var(--ink-soft); font-size: 14px; }
.task { margin-top: 16px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--card); box-shadow: var(--shadow); overflow: hidden; }
.t-head { padding: 16px 20px; border-bottom: 1px solid var(--line-soft); background: var(--primary-soft); display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.t-head h3 { margin: 0; font-size: 17px; font-weight: 800; letter-spacing: -0.015em; }
.t-head .kind { font-size: 11px; font-weight: 800; letter-spacing: 0.05em; text-transform: uppercase; color: var(--primary); }
.diff { font-size: 12px; font-weight: 800; letter-spacing: 0.03em; padding: 4px 11px; border-radius: 999px; white-space: nowrap; }
.diff.d1 { color: var(--teal); background: var(--teal-soft); }
.diff.d2 { color: var(--amber); background: var(--amber-soft); }
.diff.d3 { color: var(--rose); background: var(--rose-soft); }
.t-body { padding: 18px 20px; display: grid; gap: 14px; }
.block > .bt { font-size: 12px; font-weight: 800; letter-spacing: 0.05em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: 8px; display: flex; align-items: center; gap: 7px; }
.block .bt .ic { width: 20px; height: 20px; border-radius: 6px; display: grid; place-items: center; font-size: 12px; }
.bt .ic.goal { background: var(--primary-soft); } .bt .ic.step { background: var(--teal-soft); }
.bt .ic.out { background: var(--amber-soft); } .bt .ic.extra { background: var(--line-soft); }
.bt .ic.dz { background: var(--rose-soft); }
.goal-line { font-size: 14.5px; color: var(--ink); }
.steps { margin: 0; padding: 0 0 0 2px; display: grid; gap: 8px; counter-reset: st; }
.steps li { list-style: none; padding-left: 30px; position: relative; font-size: 14px; color: var(--ink-soft); counter-increment: st; }
.steps li::before { content: counter(st); position: absolute; left: 0; top: 1px; width: 20px; height: 20px; border-radius: 6px; background: var(--teal-soft); color: var(--teal); font-weight: 800; font-size: 12px; display: grid; place-items: center; }
.steps li b { color: var(--ink); font-weight: 600; }
.out-box { border: 1px solid var(--amber-line); background: var(--amber-soft); border-radius: 10px; padding: 12px 15px; }
.out-box p { font-size: 13.5px; color: var(--ink-soft); } .out-box b { color: var(--ink); }
.out-box ul { margin: 6px 0 0; padding-left: 20px; display: grid; gap: 4px; font-size: 13.5px; color: var(--ink); }
.extra-box { border: 1px dashed var(--line); background: var(--code-bg); border-radius: 10px; padding: 12px 15px; }
.extra-box p { font-size: 13.5px; color: var(--ink-soft); } .extra-box b { color: var(--primary); }
.dz-box { border: 1px solid color-mix(in srgb,var(--rose) 25%,transparent); background: var(--rose-soft); border-radius: 10px; padding: 12px 15px; }
.dz-box p { font-size: 13.5px; color: var(--ink-soft); } .dz-box b { color: var(--rose); }
.tpl { border: 1px solid var(--amber-line); background: var(--code-bg); border-radius: 10px; overflow: hidden; }
.tpl .cap { font-size: 11.5px; font-weight: 800; letter-spacing: 0.04em; color: var(--amber); background: var(--amber-soft); padding: 7px 15px; border-bottom: 1px solid var(--amber-line); text-transform: uppercase; }
.tpl pre { margin: 0; padding: 14px 16px; font-family: "SF Mono","Cascadia Code","Consolas",ui-monospace,monospace; font-size: 13px; line-height: 1.65; color: var(--ink); white-space: pre-wrap; word-break: break-word; letter-spacing: 0; }
.tpl .hl { color: var(--primary); font-weight: 600; }
code { font-family: "SF Mono","Cascadia Code","Consolas",ui-monospace,monospace; font-size: 0.9em; background: var(--code-bg); padding: 1px 6px; border-radius: 5px; }
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){ .time .row { grid-template-columns: 96px 1fr; gap: 10px; } }
@media print { body{background:#fff;} .card,header.mast,.task,.day-badge{box-shadow:none;} .task{break-inside:avoid;} }
</style>
<div class="wrap">
<header class="mast">
<div class="wordmark"><b>AWESOMEDEV</b> · 일일 과제집 · 3 / 4</div>
<h1>3주차 일일 과제집<br>첫 소과제 실전</h1>
<p class="lede">이 과제집은 오후 자기주도 시간(10:4012:00, 13:0016:30)에 쓰는 문서예요. 이번 주는 배정받은 첫 소과제가 메인이고, 이 문서는 그 소과제를 계획→구현→PR→리뷰 반영→회고로 끌고 가는 체크리스트와 양식을 담고 있어요. 매일 16:30 멘토 리뷰 때 제출할 산출물이 정해져 있으니, 하루를 시작할 때 그날의 산출물부터 확인하고 움직여 보세요.</p>
<div class="mast-meta">
<span class="chip"><span class="dot"></span>Week 3 · 월–금</span>
<span class="chip"><span class="dot"></span>오후 자기주도 시간용</span>
<span class="chip"><span class="dot"></span>매일 16:30 과제 리뷰 제출</span>
</div>
</header>
<section id="rhythm">
<div class="eyebrow">Daily Rhythm</div>
<h2>하루의 리듬</h2>
<p class="sub">3주차 내내 하루의 뼈대는 같아요. 오전 강의에서 배운 것을 오후에 소과제로 바로 이어가는 구조예요.</p>
<div class="card mt">
<div class="time">
<div class="row"><div class="t">09:3010:30</div><div class="v"><b>아침 강의(멘토)</b> — 기본기 코너 「프로그램의 변화」 + 그날의 소과제 진행 포인트</div></div>
<div class="row"><div class="t">10:4012:00</div><div class="v"><b>일일 과제 전반</b> — 머리가 맑은 시간. 그날 과제의 가장 어려운 부분부터 시작해요</div></div>
<div class="row"><div class="t">13:0016:30</div><div class="v"><b>일일 과제 후반</b> — 막히면 <b>30분 룰</b>: 30분 동안 스스로 시도한 흔적(검색어·시도한 코드·에러 메시지)을 정리한 뒤 멘토에게 질문해요</div></div>
<div class="row"><div class="t">16:3017:00</div><div class="v"><b>멘토 과제 리뷰</b> — 그날의 산출물을 제출하고 피드백을 받아요</div></div>
<div class="row"><div class="t">17:0017:30</div><div class="v"><b>하루 정리 · 3줄 회고</b> — 오늘 한 것 / 배운 것 / 내일 할 것을 각 1줄로</div></div>
</div>
<p class="mt" style="font-size:13.5px;color:var(--ink-faint);">규칙 하나만 기억해요: <strong>과제가 일찍 끝나면 놀지 말고 예비 과제로 — 예비 과제도 평가에 반영돼요.</strong></p>
</div>
</section>
<!-- ===================== MON ===================== -->
<div class="day-div" id="d1">
<div class="day-badge"><div><div class="w">MON</div><div class="n"></div></div></div>
<div>
<h2>착수 계획서 — 시작하기 전에 지도를 그린다</h2>
<p class="dm">오전 강의에서 첫 소과제를 배정받고 접근 방법을 공유했어요. 오후엔 그 접근 방법을 문서로 굳혀요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>소과제 착수 계획서 1장 쓰기</h3></div>
<span class="diff d2">난이도 ★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">코드를 치기 전에 "무엇을, 어떻게, 얼마나 걸려서" 할지 스스로 설명하는 힘을 길러요 — 실무에서 가장 먼저 배우는 습관이에요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>과제 티켓을 소리 내어 읽어요.</b> 배정받은 소과제의 설명을 3번 읽고, 모르는 단어·기능 이름에 전부 밑줄을 쳐요.</li>
<li><b>화면에서 확인해요.</b> 실제 서비스(개발 환경)를 열어 과제가 말하는 화면·기능을 직접 눌러 보고, 현재 동작을 스크린샷 1장으로 남겨요.</li>
<li><b>코드 입구를 찾아요.</b> 화면에 보이는 문구(버튼 이름 등)를 저장소에서 검색해서, 고쳐야 할 파일 후보를 2~3개까지 좁혀요. 확신이 없어도 괜찮아요 — "후보"면 충분해요.</li>
<li><b>아래 양식을 채워요.</b> 특히 "불확실한 점"을 비워 두지 마세요. 불확실한 점이 하나도 없다면 과제를 아직 덜 이해한 거예요.</li>
<li><b>작업을 3덩어리로 쪼개요.</b> "화요일 오전 / 화요일 오후 / 수요일 오전"에 각각 무엇을 끝낼지 계획서의 일정 칸에 적어요.</li>
<li><b>멘토 확인을 받아요.</b> 계획서를 들고 멘토에게 5분만 시간을 요청해서, 방향이 맞는지 확인 도장을 받아요. 16:30 전에 미리 받아도 좋아요.</li>
<li><b>수정 사항을 반영해요.</b> 멘토 코멘트를 계획서에 빨간 글씨(또는 "멘토 피드백:" 표시)로 추가해서 최종본을 만들어요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 착수 계획서 1장 (아래 양식 그대로, 마크다운 파일 <code>plan.md</code> 또는 공유 문서)</p>
<ul>
<li>양식의 6개 항목이 모두 채워져 있을 것</li>
<li>"불확실한 점"이 최소 2개 이상 적혀 있을 것</li>
<li>멘토 확인 코멘트가 반영돼 있을 것</li>
</ul>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>워크시트</div>
<div class="tpl">
<div class="cap">착수 계획서 양식 — 빈칸을 채워요</div>
<pre># 소과제 착수 계획서
작성자: <span class="hl">______</span> 작성일: 2026-__-__ 과제명: <span class="hl">______________________</span>
## 1. 무엇을 (What)
- 이 과제가 끝나면 사용자에게 무엇이 달라지나요? (1~2문장)
<span class="hl">________________________________________</span>
- 현재 동작 스크린샷: (붙여넣기)
## 2. 어떻게 (How)
- 고칠 것으로 보이는 파일/영역 후보:
1) <span class="hl">______________________</span> — 이유: <span class="hl">__________</span>
2) <span class="hl">______________________</span> — 이유: <span class="hl">__________</span>
- 대략의 순서: <span class="hl">____________ → ____________ → ____________</span>
## 3. 예상 소요
- 화요일 오전: <span class="hl">______________________</span>
- 화요일 오후: <span class="hl">______________________</span>
- 수요일 오전: <span class="hl">______________________</span> (PR 올리기 포함)
## 4. 불확실한 점 (최소 2개)
- <span class="hl">________________________________________</span>
- <span class="hl">________________________________________</span>
## 5. 완료 기준 (Definition of Done)
- [ ] <span class="hl">______________________</span> 가 화면에서 동작한다
- [ ] 기존 기능 <span class="hl">__________</span> 이 깨지지 않았다
- [ ] PR이 올라가고 설명이 채워져 있다
## 6. 멘토 피드백 (확인 후 기록)
- <span class="hl">________________________________________</span></pre>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>내 과제 주변 코드 탐험 노트</h3></div>
<span class="diff d1">난이도 ★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">내일 구현을 시작할 파일들을 미리 읽어 두면, 화요일 아침의 나에게 큰 선물이 돼요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>계획서 2번 항목의 파일 후보를 위에서부터 하나씩 열어요.</li>
<li>파일마다 <b>맨 위(import·컴포넌트/클래스 선언)부터 끝까지</b> 훑고, "이 파일의 역할 1줄"을 노트에 적어요.</li>
<li>모르는 함수·문법이 나오면 <b>일단 이름만</b> 노트에 적고 넘어가요 (전부 이해하려고 멈추지 않기).</li>
<li>파일들 사이의 호출 관계를 화살표로 그려요. 예: <code>화면 컴포넌트 → API 호출 함수 → 서버 컨트롤러</code></li>
<li>노트 마지막에 "내일 제일 먼저 열 파일 1개"를 정해서 적어요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>제출:</b> 탐험 노트(파일별 역할 1줄 + 화살표 그림 + 모르는 것 목록). 계획서 뒤에 붙여서 함께 내면 돼요. 일찍 끝났을 때만 하는 과제지만, 하면 화요일이 훨씬 편해져요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>개선 과제 착수 계획 — 대상 화면과 문제 정의</h3></div>
<span class="diff d2">난이도 ★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic dz">🎨</span>개발자 과제와의 차이</div>
<div class="dz-box">
<p><b>구조는 같고 대상만 달라요.</b> 개발자가 "코드 입구"를 찾는 자리에서, 디자이너는 "화면의 문제"를 찾아요. 계획서 양식도 같은 것을 쓰되 2번 항목을 아래처럼 바꿔서 채워요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>배정받은 개선 대상 화면을 열고, <b>현재 상태 스크린샷을 전부</b>(기본·비어 있음·로딩·오류 상태) 캡처해요.</li>
<li>화면을 처음 보는 사람처럼 사용해 보며 <b>불편한 점을 5개 이상</b> 메모해요 (사소해도 전부).</li>
<li>5개 중 이번 주에 고칠 <b>핵심 문제 1~2개</b>를 고르고, "누가 / 언제 / 왜 불편한가"를 각 1문장으로 정의해요.</li>
<li>참고할 만한 다른 서비스의 같은 화면을 2개 찾아 스크린샷과 "여기서 배울 점 1줄"을 적어요.</li>
<li>착수 계획서 양식의 2번을 "문제 정의 + 참고 사례"로 채우고, 3번 일정(화: 시안 1차 / 수: 시안 2차 / 목: 핸드오프)을 적어요.</li>
<li>멘토 확인을 받고 피드백을 6번 칸에 기록해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 디자인 착수 계획서 1장 (현재 상태 캡처 + 문제 정의 1~2개 + 참고 사례 2개 + 일정)</p>
</div>
</div>
</div>
</div>
<!-- ===================== TUE ===================== -->
<div class="day-div" id="d2">
<div class="day-badge"><div><div class="w">TUE</div><div class="n"></div></div></div>
<div>
<h2>구현 1일차 — 계획대로 가되, 어긋남을 기록한다</h2>
<p class="dm">오전 강의의 진행 포인트(작게 커밋하기)를 오후 구현에 바로 적용해요. 퇴근 전 중간보고까지가 오늘의 한 세트예요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>소과제 구현 1일차 + 퇴근 전 중간보고</h3></div>
<span class="diff d3">난이도 ★★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">계획을 실제 코드로 옮기면서, 진행 상황을 남이 이해할 수 있게 보고하는 실무 사이클을 처음부터 끝까지 경험해요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>작업 브랜치를 만들어요.</b> <code>git switch -c feature/과제이름-이니셜</code> 형태로. 브랜치 이름은 멘토가 봐도 무슨 작업인지 알 수 있게 지어요.</li>
<li><b>계획서의 "화요일 오전" 덩어리부터</b> 시작해요. 어제 정한 "제일 먼저 열 파일"을 열고, 가장 작은 변경 하나(문구 하나, 조건 하나)로 시작해서 화면에 반영되는지 먼저 확인해요.</li>
<li><b>동작하는 단위마다 커밋해요.</b> 하루 최소 3커밋. 커밋 메시지는 "무엇을 했는지"가 보이게: <code>feat: 목록 화면에 빈 상태 문구 추가</code> 처럼요.</li>
<li><b>막히면 30분 룰.</b> 30분 동안 ①에러 메시지 정독 ②검색 ③작은 실험, 이 3가지를 해 보고 그래도 안 되면 시도 내역을 정리해 멘토에게 질문해요. 질문도 실력이에요.</li>
<li><b>15:50이 되면 손을 멈추고</b> 계획서를 다시 열어요. 계획 대비 어디까지 왔는지, 예상과 달랐던 점을 체크해요.</li>
<li><b>아래 틀로 중간보고를 작성해요.</b> 1주차에 배운 보고 틀 그대로예요: 사실 → 판단 → 다음 행동.</li>
<li><b>16:30 리뷰에서</b> 중간보고를 읽고, 오늘 커밋을 화면과 함께 보여줘요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> ① 오늘의 진행 커밋(브랜치에 3커밋 이상, 푸시 완료) ② 중간보고 메시지(아래 틀)</p>
<ul>
<li>커밋 메시지만 읽어도 오늘 한 일이 보일 것</li>
<li>중간보고에 "계획과 달랐던 점"이 솔직하게 적혀 있을 것 (없으면 "없음"이라고 쓰되, 정말인지 한 번 더 생각!)</li>
</ul>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>워크시트</div>
<div class="tpl">
<div class="cap">중간보고 메시지 틀 — 메신저에 이 형식으로 보내요</div>
<pre>[중간보고] <span class="hl">과제명</span> — 구현 1일차 (화)
■ 오늘 한 것 (사실)
- <span class="hl">________________________________________</span>
- <span class="hl">________________________________________</span>
- 커밋: <span class="hl">N</span>개 (브랜치: <span class="hl">feature/______</span>)
■ 진행률 (판단)
- 계획 대비: <span class="hl">예정대로 / 조금 늦음 / 많이 늦음</span> 중 하나 + 이유 1줄
- 계획과 달랐던 점: <span class="hl">________________________________________</span>
■ 내일 할 것 (다음 행동)
- 오전: <span class="hl">______________________</span>
- 오후: <span class="hl">______________________</span> + PR 올리기
■ 도움이 필요한 것
- <span class="hl">________________ (없으면 "없음")</span></pre>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>JS 함수 연습 10제 — 손을 멈추지 않기</h3></div>
<span class="diff d1">난이도 ★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">소과제가 일찍 끝났거나 멘토 답변을 기다리는 동안, 함수 작성 근육을 유지해요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>새 파일 <code>practice-w3-tue.js</code>를 만들어요.</li>
<li>아래 문제를 <b>1번부터 순서대로</b> 풀어요. 각 문제는 함수 하나로 작성해요.</li>
<li>문제마다 <code>console.log()</code>로 예시 입력 2개 이상을 넣어 결과를 확인해요.</li>
<li>막히는 문제는 건너뛰되, 파일에 <code>// TODO: 왜 막혔는지 1줄</code>을 남겨요.</li>
<li>다 풀면(또는 시간이 되면) 커밋해서 개인 연습 저장소에 푸시해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>연습문제</div>
<div class="tpl">
<div class="cap">JS 함수 연습 10제 (답은 스스로!)</div>
<pre>1. sum(a, b) — 두 수를 받아 합을 반환하는 함수를 작성하세요.
2. isEven(n) — 정수를 받아 짝수면 true, 홀수면 false를 반환하세요.
3. maxOfThree(a, b, c) — 세 수 중 가장 큰 값을 반환하세요.
(Math.max 없이 if문으로 먼저 풀고, 그 다음 Math.max로도 풀어 보세요.)
4. repeatText(text, n) — 문자열 text를 n번 이어붙인 문자열을 반환하세요.
예: repeatText("하", 3) → "하하하"
5. countVowels(str) — 영어 문자열에서 모음(a,e,i,o,u)의 개수를 반환하세요.
대문자도 세어야 합니다.
6. reverseWords(sentence) — 문장을 받아 단어 순서를 뒤집어 반환하세요.
예: reverseWords("나는 오늘 출근했다") → "출근했다 오늘 나는"
7. sumArray(numbers) — 숫자 배열의 합을 반환하세요.
for문으로 한 번, reduce로 한 번, 두 가지 방법으로 작성하세요.
8. filterLongNames(names, minLength) — 이름 배열에서 글자 수가
minLength 이상인 이름만 담은 새 배열을 반환하세요.
예: filterLongNames(["김", "이서연", "박준"], 2) → ["이서연", "박준"]
9. toPriceText(price) — 숫자를 받아 천 단위 콤마를 붙인 문자열에
"원"을 붙여 반환하세요. 예: toPriceText(1250000) → "1,250,000원"
10. findFirstIndex(arr, target) — 배열에서 target이 처음 나오는
인덱스를 반환하고, 없으면 -1을 반환하세요.
(indexOf 없이 직접 반복문으로 구현하세요.)</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>제출:</b> <code>practice-w3-tue.js</code> 파일 링크(푸시된 커밋). 몇 번까지 풀었는지, 어디서 막혔는지를 중간보고 메시지 끝에 한 줄로 덧붙여요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>시안 1차 — 핵심 문제 하나를 화면으로</h3></div>
<span class="diff d2">난이도 ★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic dz">🎨</span>개발자 과제와의 차이</div>
<div class="dz-box">
<p><b>개발자의 "커밋"이 디자이너에겐 "시안 버전"이에요.</b> 하루의 끝에 중간보고를 보내는 것은 동일하고, 커밋 개수 대신 시안 버전 수를 적어요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>어제 정의한 핵심 문제 1개를 골라, 디자인 툴에 <b>현재 화면을 그대로 복제</b>한 프레임을 먼저 만들어요 (비교 기준).</li>
<li>같은 화면의 개선안을 <b>서로 다른 방향으로 2개</b> 그려요. 하나는 "최소 수정", 하나는 "과감한 수정".</li>
<li>각 시안 옆에 "무엇을 왜 바꿨는지"를 3줄 이내로 메모해요.</li>
<li>기본 상태만 그리지 말고, <b>비어 있음·로딩·오류 상태</b> 중 최소 1개를 함께 그려요.</li>
<li>15:50에 손을 멈추고 중간보고 틀(위 개발자용과 동일)로 보고를 작성해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 시안 1차 링크(현재 화면 + 개선안 2방향 + 메모) + 중간보고 메시지</p>
</div>
</div>
</div>
</div>
<!-- ===================== WED ===================== -->
<div class="day-div" id="d3">
<div class="day-badge"><div><div class="w">WED</div><div class="n"></div></div></div>
<div>
<h2>구현 2일차 + PR — 내 작업을 남에게 건넨다</h2>
<p class="dm">오전 강의에서 좋은 PR의 조건을 배웠어요. 오후엔 구현을 마무리하고 그 조건대로 PR을 올려요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>구현 마무리 + 첫 PR 올리기</h3></div>
<span class="diff d3">난이도 ★★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">"동작하는 코드"를 "리뷰받을 수 있는 PR"로 포장하는 법을 배워요 — PR은 코드가 아니라 커뮤니케이션이에요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>오전(10:4012:00)에 구현을 끝내는 걸 목표로</b> 어제 중간보고의 "내일 할 것"부터 이어가요. 새 기능 욕심은 금지 — 계획서의 완료 기준만 채워요.</li>
<li><b>완료 기준 체크리스트를 하나씩 검증해요.</b> 화면에서 직접 눌러 보고, 기존 기능이 깨지지 않았는지 주변 기능 3개를 함께 확인해요.</li>
<li><b>스크린샷/짧은 녹화를 준비해요.</b> 변경 전(월요일 캡처)과 변경 후를 나란히 놓을 수 있게요.</li>
<li><b>커밋을 정리해요.</b> "wip", "수정" 같은 커밋 메시지가 있으면 의미가 보이게 고민해 보고, 마지막 커밋까지 푸시해요.</li>
<li><b>아래 틀로 PR을 작성해요.</b> 제목은 50자 이내, "무엇을"이 바로 보이게. 본문은 틀의 모든 항목을 채워요.</li>
<li><b>스스로 셀프 리뷰를 해요.</b> PR의 Files changed 탭을 처음부터 끝까지 읽고, 스스로 발견한 어색한 부분에 먼저 코멘트를 달아요 (최소 1개).</li>
<li><b>리뷰어로 멘토를 지정</b>하고, 메신저로 "PR 올렸습니다 + 링크"를 알려요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 올라간 PR 링크</p>
<ul>
<li>PR 본문의 4개 섹션(무엇/왜/스크린샷/확인 방법)이 모두 채워져 있을 것</li>
<li>변경 전·후 스크린샷이 붙어 있을 것</li>
<li>셀프 리뷰 코멘트가 1개 이상 달려 있을 것</li>
</ul>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>워크시트</div>
<div class="tpl">
<div class="cap">PR 설명 틀 — 본문에 이 형식 그대로</div>
<pre>제목: <span class="hl">[과제] 목록 화면 빈 상태 안내 추가</span> ← 예시. 내 과제에 맞게
## 무엇을 바꿨나요
- <span class="hl">________________________________________</span>
- <span class="hl">________________________________________</span>
## 왜 바꿨나요
- 과제 배경 + 이 방법을 고른 이유: <span class="hl">__________________</span>
- 고민했지만 선택하지 않은 방법(있다면): <span class="hl">__________</span>
## 스크린샷
| 변경 전 | 변경 후 |
|---|---|
| (이미지) | (이미지) |
## 확인 방법 (리뷰어가 따라 할 수 있게)
1. <span class="hl">______ 화면으로 이동</span>
2. <span class="hl">______ 버튼 클릭</span>
3. <span class="hl">______ 가 보이면 정상</span>
## 스스로 확인한 것
- [ ] 완료 기준 체크리스트 전부 통과
- [ ] 주변 기능 3개 정상 동작: <span class="hl">__ , __ , __</span>
- [ ] 콘솔 에러 없음</pre>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>"내 코드 설명 문서" 1장</h3></div>
<span class="diff d1">난이도 ★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">내가 바꾼 코드를 말로 설명할 수 있어야 진짜 이해한 거예요 — 내일 리뷰 코멘트에 답할 준비도 돼요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>내 PR의 변경 파일 중 <b>가장 핵심인 파일 1개</b>를 골라요.</li>
<li>"이 코드를 처음 보는 옆자리 동료"를 독자로 상상하고, 변경한 부분이 <b>줄 단위로 무슨 일을 하는지</b> 설명하는 글을 써요.</li>
<li>설명하다가 "왜 이렇게 썼지?" 싶은 줄이 나오면 솔직하게 "이 부분은 검색해서 가져왔는데 정확히는 모름"이라고 적어요 — 그게 내일 공부할 목록이에요.</li>
<li>마지막에 "이 코드가 고장 난다면 어디부터 볼까?" 1문단을 덧붙여요.</li>
<li>A4 1장 분량이 되면 멈추고 저장해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>제출:</b> 설명 문서 1장(<code>explain.md</code>). PR 링크와 함께 내요. "정확히는 모름" 표시가 있는 문서가 없는 문서보다 <b>좋은 평가</b>를 받아요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>시안 2차 + 개발자 피드백 받기</h3></div>
<span class="diff d3">난이도 ★★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic dz">🎨</span>개발자 과제와의 차이</div>
<div class="dz-box">
<p><b>개발자의 "PR 올리기"가 디자이너에겐 "시안을 개발자에게 보여주기"예요.</b> 리뷰받을 수 있는 형태로 포장한다는 점은 완전히 같아요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>어제 2개 방향 중 <b>멘토와 함께 고른 방향 1개</b>를 다듬어 2차 시안을 만들어요.</li>
<li>기본·비어 있음·로딩·오류 <b>4개 상태를 전부</b> 그려요.</li>
<li>버튼·입력창의 <b>눌림/비활성 상태</b>도 각각 그려요.</li>
<li>개발 수습 동료 1명에게 시안을 보여주고 <b>"이대로 만들 수 있어? 애매한 부분은 어디야?"</b>를 물어 답을 그대로 받아 적어요 (최소 3개).</li>
<li>받은 피드백 중 반영할 것/안 할 것을 나누고 이유를 1줄씩 적어요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 시안 2차 링크(4개 상태 포함) + 개발자 피드백 3개와 반영 여부 메모</p>
</div>
</div>
</div>
</div>
<!-- ===================== THU ===================== -->
<div class="day-div" id="d4">
<div class="day-badge"><div><div class="w">THU</div><div class="n"></div></div></div>
<div>
<h2>리뷰 반영 — 코멘트는 공격이 아니라 선물</h2>
<p class="dm">오전 강의에서 리뷰 코멘트를 읽는 법을 배웠어요. 오후엔 실제 코멘트를 하나씩 반영하고 머지까지 가요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>리뷰 코멘트 반영 → 머지 → 배포 확인</h3></div>
<span class="diff d3">난이도 ★★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">리뷰 코멘트를 감정이 아니라 정보로 받아들이고, "무엇을 왜 고쳤는지" 설명하며 반영하는 태도를 익혀요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>코멘트를 전부 먼저 읽어요.</b> 하나씩 고치기 전에 끝까지 읽고, 아래 반영 기록표에 코멘트를 번호 붙여 옮겨 적어요.</li>
<li><b>이해 안 되는 코멘트엔 바로 되물어요.</b> "이 코멘트는 ~라는 뜻이 맞을까요?"라고 PR에서 질문하는 것도 훌륭한 반영이에요.</li>
<li><b>하나 고칠 때마다 커밋 하나.</b> 코멘트 여러 개를 한 커밋에 뭉치지 않아요. 커밋 메시지에 어떤 코멘트에 대한 수정인지 남겨요.</li>
<li><b>반영 기록표를 채워요.</b> 코멘트마다 "무엇을 / 왜 그렇게" 고쳤는지 1~2줄. 반영하지 않기로 한 코멘트가 있다면 이유를 적고 리뷰어와 합의해요.</li>
<li><b>고친 뒤 PR에 답글을 달아요.</b> 각 코멘트에 "반영했습니다 + 커밋 링크" 또는 자기 생각을 답해요. 말없이 고치기만 하면 리뷰어가 다시 다 찾아봐야 해요.</li>
<li><b>승인(Approve)을 받으면 머지해요.</b> 머지 방식(멘토가 안내한 방식)을 확인하고 실행해요.</li>
<li><b>배포를 확인해요.</b> 머지 후 개발 서버 화면에서 내 변경이 실제로 보이는지 직접 눌러 확인하고, 확인 스크린샷을 남겨요. "머지 = 끝"이 아니라 "화면에서 보임 = 끝"이에요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> ① 머지된 PR 링크 ② 반영 기록표 ③ 배포 확인 스크린샷</p>
<ul>
<li>모든 코멘트에 답글이 달려 있을 것 (반영/미반영 모두)</li>
<li>반영 기록표의 "왜" 칸이 비어 있지 않을 것</li>
</ul>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>워크시트</div>
<div class="tpl">
<div class="cap">리뷰 반영 기록표</div>
<pre># 리뷰 반영 기록 — <span class="hl">과제명</span>
| # | 코멘트 요약 | 무엇을 고쳤나 | 왜 그렇게 고쳤나 | 커밋 |
|---|---|---|---|---|
| 1 | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">____</span> |
| 2 | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">____</span> |
| 3 | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">______________</span> | <span class="hl">____</span> |
## 반영하지 않은 코멘트 (있다면)
- 코멘트: <span class="hl">__________</span> / 이유: <span class="hl">__________</span> / 리뷰어 합의: <span class="hl">예·아니오</span>
## 배포 확인
- 머지 시각: <span class="hl">__:__</span> / 화면 확인 시각: <span class="hl">__:__</span>
- 확인한 화면·동작: <span class="hl">________________________</span> (스크린샷 첨부)
## 오늘 리뷰에서 배운 것 1가지
- <span class="hl">________________________________________</span></pre>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>동료 PR 읽기 — 배운 점 3개</h3></div>
<span class="diff d1">난이도 ★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">남의 PR을 읽는 것은 공짜 과외예요 — 같은 주에 같은 코드베이스에서 일어난 일이라 흡수가 빨라요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>다른 수습 동료의 PR 1개를 골라요 (머지됐거나 리뷰 중인 것).</li>
<li>본문을 먼저 읽고, "이 PR이 뭘 하는지" 내 말로 1문장 요약해요.</li>
<li>변경 파일을 처음부터 끝까지 읽어요. 이해 안 되는 줄은 건너뛰되 개수를 세요.</li>
<li>리뷰 코멘트와 답글의 대화를 읽고, <b>배운 점 3개</b>를 메모해요 (코드 기법 / PR 쓰는 법 / 대화하는 법 무엇이든).</li>
<li>가능하다면 그 PR에 칭찬 코멘트 하나를 남겨요. "이 부분 설명이 이해하기 쉬웠어요" 같은 것도 좋아요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>제출:</b> 메모 1장(PR 링크 + 1문장 요약 + 배운 점 3개 + 이해 못 한 줄 개수). 반영 기록표 뒤에 붙여 함께 내요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>핸드오프 문서 — 시안을 만들 수 있는 명세로</h3></div>
<span class="diff d3">난이도 ★★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic dz">🎨</span>개발자 과제와의 차이</div>
<div class="dz-box">
<p><b>개발자의 "머지"가 디자이너에겐 "핸드오프"예요.</b> 어제 받은 개발자 피드백(애매하다던 부분)이 오늘 명세로 답해야 할 목록이에요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>최종 시안 프레임을 정리하고, 사용한 색·글자 크기를 <b>이름 붙은 스타일</b>로 정돈해요.</li>
<li>화면 요소 사이의 <b>간격을 숫자로</b> 표기해요 (여백·요소 간 거리, 최소 8곳 이상).</li>
<li>버튼·입력창의 <b>상태별 명세</b>를 표로 써요: 기본 / 눌림 / 비활성 / 오류 — 각각 색·문구가 어떻게 달라지는지.</li>
<li><b>인터랙션 명세</b>를 문장으로 써요: "이 버튼을 누르면 → 무엇이 → 어떻게 되는가"를 최소 3개.</li>
<li>어제 개발자가 "애매하다"고 한 부분마다 명세에 답이 있는지 체크해요.</li>
<li>같은 개발자에게 문서를 보여주고 "이제 만들 수 있겠어?"라는 답을 받아요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 핸드오프 문서 링크(간격 표기 + 상태 명세표 + 인터랙션 3개 + 개발자 확인 코멘트)</p>
</div>
</div>
</div>
</div>
<!-- ===================== FRI ===================== -->
<div class="day-div" id="d5">
<div class="day-badge"><div><div class="w">FRI</div><div class="n"></div></div></div>
<div>
<h2>첫 실무 회고 — 계획과 실제의 간격을 잰다</h2>
<p class="dm">오전엔 한 주 마무리 강의와 1:1 면담이 있어요. 오후엔 이번 주 전체를 숫자와 문장으로 되돌아봐요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>"계획 대비 실제" 회고 1장</h3></div>
<span class="diff d2">난이도 ★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">예측과 실제의 차이를 직접 재 보면, 다음 과제의 예상 소요가 훨씬 정확해져요 — 이게 경력의 핵심 근육이에요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>월요일의 착수 계획서와 화·수 중간보고를 나란히 펴 놓아요.</li>
<li>아래 비교표의 <b>"예상" 칸을 계획서에서 그대로 옮겨 적어요</b> (지금 기억으로 다시 쓰지 않기 — 그대로 옮기는 게 핵심).</li>
<li>"실제" 칸을 채워요. 커밋 시각·중간보고·PR 타임라인을 근거로 최대한 정확하게.</li>
<li>예상 못 한 문제를 <b>전부</b> 나열하고, 각각 "미리 알 수 있었나? (예/아니오)"를 표시해요.</li>
<li>"다음에 다르게 할 것 3가지"를 써요. "열심히 한다" 같은 다짐 금지 — <b>행동으로 검증 가능한 문장</b>만: 예) "계획서에 파일 후보를 적기 전에 실제로 파일을 열어 확인한다".</li>
<li>이번 주 가장 뿌듯했던 순간 1개, 가장 힘들었던 순간 1개를 솔직하게 적어요.</li>
<li>오후 1:1 면담(멘토가 시간을 잡아요)에서 회고를 함께 읽으며 이야기해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 회고 1장 (아래 양식, <code>retro-w3.md</code>)</p>
<ul>
<li>"예상" 칸이 계획서 원문 그대로일 것</li>
<li>"다음에 다르게 할 것"이 검증 가능한 행동 문장 3개일 것</li>
</ul>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>워크시트</div>
<div class="tpl">
<div class="cap">첫 실무 회고 양식</div>
<pre># 3주차 회고 — 첫 소과제
## 1. 계획 대비 실제
| 항목 | 예상 (월요일 계획서 원문) | 실제 | 차이·이유 |
|---|---|---|---|
| 구현 완료 시점 | <span class="hl">________</span> | <span class="hl">________</span> | <span class="hl">________</span> |
| 고친 파일 | <span class="hl">________</span> | <span class="hl">________</span> | <span class="hl">________</span> |
| PR 올린 시점 | <span class="hl">________</span> | <span class="hl">________</span> | <span class="hl">________</span> |
| 리뷰 코멘트 개수 | <span class="hl">____개 예상</span> | <span class="hl">____개</span> | <span class="hl">________</span> |
## 2. 예상 못 한 문제 (전부)
| 문제 | 얼마나 잡아먹었나 | 미리 알 수 있었나 |
|---|---|---|
| <span class="hl">____________</span> | <span class="hl">약 __시간</span> | <span class="hl">예 / 아니오</span> |
| <span class="hl">____________</span> | <span class="hl">약 __시간</span> | <span class="hl">예 / 아니오</span> |
## 3. 다음에 다르게 할 것 3가지 (검증 가능한 행동으로)
1. <span class="hl">________________________________________</span>
2. <span class="hl">________________________________________</span>
3. <span class="hl">________________________________________</span>
## 4. 이번 주의 순간들
- 가장 뿌듯했던 순간: <span class="hl">________________________</span>
- 가장 힘들었던 순간: <span class="hl">________________________</span>
## 5. 멘토에게 묻고 싶은 것 1가지
- <span class="hl">________________________________________</span></pre>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>「프로그램의 변화」 그림 한 장 정리</h3></div>
<span class="diff d1">난이도 ★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic goal">🎯</span>목표</div>
<p class="goal-line">이번 주 아침 기본기 코너에서 배운 "프로그램의 변화(상태가 어떻게 바뀌어 가는가)"를 그림 한 장으로 남기면 오래 기억돼요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>이번 주 아침 강의 노트를 훑고, "프로그램의 변화"에서 배운 개념을 키워드로 다 뽑아요 (변수의 값 변화, 상태 전이, 이벤트→상태→화면 등).</li>
<li>종이든 디지털이든 <b>한 장</b>에, 내 소과제 기능을 예로 들어 "사용자 행동 → 상태 변화 → 화면 변화"의 흐름을 그림으로 그려요.</li>
<li>화살표마다 "무엇이 바뀌는지"를 라벨로 붙여요.</li>
<li>그림 아래에 "이번 주 가장 새로웠던 개념 1개"를 2~3문장으로 설명해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>제출:</b> 그림 1장(사진 또는 파일). 회고와 함께 내요. 잘 그린 그림은 다음 기수 교육 자료로 쓸 수도 있어요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>디자인 회고 — 시안의 계획 대비 실제</h3></div>
<span class="diff d2">난이도 ★★</span>
</div>
<div class="t-body">
<div class="block">
<div class="bt"><span class="ic dz">🎨</span>개발자 과제와의 차이</div>
<div class="dz-box">
<p><b>회고 양식은 개발자용을 그대로 쓰되</b>, 1번 표의 항목을 "시안 1차 완료 / 개발자 피드백 개수 / 핸드오프 완료 시점"으로 바꿔 채워요. 특히 "개발자가 애매하다고 한 것들을 처음부터 명세에 넣었다면?"을 2번 표에서 꼭 다뤄요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>월요일 디자인 착수 계획서와 화·수 시안 버전들을 나란히 펴요.</li>
<li>회고 양식 1번 표를 디자인 버전 항목으로 바꿔 채워요.</li>
<li>개발자 피드백에서 나온 "애매한 부분"들을 2번 표(예상 못 한 문제)에 넣고, 미리 알 수 있었는지 표시해요.</li>
<li>다음 시안 때 다르게 할 것 3가지를 행동 문장으로 써요. 예) "시안을 넘기기 전에 4개 상태를 그렸는지 셀프 체크한다".</li>
<li>1:1 면담에서 회고를 함께 읽어요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30까지 제출:</b> 디자인 회고 1장 (비교표 + 다르게 할 것 3가지)</p>
</div>
</div>
</div>
</div>
<!-- ===================== MENTOR GUIDE ===================== -->
<section id="mentor">
<div class="eyebrow">For Mentors</div>
<h2>멘토 리뷰 가이드 (16:3017:00)</h2>
<p class="sub">매일 리뷰에서 확인할 것과 던질 질문이에요. 산출물의 완성도보다 "스스로 설명할 수 있는가"를 봐 주세요.</p>
<div class="card mt">
<div class="time">
<div class="row"><div class="t">월 · 계획서</div><div class="v"><b>확인:</b> 불확실한 점이 솔직하게 적혔는가, 일정 3덩어리가 현실적인가. <b>질문:</b> "이 과제에서 제일 자신 없는 부분이 어디예요? 그게 계획서에 적혀 있나요?"</div></div>
<div class="row"><div class="t">화 · 구현 1일차</div><div class="v"><b>확인:</b> 커밋이 의미 단위로 쪼개졌는가, 중간보고에 사실·판단·다음 행동이 구분됐는가. <b>질문:</b> "오늘 계획과 달랐던 점을 언제 알아챘어요? 더 일찍 알 수 있었을까요?"</div></div>
<div class="row"><div class="t">수 · PR</div><div class="v"><b>확인:</b> PR 본문만 읽고 리뷰가 가능한가, 셀프 리뷰 코멘트가 있는가. <b>질문:</b> "이 PR에서 리뷰어가 제일 걱정할 부분이 어디라고 생각해요?"</div></div>
<div class="row"><div class="t">목 · 리뷰 반영</div><div class="v"><b>확인:</b> 모든 코멘트에 답글이 달렸는가, 반영 기록의 "왜"가 채워졌는가, 배포 확인까지 했는가. <b>질문:</b> "가장 아팠던 코멘트는 뭐였고, 지금은 어떻게 생각해요?"</div></div>
<div class="row"><div class="t">금 · 회고</div><div class="v"><b>확인:</b> "예상" 칸이 계획서 원문 그대로인가, 다르게 할 3가지가 행동 문장인가. <b>질문:</b> "다음 소과제의 예상 소요를 지금 다시 잡는다면 뭘 근거로 잡을 거예요?" — 1:1에서 다음 주 방향까지 합의.</div></div>
</div>
</div>
</section>
<footer>
<div>AWESOMEDEV · 3주차 일일 과제집 (학생 배포용) · 4부작 중 3</div>
<div>2026 · 3주차 상세 강의안과 함께 사용</div>
</footer>
</div>