mirim-app/frontend/public/docs/week4-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

866 lines
58 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 4주차 일일 과제집 — 통합·발표 준비</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> · 일일 과제집 · 4 / 4</div>
<h1>4주차 일일 과제집<br>통합·발표 준비</h1>
<p class="lede">이 과제집은 오전 강의가 끝난 뒤, 오후 자기주도 시간(10:4012:00, 13:0016:30)에 여러분이 혼자 힘으로 수행하는 과제를 담고 있어요. 매일 16:30 멘토 리뷰 시간에 제출할 산출물이 정해져 있으니, 하루를 시작할 때 그날의 산출물부터 확인하고 거꾸로 시간을 계획해 보세요. 4주차는 지금까지 배운 것을 하나로 묶고, 금요일 미니 발표회로 마무리하는 주예요.</p>
<div class="mast-meta">
<span class="chip"><span class="dot"></span>Week 4 · 월–금</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">4주차도 리듬은 같아요. 다만 이번 주는 "만드는 것"만큼 "정리하고 말로 설명하는 것"이 중요한 주라는 점을 기억하세요.</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> — 과제 카드의 진행 순서 1~3단계를 목표로 시작해요.</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줄 / 막혔던 것 1줄 / 내일 할 것 1줄.</div></div>
</div>
<p class="mt" style="font-size:14px; color:var(--ink-soft);"><strong>규칙:</strong> 과제가 일찍 끝나면 놀지 말고 예비 과제로 — 예비 과제도 평가에 반영돼요.</p>
</div>
</section>
<!-- ================= 월요일 ================= -->
<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">1~3주차에 따로따로 배운 조각들(React, REST API, Spring Boot, DB)을 하나의 요청 흐름으로 꿰어, 시스템 전체를 스스로 설명할 수 있게 돼요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>도구를 정해요.</b> 손그림(사진 제출), 파워포인트, 그림판, 화이트보드 앱 — 뭐든 좋아요. 예쁘게 그리는 것보다 <b>단계가 빠짐없이 이어지는 것</b>이 중요해요. 10분 안에 정하고 시작하세요.</li>
<li><b>큰 상자 7개를 먼저 배치해요.</b> ① 사용자의 버튼 클릭 → ② React 컴포넌트(이벤트 핸들러) → ③ HTTP 요청(REST API 호출) → ④ Spring Boot 서버(Controller → Service) → ⑤ DB(조회/저장) → ⑥ 응답(JSON) → ⑦ React가 상태를 바꿔 화면 갱신. 화살표로 왼쪽에서 오른쪽으로 이어요.</li>
<li><b>각 상자 아래에 "실제로 일어나는 일"을 1~2줄로 적어요.</b> 예: ③번 상자에는 어떤 HTTP 메서드(GET/POST 등)를 쓰는지, 요청에 무엇이 담기는지를 적어요.</li>
<li><b>배운 개념을 연결해요.</b> 각 단계마다 1~3주차 강의에서 배운 개념을 최소 1개씩 포스트잇(또는 말풍선)으로 붙여요. 예: ②에 "이벤트 핸들러, 상태(state)", ④에 "Controller, 계층 분리", ⑤에 "테이블, SQL". 단계당 개념 1개 이상, 전체 10개 이상이 목표예요.</li>
<li><b>실패하는 경우도 1갈래 그려요.</b> 서버가 에러(예: 400 또는 500)를 돌려줄 때 흐름이 어디서 갈라지고, 화면에는 무엇이 보여야 하는지를 점선 화살표로 추가해요.</li>
<li><b>3주차 소과제와 대조해요.</b> 내가 3주차에 만든 기능에서 실제 코드 파일이 이 그림의 어느 상자에 해당하는지, 파일명을 상자 옆에 적어요(최소 3개 파일).</li>
<li><b>소리 내어 설명하며 점검해요.</b> 그림을 보며 처음부터 끝까지 2분 안에 말로 설명해 보세요. 말이 막히는 상자가 곧 이해가 빈 곳이에요. 그 부분을 보강해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>완성 점검표</div>
<div class="tpl">
<div class="cap">제출 전 셀프 체크리스트 — 전부 "예"여야 제출</div>
<pre>[ ] 7단계 상자가 모두 있고 화살표로 이어져 있다
[ ] 각 단계 아래에 "실제로 일어나는 일"이 1~2줄씩 적혀 있다
[ ] 1~3주차 개념 연결 표시가 <span class="hl">10개 이상</span> 붙어 있다
[ ] 에러(실패) 흐름이 점선으로 1갈래 이상 그려져 있다
[ ] 내 3주차 소과제의 실제 파일명이 <span class="hl">3개 이상</span> 상자 옆에 적혀 있다
[ ] 그림만 보고 2분 안에 말로 설명할 수 있다</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 전체 흐름도 1장.</p>
<ul>
<li>손그림이면 잘 보이게 찍은 사진, 디지털이면 이미지/PDF로 내보내서 제출해요.</li>
<li>파일명: <b>주4_월_흐름도_이름.png</b>(또는 pdf)</li>
<li>리뷰 시간에 멘토 앞에서 2분 설명을 실제로 하게 되니, 설명 연습까지가 과제예요.</li>
</ul>
</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>흐름도 7단계 중 <b>2분 설명에서 말이 가장 막혔던 단계</b>를 하나 고르세요.</li>
<li>그 단계에 대해 스스로 질문 3개를 적어요. 예: "서버는 JSON을 어떻게 자바 객체로 바꾸지?", "브라우저는 응답을 받은 뒤 무엇을 하지?"</li>
<li>공식 문서·강의 자료·1~3주차 필기에서 답을 찾아 각 질문에 3~5줄로 답을 적어요.</li>
<li>알게 된 내용을 흐름도의 해당 상자에 반영해서 그림을 업데이트해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>질문 3개 + 답 문서</b>(반 쪽 분량)와 <b>업데이트된 흐름도</b>를 본 과제 제출물에 덧붙여요. 예비 과제까지 한 사람의 흐름도는 리뷰에서 티가 나요.</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>같은 7단계를 그리되, 관점을 "기계"가 아니라 "사람"에 둬요.</b> 개발자 흐름도가 "요청이 어디를 지나가는가"라면, 디자이너 버전은 "그동안 사용자는 무엇을 보고, 무엇을 느끼고, 무엇을 기다리는가"예요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>본 과제와 같은 시나리오(버튼 클릭 → 화면 갱신)를 고르고, 가로축을 <b>시간</b>으로 하는 여정 지도를 준비해요.</li>
<li>각 시점마다 3줄을 채워요: <b>화면에 보이는 것</b> / <b>사용자의 생각·감정</b> / <b>뒤에서 일어나는 일(한 줄 요약)</b>.</li>
<li>특히 <b>기다리는 순간</b>(요청이 서버에 가 있는 동안)을 놓치지 마세요. 로딩 중에 화면이 무엇을 보여줘야 사용자가 불안하지 않을지 스피너·스켈레톤 등 대안을 2가지 스케치해요.</li>
<li><b>실패했을 때의 화면</b>도 1장 그려요. 에러 메시지는 사용자가 다음에 무엇을 해야 하는지 알려줘야 해요(문구까지 직접 써 보기).</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> 사용자 여정 지도 1장 + 로딩·에러 화면 스케치.</p>
<ul>
<li>파일명: <b>주4_월_여정지도_이름.png</b>(또는 pdf)</li>
<li>리뷰 때 "사용자가 가장 불안해할 순간이 어디인지" 질문을 받게 돼요.</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ================= 화요일 ================= -->
<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>착수 계획서 작성 + 구현 시작 + 중간보고</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">3주차에는 멘토가 계획을 다듬어 줬지만, 이번엔 멘토 확인 <strong>전에</strong> 스스로 계획의 완성도를 끌어올리는 힘을 길러요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>(10:4011:20) 계획서 초안을 써요.</b> 아래 양식(3주차와 같은 양식)을 그대로 채우세요. "구현 단계 쪼개기"는 <b>한 단계가 90분을 넘지 않게</b> 쪼개는 것이 기준이에요.</li>
<li><b>(11:2012:00) 스스로 계획을 공격해요.</b> 초안을 다 쓰고 나서, 아래 3가지 질문으로 자기 계획의 구멍을 찾아 계획서를 고쳐요: ① 이 중 내가 한 번도 안 해 본 것은? ② 가장 늦어질 것 같은 단계는? ③ 수요일 오후까지 안 끝나면 무엇을 뺄 것인가(축소 계획)?</li>
<li><b>(13:00) 브랜치를 만들고 첫 커밋을 해요.</b> 브랜치 이름은 3주차 규칙 그대로(예: <code>feature/기능이름-이름</code>). 첫 커밋은 빈 뼈대(파일·폴더 구조)만이라도 좋아요.</li>
<li><b>(13:0015:30) 계획서의 1~2단계를 구현해요.</b> 커밋은 <b>단계 하나 끝날 때마다</b> 남겨요. 커밋 메시지에 계획서의 단계 번호를 적으면 리뷰가 쉬워져요(예: "1단계: 목록 조회 API 뼈대").</li>
<li><b>(15:3016:00) 30분 룰 점검.</b> 오늘 30분 이상 막혔던 지점이 있었다면, 무엇을 시도했고 어디서 막혔는지 3줄로 기록해 두세요. 없었다면 "없음"이라고 적어요.</li>
<li><b>(16:0016:30) 중간보고를 써요.</b> 계획서 아래에 "1일차 중간보고" 칸을 채워요: 완료한 단계 / 예상과 달랐던 점 / 내일 첫 90분에 할 일.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">📝</span>양식</div>
<div class="tpl">
<div class="cap">착수 계획서 (3주차 양식 재사용 · 빈칸을 채우세요)</div>
<pre>■ 소과제 이름: ______________________ ■ 작성자: ________ ■ 날짜: 2026-__-__
1. 한 줄 요약 (이 기능은 사용자가 ______ 할 수 있게 한다)
→ ________________________________________________
2. 완료 조건 (이게 되면 끝) — 3개
① ______________________________________________
② ______________________________________________
③ ______________________________________________
3. 화면 스케치 / API 설계 (택1 이상)
- 화면: 어떤 요소가 어디에? (간단 스케치 첨부)
- API: 메서드 ____ / 경로 /api/____________ / 요청 본문 ______ / 응답 ______
4. 구현 단계 쪼개기 (한 단계 = 90분 이내, 순서대로)
1단계: ____________________ (예상 __분)
2단계: ____________________ (예상 __분)
3단계: ____________________ (예상 __분)
4단계: ____________________ (예상 __분)
5단계: ____________________ (예상 __분)
5. 예상 위험 & 대비
- 가장 자신 없는 부분: ______________ → 막히면: ______________
- 수요일 오후까지 안 끝나면 뺄 것(축소 계획): ______________
--- 1일차 중간보고 (16:00 작성) ---
완료한 단계: ______ / 예상과 달랐던 점: ____________________
내일 첫 90분에 할 일: ____________________</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 완성된 착수 계획서(중간보고 포함) + 오늘의 진행 커밋.</p>
<ul>
<li>계획서 파일명: <b>주4_화_계획서_이름.md</b>(또는 문서)</li>
<li>커밋: 브랜치에 <b>2개 이상</b>, 각 커밋이 계획서 단계와 연결되어야 해요.</li>
<li>멘토는 "계획서만 보고 내일 뭘 할지 알 수 있는가"를 봐요.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>JavaScript 근육 유지 — 배열·객체 연습 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>week4-practice.js</code>를 만들고, 아래 10문제를 위에서부터 순서대로 풀어요.</li>
<li>각 문제의 답 함수 아래에 <code>console.log</code>로 직접 실행해서 결과를 눈으로 확인해요.</li>
<li>검색은 자유지만, 답 코드를 통째로 복사하지 말고 <b>보고 닫은 뒤</b> 직접 타이핑하세요.</li>
<li>다 풀면 가장 어려웠던 문제 번호와 이유를 파일 맨 아래 주석으로 남겨요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">🧩</span>연습문제</div>
<div class="tpl">
<div class="cap">배열·객체 연습 10제 (답은 적혀 있지 않아요 — 직접!)</div>
<pre>1. 숫자 배열 [3, 7, 1, 9, 4]에서 가장 큰 값을 반환하는 함수 max(arr)를 작성하세요.
(Math.max 없이 반복문으로 한 번, Math.max로 한 번 — 두 가지 방법 모두)
2. 문자열 배열 ["react", "spring", "cloud"]를 모두 대문자로 바꾼
새 배열을 map으로 만들어 반환하는 함수를 작성하세요.
3. 숫자 배열에서 짝수만 골라내는 함수 evens(arr)를 filter로 작성하세요.
예: evens([1,2,3,4,5,6]) → [2,4,6]
4. 상품 배열 [{name:"키보드", price:35000}, {name:"마우스", price:18000},
{name:"모니터", price:210000}]에서 전체 가격 합계를 reduce로 구하세요.
5. 4번의 상품 배열에서 가격이 30000원 이상인 상품의 이름만 담은 배열을
만드세요. (filter와 map을 이어서 사용)
6. 객체 {id: 7, title: "회의", done: false}를 받아 done만 true로 바뀐
"새 객체"를 반환하는 함수를 작성하세요. (원본을 수정하면 안 됨,
스프레드 문법 사용)
7. 할 일 배열에서 id가 일치하는 항목의 done을 반전(토글)한 새 배열을
반환하는 함수 toggle(todos, id)를 작성하세요. 나머지 항목은 그대로.
8. 문자열 "2026-07-14"를 받아 {year: 2026, month: 7, day: 14} 객체로
바꾸는 함수를 작성하세요. (split과 Number 사용)
9. 사용자 배열 [{name:"지수", team:"dev"}, {name:"민호", team:"design"},
{name:"서연", team:"dev"}]를 받아 {dev: 2, design: 1}처럼 팀별 인원을
세는 함수를 작성하세요.
10. fetch로 GET /api/todos를 호출해 응답 JSON을 콘솔에 출력하는
async 함수 loadTodos()를 작성하세요. 실패했을 때(네트워크 에러)
"불러오기 실패"를 출력하는 try/catch도 포함하세요.
(서버가 없어도 좋아요 — catch가 실제로 동작하는지 확인해 보세요)</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>week4-practice.js</b> 파일을 본 과제 제출물에 덧붙여요. 10문제 중 <b>7문제 이상</b> 실행 확인이 목표예요.</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><b>(10:4011:30) 대상 화면을 고르고 문제를 3개 찾아요.</b> 1~3주차에 팀이 만든 화면 중 하나를 골라 스크린샷을 찍고, "사용자 입장에서 불편한 점"을 3개 적어요. 각 문제에 근거를 붙여요(예: "버튼이 어디 있는지 3초 이상 찾게 됨").</li>
<li><b>(11:3012:00) 개선 계획서를 써요.</b> 문제 3개 / 각각의 개선 방향 1줄 / 이틀 일정(오늘: 러프, 내일: 완성) / "안 바꿀 것"(범위 밖) 목록.</li>
<li><b>(13:0015:00) 러프 시안을 그려요.</b> 종이 또는 디자인 도구로 개선안 레이아웃을 잡아요. 색·아이콘은 아직 대충, <b>배치와 흐름</b>에 집중하세요. 대안을 2가지 이상 그려서 비교해요.</li>
<li><b>(15:0016:00) 개발 동료 1명에게 5분 인터뷰.</b> 두 대안을 보여주고 어느 쪽이 이해하기 쉬운지, 구현 난이도는 어떤지 듣고 기록해요.</li>
<li><b>(16:0016:30) 내일 할 일을 3줄로 정리해요.</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> 개선 계획서 + 러프 시안 2안 + 인터뷰 기록.</p>
<ul>
<li>파일명: <b>주4_화_개선계획_이름</b> 폴더에 모아서 제출해요.</li>
<li>멘토는 "문제 정의에 근거가 있는가"를 가장 먼저 봐요.</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ================= 수요일 ================= -->
<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">오전 강의에서 코드 리뷰 관점(읽는 사람 입장)을 배웠어요. 오늘은 그 눈으로 "내 코드"를 스스로 리뷰해요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>구현 마무리 + PR 올리기 + 셀프 리뷰 코멘트 3개</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로 정리하고, 남이 지적하기 전에 자기 코드의 약점을 스스로 찾아내는 눈을 길러요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>(10:40) 어제 중간보고의 "첫 90분 할 일"부터 시작해요.</b> 계획서를 열어 놓고, 끝낸 단계에 체크하며 진행해요.</li>
<li><b>(13:00) 축소 판단 시점.</b> 남은 단계를 보고 16:00까지 다 못 끝낼 것 같으면, 계획서의 "축소 계획"을 지금 실행해요. 늦게 결정할수록 손해예요. 축소했다면 PR 설명에 그 사실과 이유를 적어요.</li>
<li><b>(15:00) 구현을 마무리하고 완료 조건 3개를 직접 확인해요.</b> 브라우저에서 실제로 눌러 보고, 안 되는 것이 있으면 완료 조건 옆에 솔직하게 "미완"이라고 표시해요.</li>
<li><b>(15:0015:30) PR을 올려요.</b> 제목은 "기능 요약 (이름)", 본문에는 ① 무엇을 만들었나 ② 어떻게 테스트했나 ③ 아쉬운 점/미완 을 적어요. 스크린샷 1장 이상 첨부.</li>
<li><b>(15:3016:20) 셀프 리뷰: 내 PR에 코멘트 3개를 직접 달아요.</b> 아래 양식의 세 관점에서 하나씩, 코드 줄을 정확히 지정해서 달아요. "여기 좋음" 같은 칭찬 말고, 리뷰어가 지적할 법한 것을 스스로 먼저 지적하는 거예요.</li>
<li><b>(16:20) 계획서에 2일차 결과를 기록해요.</b> 계획 대비 실제(단계별 예상 시간 vs 실제 시간)를 한 줄씩 적어요. 목요일 발표 자료의 "배운 점" 재료가 돼요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">📝</span>양식</div>
<div class="tpl">
<div class="cap">셀프 리뷰 코멘트 3개 — 관점별로 1개씩</div>
<pre>코멘트 ① <span class="hl">[읽기 쉬움]</span> — 이름·구조가 헷갈리는 곳
위치: 파일 ________ / 줄 ____
내용: "이 변수(함수) 이름은 ______라서 오해할 수 있다.
______로 바꾸면 더 명확하다." 처럼 대안까지 적기
코멘트 ② <span class="hl">[깨질 수 있음]</span> — 값이 없거나 이상할 때
위치: 파일 ________ / 줄 ____
내용: "______가 비어 있으면(또는 서버가 에러를 주면) 여기서
______가 일어난다. ______ 처리가 필요하다."
코멘트 ③ <span class="hl">[중복·정리]</span> — 반복되거나 자리가 어색한 코드
위치: 파일 ________ / 줄 ____
내용: "이 코드는 ______와 거의 같다. 함수로 빼면(또는 ______로
옮기면) 한 곳만 고치면 된다."</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> PR 링크 + 셀프 리뷰 코멘트 3개.</p>
<ul>
<li>PR 본문 3요소(무엇을/어떻게 테스트/아쉬운 점) + 스크린샷 필수.</li>
<li>셀프 리뷰 3개는 각각 다른 관점(읽기 쉬움 / 깨질 수 있음 / 중복·정리)이어야 해요.</li>
<li>미완이 있어도 감점보다 <b>솔직한 기록</b>이 더 높게 평가돼요.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>코드 판단 문제 8제 — 어느 쪽이 나을까?</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>아래 8문제를 읽고, 각 문제에 <b>선택 + 이유 2줄</b>을 문서로 적어요.</li>
<li>"상황에 따라 다르다"고 답해도 좋아요. 단, 어떤 상황이면 어느 쪽인지 적어야 해요.</li>
<li>다 쓰면 내 어제·오늘 코드에서 같은 상황이 있었는지 1개 찾아 표시해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">🧩</span>판단 문제</div>
<div class="tpl">
<div class="cap">코드 판단 문제 8제 — 선택과 이유를 적으세요</div>
<pre>1. 변수 이름: data1, data2, data3 vs todos, doneTodos, activeTodos
— 어느 쪽? 왜?
2. 한 함수가 120줄 vs 30줄짜리 함수 4개로 분리
— 어느 쪽? 분리하면 무엇이 좋아지고 무엇이 번거로워질까?
3. React에서 서버 응답을 기다리는 동안: 아무것도 안 보여줌 vs
"불러오는 중..." 표시 — 어느 쪽? 사용자는 각각 어떻게 느낄까?
4. 같은 계산 코드가 3군데 복사되어 있음: 그대로 둠 vs 함수로 추출
— 언제 추출하는 게 이득이고, 언제 그냥 둬도 될까?
5. API 응답이 실패했을 때: console.log만 찍음 vs 화면에 에러 메시지
표시 — 개발 중일 때와 실제 사용자가 쓸 때, 각각 어느 쪽?
6. Spring Boot에서 요청 값 검증: 프론트에서 했으니 서버는 생략 vs
서버에서도 다시 검증 — 어느 쪽? 프론트 검증만 있으면 무슨 일이
생길 수 있을까?
7. 커밋: 하루 작업을 저녁에 커밋 1개로 vs 단계마다 작은 커밋 여러 개
— 어느 쪽? 나중에 버그를 찾을 때 무엇이 달라질까?
8. 주석: 코드 한 줄마다 설명 주석 vs "왜 이렇게 했는지"만 주석
— 어느 쪽? 주석이 코드와 달라져 버리면 어떤 문제가 생길까?</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>선택+이유 문서</b>를 본 과제 제출물에 덧붙여요. 8문제 전부, 이유 없이 선택만 적은 답은 인정되지 않아요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>"내가 다시 디자인한다면" 개선안 — 2일차: 완성과 전·후 비교</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>개발 팀의 "PR + 셀프 리뷰"에 해당하는 것이 디자이너의 "완성 시안 + 전·후 비교 문서"예요.</b> 남에게 보여줄 수 있는 형태로 정리하고, 자기 시안의 약점도 스스로 3개 적어요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>(10:4014:30) 어제 고른 대안을 완성 시안으로 다듬어요.</b> 색·간격·글자 크기를 정리하고, 실제 문구(버튼 라벨, 에러 메시지)를 진짜처럼 채워요. "여기에 텍스트" 같은 자리표시 문구는 금지.</li>
<li><b>(14:3015:30) 전·후 비교 문서를 만들어요.</b> 왼쪽에 기존 화면, 오른쪽에 개선안을 나란히 놓고, 화살표로 바뀐 지점 3곳을 짚으며 각각 "무엇이 문제였고 → 어떻게 바꿨고 → 사용자에게 뭐가 좋아지는지"를 한 줄씩 적어요.</li>
<li><b>(15:3016:00) 셀프 리뷰 3개.</b> 개발 팀과 똑같이, 내 시안의 약점을 스스로 3개 적어요(예: "이 색 대비는 밝은 화면에서 잘 안 보일 수 있다").</li>
<li><b>(16:0016:30) 개발 동료 1명에게 구현 난이도 확인.</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>파일명: <b>주4_수_개선안_이름</b> 폴더로 제출해요.</li>
<li>이 결과물이 목요일 발표 자료의 핵심 재료가 돼요.</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ================= 목요일 ================= -->
<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">오전에 발표 구성법 강의와 1:1 코칭 순서를 배정받았어요. 오후는 온전히 발표 자료를 만드는 시간이에요.</p>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">본 과제</div><h3>10분 발표 슬라이드 초안 + 소리 내어 리허설 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">4주간 배운 것을 "남이 이해할 수 있는 이야기"로 재구성해요 — 설명할 수 있어야 진짜 아는 거예요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>(10:4011:10) 슬라이드를 만들기 전에, 아래 구성 가이드의 빈칸부터 채워요.</b> 각 장에서 할 말이 한 줄로 정해져야 슬라이드가 산으로 안 가요.</li>
<li><b>(11:1012:00) 도입 1장 + 개념 3장의 초안을 만들어요.</b> 슬라이드 1장에 핵심 문장 1개 + 그림 1개가 기본이에요. 글자를 문단으로 채우지 마세요 — 읽는 자료가 아니라 말하는 자료예요.</li>
<li><b>(13:0014:30) 우리 시스템 연결 2장 + 배운 점 1장을 만들어요.</b> 연결 2장에는 월요일 흐름도와 화·수 소과제(디자이너는 개선안) 결과물을 꼭 넣어요. 새로 그리지 말고 이번 주 산출물을 재사용하세요.</li>
<li><b>(14:3015:00) 그림을 점검해요.</b> 슬라이드 7장 중 그림·스크린샷·도식이 있는 장이 <b>5장 이상</b>인지 세어 보세요. 부족하면 글을 그림으로 바꿔요.</li>
<li><b>(15:0015:40) 소리 내어 리허설 1회.</b> 타이머를 켜고 실제로 서서, 실제 목소리 크기로 처음부터 끝까지 말해요. 속으로 읽는 건 리허설이 아니에요. 걸린 시간을 기록해요(목표 9~11분).</li>
<li><b>(15:4016:20) 리허설에서 발견한 문제를 고쳐요.</b> 말이 꼬인 장, 시간을 너무 잡아먹은 장을 표시하고 슬라이드나 대본을 수정해요. 1:1 코칭에서 물어볼 질문 2개를 적어 두세요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">📝</span>양식</div>
<div class="tpl">
<div class="cap">발표 구성 가이드 — 슬라이드를 만들기 전에 빈칸을 채우세요</div>
<pre>발표 제목: 내가 이해한 ______________________ (10분)
<span class="hl">[도입 1장]</span> 4주 전의 나는 ______를 몰랐다.
지금의 나는 ______를 설명할 수 있다. (호기심을 끄는 한 문장)
<span class="hl">[개념 3장]</span> 내가 고른 핵심 개념 3개 — 각 장에서 할 말 한 줄
개념 ①: ____________ — "____________________________"
개념 ②: ____________ — "____________________________"
개념 ③: ____________ — "____________________________"
(예: 클라이언트와 서버 / API / 상태와 화면 / DB / 배포와 클라우드
중에서 자신 있는 3개. 디자이너는 사용자 여정 / 화면 설계 /
피드백 반영 등으로 바꿔도 좋아요)
<span class="hl">[우리 시스템 연결 2장]</span> 개념이 우리가 만든 것 어디에 있는지
연결 ①: 개념 __는 내가 만든 ______에서 이렇게 쓰였다 (스크린샷/흐름도)
연결 ②: 개념 __는 ______에서 이렇게 쓰였다 (스크린샷/시안)
<span class="hl">[배운 점 1장]</span> 기술 말고 "일하는 방식"에서 배운 것 1가지
→ ________________________________________________
(예: 계획을 쪼개는 법, 막혔을 때 질문하는 법, 리뷰 받는 법)</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 발표 자료 초안(7장 내외) + 리허설 기록.</p>
<ul>
<li>리허설 기록: 걸린 시간 / 막힌 장 / 내일 고칠 것 — 3줄이면 충분해요.</li>
<li>1:1 코칭 질문 2개도 함께 제출해요.</li>
<li>완성도보다 <b>구조(7장 구성이 서 있는가)</b>를 봐요. 꾸미기는 내일 아침에.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>예상 질문 5개 만들고 답 준비하기</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>내 발표를 처음 듣는 사람이 되었다고 상상하고, 나올 법한 질문 5개를 적어요. 최소 1개는 "가장 받기 싫은 질문"이어야 해요.</li>
<li>각 질문에 3~4문장 답을 적어요. 모르는 부분이 섞여 있으면 "여기까지는 알고, 여기부터는 아직 공부 중"이라고 답하는 연습도 해요.</li>
<li>답 5개를 소리 내어 한 번씩 말해 봐요.</li>
<li>질문·답 문서를 발표 자료와 같은 폴더에 저장해요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>예상 질문·답 문서(5문항)</b>를 본 과제 제출물에 덧붙여요. 금요일 발표회에서 멘토가 이 중 하나를 실제로 물어볼 수 있어요.</p>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">디자이너 과제</div><h3>디자이너의 10분 발표 — 같은 구성, 다른 재료</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>진행 순서와 7장 구성, 리허설, 제출물은 본 과제와 완전히 같아요.</b> 다른 것은 재료뿐: 개념 3장은 "사용자 여정·화면 설계·피드백 반영" 같은 디자인 개념으로, 우리 시스템 연결 2장은 월요일 여정 지도와 화·수 개선안 전·후 비교로 채워요. 단, 최소 1장은 "개발 팀과 협업하며 알게 된 기술 이야기"(예: 왜 로딩 화면이 필요한가)를 넣어요 — 그게 이번 4주의 차별점이에요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 발표 자료 초안(7장 내외) + 리허설 기록 + 코칭 질문 2개. (본 과제와 동일)</p>
</div>
</div>
</div>
</div>
<!-- ================= 금요일 ================= -->
<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">오후에 미니 발표회와 중간평가 면담이 있어요. 오전 자기주도 시간은 최종 점검, 발표 후에는 자기평가서를 써요.</p>
</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 goal">🎯</span>목표</div>
<p class="goal-line">준비한 것을 실전에서 전달해 보고, 4주간의 나를 스스로 공정하게 평가하는 경험을 해요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li><b>(10:4011:10) 어제 코칭 피드백을 반영해요.</b> 1:1 코칭에서 받은 지적을 슬라이드에 반영하되, <b>새 장을 추가하지 마세요</b>. 발표 직전의 큰 수술은 사고의 지름길이에요. 고치는 건 문구·그림·순서까지만.</li>
<li><b>(11:1011:40) 최종 리허설 1회.</b> 어제처럼 타이머를 켜고 서서, 소리 내어 처음부터 끝까지. 9~11분 안에 들어오는지 확인하고, 넘치면 개념 장에서 말을 줄여요(장을 빼는 게 아니라 말을 줄이는 거예요).</li>
<li><b>(11:4012:00) 발표 환경을 점검해요.</b> 발표용 PC에서 자료가 열리는지, 글자가 뒤에서도 보이는지, 시연 화면이 있다면 미리 띄워지는지 확인해요. 자료는 2곳 이상에 저장(로컬 + 클라우드).</li>
<li><b>(13:00) 미니 발표회.</b> 내 차례가 아닐 때는 청중 역할이 과제예요: 발표자마다 <b>좋았던 점 1개 + 질문 1개</b>를 메모하고, 질의응답 때 최소 1번은 손을 들어 질문해요.</li>
<li><b>(발표회 종료 후16:20) 자기평가서를 작성해요.</b> 평가 루브릭 문서의 자기평가 양식(아래에 동일 양식 수록)을 채워요. 근거 없는 점수는 인정되지 않아요 — 모든 항목에 이번 주 산출물을 근거로 대세요.</li>
<li><b>(16:2016:30) 최종 발표자료와 자기평가서를 제출해요.</b> 중간평가 면담은 이 자기평가서를 바탕으로 진행돼요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra">📝</span>양식</div>
<div class="tpl">
<div class="cap">자기평가서 (평가 루브릭 문서의 자기평가 양식과 동일)</div>
<pre>이름: ________ 작성일: 2026-__-__
1. 항목별 자기평가 — 각 항목에 1~4점과 <span class="hl">근거(이번 주 산출물·사례)</span>를 함께
(1: 아직 어려움 / 2: 도움 받으면 가능 / 3: 혼자 가능 / 4: 남에게 설명 가능)
① 시스템 이해 (요청 흐름을 설명할 수 있다) 점수: __
근거: ____________________________________________
② 구현 능력 (계획한 기능을 완성했다) 점수: __
근거: ____________________________________________
③ 일하는 방식 (계획·커밋·30분 룰·리뷰 반영) 점수: __
근거: ____________________________________________
④ 소통 (질문·발표·리뷰 코멘트) 점수: __
근거: ____________________________________________
2. 4주 전의 나와 지금의 나 — 가장 크게 달라진 것 1가지 (3~5문장)
→ ________________________________________________
3. 가장 어려웠던 순간과 그때 내가 한 행동 (3~5문장)
→ ________________________________________________
4. 남은 기간에 집중하고 싶은 것 2가지 (구체적으로)
① ______________________________________________
② ______________________________________________
5. 멘토에게 하고 싶은 말 / 요청 (자유)
→ ________________________________________________</pre>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 최종 발표자료 + 자기평가서.</p>
<ul>
<li>발표자료 파일명: <b>주4_금_발표_이름.pdf</b>(발표에 쓴 최종본 그대로)</li>
<li>자기평가서: 4개 항목 전부 점수+근거, 서술 문항 전부 작성.</li>
<li>청중 메모(좋았던 점+질문)도 함께 제출하면 소통 항목 평가에 반영돼요.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="task">
<div class="t-head">
<div><div class="kind">예비 과제</div><h3>4주 산출물 아카이브 — 내 포트폴리오의 씨앗</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">4주간 만든 것을 한 폴더에 정리해, 나중에 포트폴리오로 키울 수 있는 상태로 만들어요.</p>
</div>
<div class="block">
<div class="bt"><span class="ic step">📋</span>진행 순서</div>
<ol class="steps">
<li>폴더를 하나 만들고(<code>어썸데브_4주_이름</code>), 주차별 하위 폴더 4개를 만들어요.</li>
<li>각 주의 대표 산출물을 모아 넣어요: 계획서, 흐름도, PR 링크 목록, 발표자료, 시안 등.</li>
<li>맨 위에 <code>README</code> 문서를 만들어 "무엇을 만들었고, 뭘 배웠는지"를 주차별 2줄씩, 총 8줄로 적어요.</li>
<li>지금은 부끄러운 결과물도 빼지 마세요 — 성장의 증거는 "전"이 있어야 보여요.</li>
</ol>
</div>
<div class="block">
<div class="bt"><span class="ic extra"></span>제출</div>
<div class="extra-box">
<p><b>아카이브 폴더(README 포함)</b>를 제출해요. 이 폴더는 중간평가 면담 자료로도 쓰여요.</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> 자기평가서의 ② "구현 능력" 항목만 "시안 완성도(문제 정의 → 시안 → 전·후 비교를 끝까지 완성했다)"로 바꿔 읽고 평가하세요. 근거는 화·수의 개선안 산출물에서 가져와요. 예비 과제(아카이브)도 동일하게 해당돼요.</p>
</div>
</div>
<div class="block">
<div class="bt"><span class="ic out">📤</span>산출물 · 제출</div>
<div class="out-box">
<p><b>16:30 제출:</b> 최종 발표자료 + 자기평가서(② 항목만 치환). 파일명 규칙은 본 과제와 같아요.</p>
</div>
</div>
</div>
</div>
<!-- ================= 멘토 리뷰 가이드 ================= -->
<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> 그림 없이 말로만 2분 설명을 시켜 보고, "④에서 ⑤로 갈 때 정확히 무엇이 전달되나요?"처럼 상자 사이의 <b>화살표</b>를 파고드는 질문을 해요.</div></div>
<div class="row"><div class="t"></div><div class="v"><b>계획서가 스스로 서는지 확인.</b> "이 계획서만 보고 내일 아침에 뭘 할지 알겠어요?"를 기준으로 보고, "가장 늦어질 것 같은 단계와 그때의 축소 계획"을 학생 입으로 말하게 해요.</div></div>
<div class="row"><div class="t"></div><div class="v"><b>셀프 리뷰의 깊이 확인.</b> 코멘트 3개 중 하나를 골라 "그럼 어떻게 고칠 건가요?"를 물어요. 미완이 있다면 축소 판단을 13:00에 했는지(늦지 않았는지)를 확인해요.</div></div>
<div class="row"><div class="t"></div><div class="v"><b>구조와 시간 확인.</b> 7장 구성이 서 있는지, 리허설 시간이 9~11분에 들어오는지 보고, "이 발표에서 딱 한 장만 남긴다면 어느 장인가요?"로 핵심을 묻어요. 꾸미기 지적은 최소로.</div></div>
<div class="row"><div class="t"></div><div class="v"><b>자기평가의 근거 확인.</b> 점수보다 근거를 봐요. 점수가 근거보다 높으면 "그 점수의 근거가 되는 산출물이 뭐예요?"를, 낮으면 "이 산출물이 있는데 왜 낮게 줬어요?"를 물어 스스로 조정하게 해요. 면담은 4번 항목(남은 기간 집중할 것)에서 출발해요.</div></div>
</div>
</div>
</section>
<footer>
<div>AWESOMEDEV · 4주차 일일 과제집 (학생 배포용) · 4부작 중 4</div>
<div>2026 · 4주차 상세 강의안과 함께 사용</div>
</footer>
</div>