- 메뉴 링크에 white-space: nowrap + flex: none — 글자를 단어 중간에서 쪼개지 않음
- 상단바 컨테이너 max-width 960 → 1140px (메뉴 6개가 쓸 폭 확보)
- 넘칠 경우 가로 스크롤로 처리(min-width: 0 필요), 1080px 이하는 로고 부제부터 접음
- '멘토 멘토' 중복 표시 수정 — 이름과 역할 배지를 분리
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
보안 검토(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>
읽고 아는 것과 짤 수 있는 것을 나눠 확인하는 세 번째 축(과제·퀴즈에 이어).
- 문제 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 → 멘토 조회)
- 반응형: 모바일 상단 네비 2줄 재배치(메뉴 가로 스크롤), 코스 완료 바 2줄 배치, 본문 여백 축소
- 도해: 48개 코스에 인라인 SVG 개념도 추가 (CSS 변수 색상 → 다크모드 자동 대응)
본체 부품 배치도·UTP 8가닥 단면도·3-way 핸드셰이크·박스 모델·플랫폼 구성도 등
- .diagram 클래스로 컨테이너 폭 자동 맞춤
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 문항/응시기록 엔티티 + 시드(quizzes.json, 코스별 원본 quiz/*.json)
- API: 문항 조회(정답 제외)·제출/채점·내 결과 요약·멘토 학생별 성적
- 퀴즈 페이지: 라디오 선택→서버 채점→정답/해설 색 표시→다시 풀기
- 코스 하단 바에 '퀴즈 풀기' 추가, 멘토 페이지에 퀴즈 성적 표(평균·만점 수)
- 학습 포인트: 정답은 서버에만(브라우저에 비밀 두지 않기), 원본 기록 보존 설계
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- GET /api/mentor/course-progress: 학생별 완료 slug 목록 (MENTOR 전용, N+1 트레이드오프 주석)
- 멘토 페이지 상단에 학생 카드: 진도율 바 + 코스 완료 수 + 카테고리별 집계 칩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 검수 61파일 52건: 깨진 Link(/learn/database, /learn/git, /learn/backend 등) 유효 slug로 교체
- Gitea 주소 포트 누락(:3000) 일괄 보정
- 방화벽 코스의 보안그룹 표를 실제 설정(3000·222 포함)에 맞게 교정
- olist 마크업 패턴 통일
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 신규 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>
- 메뉴 구조 변경: 코딩 기초/설치 가이드 → '학습 센터' 허브로 통합
- 신규 코스 3종: 컴퓨터의 구성(부품별 특징·스펙 읽기), 데스크탑 조립(9단계·실수 모음),
네트워크의 이해(랜선 UTP 구조→인터넷 구조→DNS·TCP/IP, 실습 포함)
- 라우팅 /learn 하위로 코스 정리, 허브는 데이터 기반 카드 목록
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 로그인/회원가입/아이디찾기/비밀번호재설정 (세션 기반)
- 대시보드(주차별 진도 체크리스트), 학습 문서 뷰어(17종), 과제 제출/멘토 피드백
- 코딩 기초·개발 환경 설치 가이드 학습 페이지
- 전 소스 한국어 학습 주석 — 수습생 교육용 저장소
- Docker 배포 구성 (Caddy + Spring Boot + PG + Gitea)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>