38 Commits

Author SHA1 Message Date
57a334545a feat: 주소 입력을 카카오 우편번호 검색으로 — 주소 오타·누락 원천 차단
- lib/postcode.js: 다음(카카오) 우편번호 서비스 지연 로딩 + embed 방식
  (팝업은 모바일에서 차단될 수 있어 폼 안에 펼치는 embed 채택, 학습 주석 포함)
- 가입·내 정보 페이지: 기본주소는 [주소찾기] 검색으로만 채워지는 읽기 전용,
  상세주소(동·호수)만 직접 입력 → 저장 시 '[우편번호] 도로명주소, 상세' 로 합침
- 검색 결과: 우편번호 + 표준 도로명주소 + 건물명 자동 입력
- 배경: 학생 2명의 가입 주소가 시/군/구 누락 등 불완전했음 —
  '사용자의 실수는 실수할 수 없는 UI로 막는다'

운영 검증: 버튼 클릭 → 카카오 위젯(postcode.map.kakao.com) embed 로드 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 12:01:36 +09:00
f557d7a189 feat: 학생용 '내 정보' 확인·수정 페이지 (/profile)
- GET/PUT /api/profile/me — 경로에 id 없이 세션에서 본인 식별 (IDOR 원천 차단, 주석화)
- 수정 가능: 이름·회사이메일·생년월일·연락처·주소·학교·전공·비상연락처
  불가: 아이디(불변)·트랙(멘토 소관)·동의시각(증빙은 본인도 수정 불가)
- 이메일 변경 시에만 중복 검사(내 값 유지는 통과), 검증 규칙은 가입과 동일
- 수정할 엔티티는 트랜잭션 안 재조회(managed) — 비밀번호 변경 버그의 교훈 적용
- DTO 변환을 트랜잭션 안에서 — open-in-view:false의 LAZY 함정 회피 (주석화)
- 수정 시 멘토 텔레그램 알림 (경리 CSV 재발급 필요 알림)
- 네비 👤 아이콘 (학생만 표시), Field 컴포넌트는 밖에 정의(키보드 버그 교훈 참조)
- 테스트 3개 추가 → 전체 25개 통과

운영 E2E 검증: 조회→이메일·주소 수정→재조회 반영 확인.
배경: 가입한 학생 2명의 주소가 불완전하고 이메일 오타 의심 — 본인이 직접 교정 가능하게.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:52:04 +09:00
0336213ca2 fix: 기본기 전수 감사(38 에이전트, 172파일)에서 확정된 버그 10건 수정
[major]
- client.js 401 인터셉터: /auth/** 전체를 예외로 — 비밀번호 변경에서 현재 비번
  틀리면 세션 만료로 오인해 /login으로 튕기던 버그 (에러 안내 도달 불가였음)
- Submission (assignment_id,user_id) 유니크 제약 추가(엔티티+운영DB) —
  동시 제출 시 중복 행 → 이후 해당 과제 재제출 영구 500 방지. 자매 엔티티와 일관화

[minor]
- AuthContext: 마운트 시 /auth/me의 늦은 401이 로그인 성공을 덮는 경쟁 → 함수형 업데이트로 보존
- AssignmentsPage: key에 제출 id 포함 → 첫 제출 직후 카드 리마운트로 성공 메시지 소실
  → key를 과제 id로 고정, 메시지는 접히는 영역 밖으로
- CodeEditor: 텍스트 선택 후 Tab 시 커서가 선택 길이만큼 밀림 (selectionEnd+2 → selectionStart+2)
- div.olist>ol 마크업 오류로 목록 번호 이중 표시 — 7개 강좌 10곳 전부 ol.olist로 통일
  (감사가 3파일 발견, 전역 grep으로 4파일 추가 확보)
- SignupPage 검증을 서버 규칙과 일치: 아이디 4자+영숫자, 생년월일 과거만
- LoginRequest @NotBlank + @Valid: username 누락 시 NPE 500 → 400
- server.error.include-message: always — 서버의 한국어 에러 사유가 화면까지 전달
  ('이미 사용 중인 아이디입니다' 등, 그동안 폴백 문구만 보였음)

검증: 테스트 22개 통과, 운영에서 400/409 message/비번변경 에러표시 확인.
각 버그의 원리를 소스 주석에 학습 포인트로 기록.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:42:05 +09:00
03fdde7495 fix: 모바일 가입 폼에서 한 글자마다 키보드 닫히는 버그 수정
원인: Field 컴포넌트를 SignupPage '안에서' 정의 → 글자 입력 → setForm 재렌더
→ Field가 매번 새 컴포넌트 타입으로 인식 → input 리마운트 → 포커스 상실
→ 모바일 키보드 닫힘. React의 대표 함정.

수정: Field를 컴포넌트 밖으로 이동, value/onChange를 props로 전달.
버그의 원리와 교훈('컴포넌트 안에서 컴포넌트를 정의하지 말 것')을
소스 주석에 학습 포인트로 기록 — 학생들이 같은 함정을 미리 배우게.

검증: 연속 입력(리렌더 3회) 후에도 동일 DOM 노드 유지·포커스 유지 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:03:35 +09:00
c0b783613d feat: 회사 이메일 권장 규칙 안내 — 영문 이름.성 형식 (예: gildong.hong)
회사 이메일은 고객사와의 대외 소통에도 쓰이므로 영문 이름 기반을 권장.
가입 폼 placeholder와 안내 문구로 자연스럽게 유도.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:51:27 +09:00
765d30c479 fix(ui): 반응형 전수 조사에서 발견된 문제 4건 수정
전수 조사 범위: 앱 화면 14개 + 강좌 71개 + 학습 문서 17개 × 모바일(375)/태블릿(768)/데스크톱(1280)
— 가로 넘침 자동 검출(0건) + 주요 화면 육안 검증

수정:
- 문서 뷰어 '← 뒤로가기' 버튼 모바일에서 두 줄 꺾임 → nowrap
- 멘토 명단·퀴즈 표: '트랙'→'트/랙' 세로 꺾임 → .table--nowrap 유틸 신설
  (전역 td nowrap은 overflow:hidden 카드의 긴 셀을 잘라먹어 선택 적용)
- 가입 동의 체크박스: 두 줄 라벨에서 정렬 어긋남 → flex-start
- SQL 문제 설명 '왼쪽 아래' → '문제 아래' (실제 배치와 불일치, 시드+운영 DB 동시 수정)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:44:50 +09:00
a2eb5e587a feat(security): 로그인 무차별 대입 방어 — 5회 실패 시 5분 잠금
- LoginAttemptService: (아이디+IP) 단위 인메모리 실패 카운트
  · 아이디 단독 키 → 잠금 악용 DoS, IP 단독 키 → 공용 IP 연대 잠금. 둘을 묶어 해결
  · Clock 주입으로 '5분 후 해제'를 가짜 시계로 테스트 (ClockConfig 추가)
  · 5회 도달 시 WARN 로그(보안 사건 추적), 맵 청소로 메모리 누수 방지
- AuthController: 검증 '전에' 잠금 확인(잠금 중엔 정답 확인 기회도 안 줌) → 429
  · X-Forwarded-For에서 클라이언트 IP 추출 (Caddy 뒤 전용 — 신뢰 조건 주석화)
- LoginPage: 429 시 '5분 뒤 다시 시도' 안내
- 테스트 5개 추가 → 전체 22개 통과

운영 검증: 5회 실패 → 401, 6회째 → 429 확인. 다른 IP·계정은 영향 없음.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:17:37 +09:00
a52999d81d feat: 텔레그램 알림 봇 연동 — 학생 가입·과제·코딩 제출을 멘토에게 즉시 알림
- TelegramNotifier: 봇 API sendMessage 호출. 두 가지 원칙 —
  · 알림 실패가 본 기능(가입·제출)을 절대 막지 않는다: 예외 전부 삼킴 + @Async 비동기
  · 시크릿은 env로만: TELEGRAM_BOT_TOKEN/CHAT_ID 비어 있으면 기능이 조용히 꺼짐(로컬 무설정 OK)
  · 에러 로그에 예외 종류만 남김 — HTTP 에러 메시지의 URL에 토큰이 포함되는 유출 경로 차단
- AsyncConfig: @EnableAsync (없으면 @Async가 조용히 무시되는 함정 문서화)
- 연결 지점 3곳: AuthService.signup(가입) / CodingService.submit(코딩) / SubmissionService(과제)
- 테스트: 생성자에 mock 주입 + 가입 시 알림 발송 검증 1건 추가 → 전체 17개 통과

운영 검증: 봇(@awesomedevmirim_bot)→'2026 현장실습 사전 과제' 그룹 발송 확인,
실가입 E2E로 알림 발송 확인. 토큰은 서버 .env에만 존재(git 미포함).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:09:52 +09:00
0b6c2a15a7 feat: 학습 센터에도 회사 한 줄 소개 추가 (대시보드와 동일 문구)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 10:00:28 +09:00
8b96aab694 feat: 대시보드에 회사 한 줄 소개 추가
히어로 하단에 '㈜어썸데브 — 고객과 함께 더 나은 세상을 만들어 나가는 기업'
(홈페이지 모토와 동일 문구). 운영 반영·확인 완료.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:57:23 +09:00
6820345069 docs: 수습 가이드 회사 소개 보강 — 사업영역·회사 위치 추가
홈페이지(awesomedev.dev)와 대조 검증: 모토·법인명(주식회사)·대표명 모두 일치 확인.
하는 일을 홈페이지 사업영역(SI/SM·빅데이터·통합관리 솔루션)으로 구체화하고,
출근할 학생들을 위해 회사 위치(강남구 테헤란로) 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:54:49 +09:00
7af0298d96 style: 로그인 페이지 '미림마이스터고 수습 학습 플랫폼' 부제 제거
코딩 기초 페이지의 실습 과제가 이 문구를 참조하고 있어
'로고 문구(AWESOMEDEV 수습 플랫폼) 바꿔 보기'로 함께 수정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:49:54 +09:00
a5d4437b27 feat: SQL 코딩 문제 추가 — 브라우저 SQLite(sql.js)로 실행·자동채점
- 문제 5개 시드: SELECT* → WHERE → ORDER BY+LIMIT → GROUP BY → JOIN
  (직원·부서 연습 데이터, SQL 입문 강좌 진도 순서와 일치)
- 실행 방식: sql.js(SQLite WASM)로 학생 브라우저 안 1회용 메모리 DB에서 실행
  → 서버 DB 무접촉. DROP/DELETE도 자유롭게 실험 가능 (runJs.js와 같은 격리 철학)
- 채점: 값만 비교(컬럼 별칭 허용), ORDER BY 문제만 행 순서 채점(orderMatters)
- 화면: 데이터 살펴보기(테이블+데이터), 실행 결과 표 vs 기대 결과 표 나란히 비교
- CodingProblem: setupSql 컬럼, isAutoGraded에 SQL 포함(JAVA만 수동)
- CodingServiceTest 3개 추가: SQL 채점값 저장·PASSED, JAVA 채점값 폐기(조작 방지), 빈 코드 400
  → 전체 17개 테스트 통과

운영 검증(브라우저 E2E): 정답 실행 '통과', 오답 시 기대 결과 비교 표시,
제출 시 서버에 PASSED 1/1 저장 확인. 문제 수 20→25 재시드.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:47:54 +09:00
cb0fb54185 feat: 회원가입 개인정보 수집·이용 동의 추가 (고지 후 동의 + 시각 증빙)
- 가입 화면: 수집 항목·목적·보유기간·거부권 안내문 + 필수 동의 체크박스
- SignupRequest: privacyConsent @NotNull @AssertTrue (서버가 최종 방어선)
- AuthService: 서비스 계층 이중 확인(defense in depth), 동의 시각은 서버 시계로 기록
- StudentProfile: privacy_consent_at 컬럼 추가 — boolean이 아닌 timestamp로 증빙
- 경리 CSV: '개인정보동의일' 열 추가 (감사 대비)
- 테스트 2개 추가: 동의 없으면(false/null) 400, 정상 가입 시 동의 시각 기록
  → 전체 14개 테스트 통과

운영 검증: 동의 false/누락 → 400, 동의 → 201 + DB privacy_consent_at 기록 확인

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:30:22 +09:00
8332f306f7 test: 인증·퀴즈 서비스 단위 테스트 추가 (오늘 난 버그 회귀 방지)
- AuthServiceTest 6개:
  · 비밀번호 변경이 실제로 저장되는지 (detached 엔티티 버그 회귀 테스트)
  · 현재 비번 틀리면 401·변경 안 됨
  · 회원가입 아이디/이메일 중복 409
  · 멘토 재설정은 학생 계정만(멘토 대상이면 403)
- QuizServiceTest 3개:
  · 안 푼 문제는 오답 처리·점수 집계
  · 답 null이어도 안 터짐
  · 퀴즈 없는 코스는 404
- PasswordEncoder는 진짜 BCrypt, 리포지토리만 mock (DB 없이 빠르게)
- User/QuizQuestion의 id는 ReflectionTestUtils로 주입(테스트 기법 예시)

전체 12개 테스트 통과 (기존 3 + 신규 9)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:18:37 +09:00
5e8f96719b fix: 비밀번호 변경이 실제로 저장되지 않던 버그 (detached 엔티티)
- change-password가 200을 반환하면서도 DB가 안 바뀌었음
- 원인: requireUser()가 트랜잭션 밖에서 조회한 detached User의 필드를 바꿔
  JPA 더티 체킹이 작동하지 않음 (managed 엔티티에만 작동)
- 해결: changePassword 트랜잭션 안에서 findById로 재조회 → managed 상태로 UPDATE
- 학습 포인트 주석 강화: '더티 체킹이 자동 저장'의 숨은 전제(트랜잭션이 관리하는 엔티티)

검증: 변경 200 → 새 비번 로그인 200 → 옛 비번 401. 틀린 현재비번 401.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:13:30 +09:00
ecb1298d93 feat: 학생 자율 가입 + 인적사항 수집 + 경리용 명단/CSV
- 테스트 계정(student1~4) 제거, 시드는 mentor1만 (MENTOR_INITIAL_PASSWORD 환경변수 지원)
- 학생은 회원가입으로 등록 — 첫날 첫 실습 겸 본인이 정보 입력
- StudentProfile 엔티티(users와 1:1 분리): 회사이메일(로컬만 저장+도메인 고정)·생년월일·
  연락처·주소·학교·전공·비상연락처. 주민번호·계좌 등 민감정보는 제외(종이 인사 절차)
- 회원가입 폼 확장 + 이메일 실시간 미리보기(hong → hong@awesomedev.dev)
- 멘토 페이지: 수습생 명단 표 + CSV 다운로드(BOM·이스케이프로 엑셀 한글 안전) — 경리 부담↓
- 이메일 아이디 중복·형식 검증(서버+프론트)

버그 수정: 명단 조회 LazyInitializationException(open-in-view:false) → JOIN FETCH로 해결
  (보안 리뷰가 경고했던 그 함정 — 주석으로 학습 포인트화)

검증: 가입 201 / 이메일중복 409 / 형식오류 400 / 명단 200 / CSV(헤더·BOM·이스케이프) / 학생→명단 403

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:00:03 +09:00
387180dbfc feat(ops): Gitea 자동 백업 추가 — 저장소·이슈·PR·계정 보호
- backup-gitea.sh: gitea dump(저장소+SQLite+설정을 일관된 시점으로) | S3 업로드
  볼륨 tar 대신 gitea dump를 쓴 이유를 주석에 명시 (실행 중 tar는 시점이 어긋날 수 있음)
- zip 무결성(unzip -t)·크기 검증 후에만 업로드
- systemd timer 매일 03:10 KST (DB 백업 10분 뒤 — 겹치지 않게)
- IAM 정책에 gitea/ 경로 추가 + 복원용 GetObject (여전히 해당 버킷 두 경로로만 제한)
- S3 수명주기에 gitea/ 30일 규칙 추가
- BACKUP.md: Gitea 복원 절차·검증법·'무엇이 이 서버에만 있는가' 관점 정리

검증: 백업 2.8MB, zip 무결성 OK, 백업 속 저장소에서 clone → HEAD·커밋20·파일269 운영과 일치

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 08:26:29 +09:00
44487d5746 feat(ops): DB 자동 백업 — 매일 S3 업로드, 30일 보관
- backup-db.sh: pg_dump | gzip | S3 업로드 + 로컬 7일 보관, 덤프 크기 검증
- restore-db.sh: 목록 조회·복원(확인 프롬프트·복원 전 자동 스냅샷)
- systemd timer로 매일 03:00 KST 실행 (AL2023에 cron 없음, 이력이 journalctl에 남음)
- S3 버킷: 퍼블릭 차단 + AES256 암호화 + 30일 수명주기
- IAM 역할(mirim-backup-role): 해당 버킷 postgres/ 에 PutObject만 — 최소 권한, 액세스 키 없음
- BACKUP.md: 구성·설계 이유·복원 리허설 절차

검증: 백업 성공(8.5MB→102KB), S3 업로드 확인, 임시 DB 복원 후 운영본과 건수 완전 일치

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 08:13:37 +09:00
8cc7fe749a fix(ui): PC에서 상단 메뉴가 두 줄로 깨지던 문제 수정
- 메뉴 링크에 white-space: nowrap + flex: none — 글자를 단어 중간에서 쪼개지 않음
- 상단바 컨테이너 max-width 960 → 1140px (메뉴 6개가 쓸 폭 확보)
- 넘칠 경우 가로 스크롤로 처리(min-width: 0 필요), 1080px 이하는 로고 부제부터 접음
- '멘토 멘토' 중복 표시 수정 — 이름과 역할 배지를 분리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 08:02:09 +09:00
c5c4a5b1f9 fix(security): 무인증 계정 탈취 경로 차단 + 세션 고정 방어 + 거짓 주석 수정
보안 검토(4개 영역 병렬)에서 확인된 실제 취약점 수정:

[HIGH] 무인증 계정 탈취 연쇄 — find-id로 아이디 획득 → 아이디+이름만으로 비밀번호 재설정
  → 요청 2번으로 멘토 권한 탈취 가능했음 (공개 서버, 시드 이름 예측 가능)
  - 무인증 POST /api/auth/reset-password 제거
  - find-id 응답 아이디 마스킹 (mentor1 → me****1)
  - 대체 경로 신설: POST /api/auth/change-password(본인, 현재 비번 재인증),
    POST /api/mentor/users/{id}/reset-password(멘토 전용, 학생 계정만)
  - 프론트: 재설정 폼 → 안내로 교체, 비밀번호 변경 페이지·멘토 재설정 UI 추가

[MEDIUM] 세션 고정 — 로그인 시 세션 ID 미재발급 (직접 구현이라 formLogin의 방어가 빠져 있었음)
  - changeSessionId() 추가. 세션 부재 시 IllegalStateException 나는 것 확인해 가드 포함

[교재 품질] 코드와 어긋난 주석 수정 — 학생이 주석 신뢰를 잃는 것이 가장 큰 손해
  - Badge: 라벨표 이중화로 REVIEWED가 화면마다 다르게 표시되던 실제 버그 수정(PASSED 추가)
  - QuizResult: 정렬 없이 '가장 최근'을 가정하던 주석 → OrderBy 명시로 사실화
  - runJs: (0, eval) 설명 → 실제 코드(new Function)에 맞게 수정
  - runJs: Worker는 fetch가 되므로 '멘토 화면에서 학생 코드 실행 금지' 회귀 경고 명시

운영 검증: 로그인 200 / 무인증 재설정 401 / 학생→멘토API 403 / 멘토 재설정 200

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 07:58:50 +09:00
241b784e1e feat: 코스 도해 완성 — 디자인·부록 23종 추가, 71개 전 코스 도해 완비
- 디자인 12: F패턴 시선 흐름·색상환·크기 위계·8pt 그리드·비트맵vs벡터·
  와이어프레임 3단계·오토레이아웃·디자인시스템 계층·엄지 도달범위·리서치 순환도·무드보드·STAR
- 부록 도구 11: 창 스냅·터미널 삼형제·VS Code/IntelliJ 구역도·개발자도구 탭 지도·
  PR 흐름도·Docker 대시보드·DBeaver 연결 경로·Postman 해부·버그 캡처·TIL 구조

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 07:24:17 +09:00
8486c7e656 fix(security): 세션 쿠키 보안 플래그 + 운영 로그 레벨
- 세션 쿠키에 HttpOnly(XSS로 탈취 방어)·Secure(HTTPS 전용)·SameSite=Strict(CSRF 방어) 적용
- Secure는 COOKIE_SECURE 환경변수로 분리 (로컬 http 개발에서도 로그인되도록 기본 false)
- 운영 로그 레벨을 LOG_LEVEL 환경변수로 분리, 운영은 INFO
- 학습 포인트 주석: 세션 인증의 3대 쿠키 플래그가 왜 필요한가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 07:19:21 +09:00
5a82ecb291 feat: 코딩 문제 20문항 — 브라우저 자동채점 + 멘토 코드 리뷰
읽고 아는 것과 짤 수 있는 것을 나눠 확인하는 세 번째 축(과제·퀴즈에 이어).

- 문제 20개: JS 12(자동채점) + Java 8(멘토 리뷰), 난이도 EASY 8/NORMAL 8/HARD 4
- JS 채점은 Web Worker에서 실행 — 서버 샌드박스 없이 무한루프(2초 타임아웃)·
  DOM 접근을 막는다. 테스트 48건은 모범답안으로 전수 검증함
- Java는 실행하지 않음(격리 비용·보안). 코드를 멘토가 읽고 피드백.
  서버가 자바 제출의 클라이언트 채점값을 버리므로 위조 불가
- 멘토 화면: 코드 원문·테스트별 통과/실패·학생별 진도·피드백 작성
- (문제, 학생)당 1행 유지 + attempts 증가. 에디터는 무의존성(textarea 기반)

검증: 백엔드 컴파일·프론트 빌드·시드 20건 적재·API 전 흐름(제출/재제출/
권한 403/빈코드 400)·브라우저 실사용(오답 3/4 → 정답 4/4 → 멘토 조회)
2026-07-17 00:27:52 +09:00
e53b318ddf feat: 모바일 반응형 개선 + 코스 개념 도해 48종 추가
- 반응형: 모바일 상단 네비 2줄 재배치(메뉴 가로 스크롤), 코스 완료 바 2줄 배치, 본문 여백 축소
- 도해: 48개 코스에 인라인 SVG 개념도 추가 (CSS 변수 색상 → 다크모드 자동 대응)
  본체 부품 배치도·UTP 8가닥 단면도·3-way 핸드셰이크·박스 모델·플랫폼 구성도 등
- .diagram 클래스로 컨테이너 폭 자동 맞춤

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 23:01:00 +09:00
cd9c34d0a7 feat: 코스별 확인 퀴즈 — 71개 코스 355문항, 서버 채점
- 문항/응시기록 엔티티 + 시드(quizzes.json, 코스별 원본 quiz/*.json)
- API: 문항 조회(정답 제외)·제출/채점·내 결과 요약·멘토 학생별 성적
- 퀴즈 페이지: 라디오 선택→서버 채점→정답/해설 색 표시→다시 풀기
- 코스 하단 바에 '퀴즈 풀기' 추가, 멘토 페이지에 퀴즈 성적 표(평균·만점 수)
- 학습 포인트: 정답은 서버에만(브라우저에 비밀 두지 않기), 원본 기록 보존 설계

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:43 +09:00
6df3f308cc feat: 멘토 주차별 체크리스트 진도 뷰 + 적대적 리뷰 반영
- GET /api/mentor/checklist-progress: 주차별 총계(분모) + 학생별 완료 수(분자)
- 멘토 페이지에 학생×주차 진도 표 (완료율 3단계 색, 첫 열 sticky)
- 리뷰 반영: Promise.allSettled로 섹션 독립 로딩(+에러 배너),
  table-static 클래스로 비클릭 표의 hover 하이라이트 제거, 시드 부재 빈 상태 구분

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:53:14 +09:00
f181aef30b feat: 대시보드에 학습 센터 진도 요약 위젯 추가
- 코스 완료율·카테고리별 집계 칩·학습 센터 바로가기
- Rule of Three 학습 포인트 주석 (중복 2회까지는 추상화를 참는다)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:36:37 +09:00
c4c3bb0712 feat: 멘토 페이지 학생별 코스 진도 현황 추가
- GET /api/mentor/course-progress: 학생별 완료 slug 목록 (MENTOR 전용, N+1 트레이드오프 주석)
- 멘토 페이지 상단에 학생 카드: 진도율 바 + 코스 완료 수 + 카테고리별 집계 칩

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:34:47 +09:00
b8c9da2d4a feat: 학습 센터 코스 진도 체크 — 완료 토글 API + 하단 완료 바 + 허브 진도율
- 백엔드: CourseProgress 엔티티(user+slug 유니크)·서비스·API
  (GET /api/course-progress/me, POST /api/course-progress/{slug}/toggle, slug 형식 검증)
- 프론트: CourseShell 래퍼로 72개 코스에 하단 완료 바 자동 부착,
  허브에 전체/카테고리별 진도율·완료 카드 표시(✓·청록 테두리)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:18:10 +09:00
1303d06811 fix: 코스 콘텐츠 일괄 검수 반영 — 깨진 내부 링크·Gitea 포트·보안그룹 사실 교정
- 검수 61파일 52건: 깨진 Link(/learn/database, /learn/git, /learn/backend 등) 유효 slug로 교체
- Gitea 주소 포트 누락(:3000) 일괄 보정
- 방화벽 코스의 보안그룹 표를 실제 설정(3000·222 포함)에 맞게 교정
- olist 마크업 패턴 통일

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 14:49:10 +09:00
ff14183f03 feat: 카테고리당 12강좌 체제 완성 — 총 72강좌, 학습 순서 정렬 + 순번 표시
- 신규 16강좌: GPU·메인보드/파워·대역폭·VPN/프록시·캐시/NoSQL·CI/CD·테스트·AI도구·
  와이어프레임·레퍼런스 + 부록 6종(개발자도구·터미널·Gitea·캡처·노션·단축키)
- 카탈로그를 배우는 순서대로 재배열 (배열 순서 = 학습 순서)
- 허브 카드에 순번(01~12) 표시, 카테고리당 12강좌 균일화

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 10:21:04 +09:00
96f92eceba feat: 학습 센터 아카데미 확장 — 카테고리당 10강좌, 총 55강좌 체제
- 신규 45강좌: 컴퓨터 기초 8, 네트워크 9, 서버와 데이터 8, 소프트웨어 7, 디자인 8,
  부록 툴 가이드 5(Docker Desktop·DBeaver·VS Code·IntelliJ·Postman)
- courseCatalog.jsx 신설: 코스 목록을 데이터로 일원화, lazy 지연 로딩으로 코스별 청크 분리
- App.jsx 라우트를 카탈로그 기반 자동 생성으로 리팩터링, 허브는 카탈로그를 그리기만

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 10:04:29 +09:00
3adebdb44a feat: 학습 센터 10강좌 완성 — 리눅스·SQL·HTML/CSS·자바스크립트·UI/UX·피그마 추가
- 서버와 데이터: 리눅스/터미널 기초(SSH까지), SQL 입문(실제 우리 테이블·psql 실습)
- 소프트웨어: HTML/CSS 기초(global.css 해부), 자바스크립트 기초(콘솔·fetch 실습)
- 디자인(신설): UI/UX 기초(우리 화면 비평), 피그마와 디자인 툴(모작·핸드오프)
- 코스 간 상호 연결: UI/UX 비평 → 피그마 시안 → 디자인 티켓(DZ-02) 흐름

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 09:37:33 +09:00
8f1143aee8 feat: 학습 센터 개편 — 컴퓨터 구성·데스크탑 조립·네트워크 코스 추가
- 메뉴 구조 변경: 코딩 기초/설치 가이드 → '학습 센터' 허브로 통합
- 신규 코스 3종: 컴퓨터의 구성(부품별 특징·스펙 읽기), 데스크탑 조립(9단계·실수 모음),
  네트워크의 이해(랜선 UTP 구조→인터넷 구조→DNS·TCP/IP, 실습 포함)
- 라우팅 /learn 하위로 코스 정리, 허브는 데이터 기반 카드 목록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:47:30 +09:00
b834afad4b style: 대시보드·과제 페이지 디자인 개편 — 히어로·진행률 통계·일차 그룹핑
- 대시보드: 인사+응원 문구 히어로, 진행률 % 큰 숫자+바, 일차별 완료 카운트
- 과제: 제출률 히어로, 일차별 그룹핑, 제출 완료 카드 청록 띠, 제출 폼 접기(details)
- global.css: compact 히어로·stat·day-head·assign-card·fold 클래스 추가 (기존 클래스 무변경)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:36:43 +09:00
c6d723824b feat: 설치 가이드 개편 — IntelliJ 설치·Git 연결 단계 추가, 가이드 디자인 시스템 도입
- STEP 6 IntelliJ 설치(Community 선택, JDK 지정, 첫 실행까지)
- STEP 7 IntelliJ에서 Git 연결(클론→브랜치→커밋→푸시→PR, 클릭 경로 명시)
- 히어로·단계 필 내비·번호 리스트·팁/주의 박스 등 가이드 전용 스타일 추가 (global.css)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:32:51 +09:00
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