Skip to content

Repository files navigation

우공실

우공실은 학습과 기록, 커뮤니티 기능을 제공하는 웹 서비스입니다. 정보처리기사 필기·실기 문제를 풀고, 학습노트와 게시판을 이용하며, 계정에 저장한 기록과 오답으로 복습을 이어갈 수 있습니다. PC와 휴대폰 브라우저에서 같은 사이트를 이용합니다.

이 문서는 2026-09-09 기준의 제공 기능과 운영·Android 앱 검증 결과를 정리합니다. 날짜별 변경과 당시 검증 범위는 변경 이력에서 확인할 수 있습니다.

현재 소스 버전은 2.4.4입니다. /manage에서 skn29의 기존 사이트 비밀번호를 확인한 뒤, 계정에 등록된 이메일로 보낸 6자리 인증번호까지 확인해야 관리자 로그인이 완료됩니다. 인증번호는 5분 유효하며 재전송·오입력 횟수를 제한합니다. 관리자 인증 안내에서 이용 방법을 확인할 수 있습니다. 앞서 정리한 홈 링크·문구와 웹·APK 공통 하단 방문 횟수는 유지합니다. 실제 운영 버전은 운영 버전 정보에서 확인할 수 있으며, 배포는 릴리즈 배포 안내의 순서를 따릅니다.

학습과 주요 화면

기능 경로 할 수 있는 일
홈 / 학습 안내, SQL 예제, 공지와 이용 안내
정보처리기사 /cert/ipe 필기·실기 학습 방식 선택
필기 /cert/ipe/written, /cert/ipe/written-bank, /cert/ipe/written-past 문제은행, 기출 회차 선택, 답안·해설·채점 결과 확인
실기 /cert/ipe/practical, /cert/ipe/practical-bank, /cert/ipe/practical-past, /cert/ipe/practical-three-week 주관식 문제은행, 기출, 3주 공략, 문제 이미지와 특수기호 답안 입력
오답 복습 /wrong 계정에 저장된 필기·실기 오답 확인과 다시 풀기
멀티플레이 CBT /multiplayer 방 생성·참여, 함께 응시, 결과·기록·오답 확인
내 정보 /mypage 개인 정보, 시험 목표일, 계정 관리와 회원탈퇴
학습노트 /study 폴더·문서, 공개 범위, 오답 삽입, 임시저장과 불러오기·복구
게시판 /board/notice, /board/free 공지·자유글, 문서 편집기, 이미지·파일 첨부, 검색·댓글·추천·임시저장
계정 /login, /signup, /find, /change-pw 로그인, 회원가입 신청, 계정 찾기, 비밀번호 변경
이용 안내 /faq, /terms, /privacy FAQ, 이용약관, 개인정보 처리방침
추가 서비스 /fortune 별도 개인정보 동의 흐름을 포함한 운세
운영 관리 /manage/login 일반 회원 화면과 분리된 관리자 로그인

기존 /written, /practice, /exam, /ipep 주소는 해당 정보처리기사 경로로 이동합니다. 맛집 지도와 캘린더 일정 관리는 현행 라우트와 메뉴에서 제외되어 있습니다. 과거 변경 이력에는 당시 기능 설명이 남아 있습니다.

문제를 공부하고 기록을 이어가는 보조 기능도 제공합니다.

  • 필기·실기 문제 화면의 오류신고로 문제 정보와 오류 내용을 전달할 수 있습니다. 신고·공지 등의 이메일 알림 기능은 실제 메일 전송 결과와 구분해 확인합니다.
  • 게시판은 BlockNote 문서 편집기와 이미지·파일 첨부를 지원합니다. 첨부는 회원 세션과 파일 종류·크기 제한을 확인하며, 임시저장한 글을 다시 불러올 수 있습니다.
  • 휴대폰 브라우저에서도 같은 사이트 주소로 접속하며, 다크·라이트 테마와 화면 밝기를 조절할 수 있습니다.
  • 웹·APK의 공통 하단에 오늘 방문과 누적 방문을 회 단위로 표시합니다. 화면 이동·새로고침은 기존 방문을 이어가며, 5분 이상 활동이 끊긴 뒤 다시 방문하면 새 방문으로 집계합니다. 한국시간 기준이고 중복 없는 사람 수를 뜻하지 않습니다.
  • 공개 합계 API는 오늘·누적 숫자 두 개만 반환합니다. 개인별 방문·로그인 기록과 회원 목록은 관리자 전용이며, 실시간 접속자 목록은 공개하지 않습니다. 집계 기준과 검증 범위를 참고하세요.

공개 접속과 회원 기능

현재 사이트는 별도 입장코드나 hCaptcha 없이 접속합니다. 홈, 홈페이지의 설명용 SQL 예제, 공지 열람, FAQ와 법적 안내를 확인할 수 있습니다. 홈페이지 예제 결과는 개인 학습 기록에 저장되지 않습니다.

홈의 학습 시작 버튼은 비회원에게 로그인 화면을, 회원에게 학습 선택 화면을 엽니다. 상단 메뉴의 학습·개인 기능도 비회원에게 로그인을 안내합니다. 일부 학습 주소를 직접 열어 문제를 보거나 연습할 수 있어도 회원 기록이 생성되었다는 뜻은 아닙니다. 개인 기록 조회·저장, 오답 관리, 학습노트, 멀티플레이, 자유게시판과 글·댓글·추천 등은 각 기능의 회원 세션과 권한 검사를 따릅니다.

  • 로그인에는 세션 만료·중복 로그인 확인과 최신 약관·개인정보 동의 절차가 있습니다.
  • 구형 클라이언트의 게이트키퍼 호환 API는 남아 있지만 현재 입장코드·CAPTCHA를 요구하지 않습니다.
  • 요청 제한, 허용 출처 검사, 보안 헤더와 개별 API의 권한 검사는 별도로 유지합니다.

회원가입 절차

공개 접속으로 바뀐 것과 가입 자동승인은 별개입니다. 현재 가입 API에는 자동가입·자동승인 전환 설정이 없으며, 회원가입 신청은 관리자 승인 대기로 접수합니다.

  1. 이용약관·개인정보 동의와 만 14세 이상 확인을 완료합니다.
  2. 회원 정보를 입력하고 아이디 중복 확인과 이메일 인증을 진행합니다.
  3. 서버가 신청과 동의 이력을 저장하고 승인 대기 상태를 반환합니다.
  4. 관리자가 승인하면 계정이 생성되어 로그인할 수 있습니다. 거절 시에는 사유를 포함한 안내 메일 발송을 시도합니다.

관리자 알림이나 결과 안내 메일의 발송 여부는 신청 접수·승인 상태와 구분합니다. 화면 문구 설정만 바꿔도 서버의 가입 정책이 바뀌지는 않습니다.

관리자 화면

홈페이지에는 관리자 링크를 표시하지 않습니다. 누구나 /manage를 직접 입력해 로그인 화면을 열 수 있으며, 기기 인증서는 필요하지 않습니다. 로그인은 skn29 계정의 비밀번호·관리자 권한·정지 여부와 등록 이메일로 보낸 6자리 인증번호까지 검증한 뒤 허용합니다. 비로그인 관리자 API는 401로 차단하며, 다른 관리자 계정 또는 이메일 인증 없이 발급된 이전 세션도 사용할 수 없습니다. 일반 회원의 브라우저 저장소에 있는 역할 표시를 관리자 인증 수단으로 사용하지 않습니다. HttpOnly 세션 쿠키, 만료·폐기, Origin·CSRF 검사도 유지합니다. 운영 설정과 검증 범위는 관리자 접근 안내를 따릅니다.

관리자 화면은 대시보드, 사용자·접속 관리, 방문 통계, 회원가입 승인, 운영자 결재, 공지·점검 관리, 문제·해설 관리, 화면 설정으로 구성됩니다. 민감 정보 조회·회원 조치·승인과 같은 기능은 기존 권한과 사유 입력 절차를 따릅니다.

회원 목록의 이름·이메일은 마스킹합니다. 개인정보 원문은 최고관리자 권한, 비밀번호 재인증과 열람 사유를 확인한 뒤 제한적으로 보여줍니다. 운영자 요청의 승인·반려와 가입 승인·거절은 각각의 관리 화면에서 처리합니다.

회원 목록의 최근 로그인은 로그인 API가 성공한 시각이고, 최근 로그아웃은 명시적인 로그아웃 호출 기록입니다. 브라우저·탭 종료나 서버 재시작이 항상 로그아웃으로 기록되는 것은 아니므로 로그인 유지 상태, 실시간 접속, 방문 세션 통계를 서로 구분해 해석합니다.

UI 기준과 참고 자료

홈은 학습 안내 → 직접 풀어보는 예제 → 문제 풀이·해설 확인·오답 복습의 순서로 구성했습니다. 학습 화면은 문제·선지·답안·해설을 우선하고, 기록·게시판·관리자 화면은 목록·필터·상태와 다음 행동을 읽기 쉽게 정리했습니다. 라이트·다크 모드, 기존 밝기 선택과 관리자 화면 설정값을 유지합니다.

모바일 입력창에는 스크롤 여백을 적용해 키보드가 열린 상태에서도 입력란을 하단 메뉴 위로 볼 수 있도록 보완했습니다. Galaxy Z Flip4의 최종 앱에서 비밀번호 입력란의 표시와 가림 해소를 확인했습니다.

홈의 시험 접수·Notion·개발자·모바일 링크 묶음과 QR 창을 제거했습니다. 학습 시작과 이용 안내는 유지하며, 휴대폰 접속 안내는 현재 사이트 주소를 직접 이용하도록 정리했습니다.

Android 앱은 웹 화면을 먼저 준비한 상태에서 양문 오프닝과 페이드아웃을 포함해 약 2.95초 동안 시작 효과를 보여줍니다. 기기의 전역 애니메이션 배율이 0이어도 앱의 시작 효과만 같은 속도로 재생하며, 전역 설정은 변경하지 않습니다. Activity 재생성 때는 오프닝을 반복하지 않습니다.

  • 상세페이지 설계 참고 영상: 사용자 상황, 원하는 변화, 근거, 이용 과정, 다음 행동의 순서를 참고했습니다.
  • ima2-gen 원본 저장소: 화면 목적에 맞는 정보 밀도, 디자인 기준 선행, 반응형·상태 검토 지침을 참고했습니다.
  • DESIGN.md: 색상·간격·글자·반응형·접근성·기능 보존 기준입니다.

영상의 성과 주장이나 생성한 컨셉 이미지가 우공실의 실제 성과·데이터를 입증하지는 않습니다. 홈페이지에 임의의 합격률·후기·문제 수를 추가하지 않았으며, 이번 UI의 학습 효과나 전환율은 아직 측정하지 않았습니다.

기술과 구조

프런트엔드는 React 19, Vite 8, React Router 7, Axios, Socket.IO Client, BlockNote/Mantine, React Icons를 사용합니다. 백엔드는 Node.js, Express 5, MySQL, Socket.IO, bcrypt, Nodemailer로 구성합니다. 운영 환경은 AWS Lightsail의 Ubuntu, Nginx, PM2와 MySQL입니다. 정확한 의존성 버전은 각 package-lock.json을 기준으로 합니다.

backend/
  config/          환경 변수·DB 연결
  middleware/      요청 제한과 구형 접속 API 호환
  routes/          회원·관리자·학습·게시판 등 API
  services/        인증·동의·통계·저장소와 공통 로직
  scripts/         데이터 적재·유지보수 도구
  server.js        Express·Socket.IO 진입점
frontend/
  manage/          관리자 HTML 진입점
  public/          공개 정적 파일
  src/
    admin/         독립 관리자 앱·로그인·세션
    components/    공통 UI
    features/      기능별 모듈
    pages/         라우트 화면
    styles/        공통·기능·관리자 스타일
android/
  app/src/         Compose 오프닝·WebView·테스트
  gradle/          Wrapper·Gradle daemon 기준
  scripts/         공개 debug 웹 번들 빌드 도구
  README.md        Android 개발 환경·빌드 안내
DESIGN.md
PATCH_NOTES.md
README.md

로컬 실행과 확인

개발용 MySQL과 메일 등 필요한 설정을 준비하고, backend/.env.example을 참고해 별도의 backend/.env를 구성합니다. 공개 저장소에 운영 DB, 계정, 사용자 업로드와 전체 문제 이미지가 포함되어 있지는 않으므로 소스 설치만으로 운영과 동일한 데이터가 나타나지는 않습니다.

백엔드 터미널:

cd backend
npm ci
npm run check
npm start

프런트엔드 터미널:

cd frontend
npm ci
npm run dev

기본 개발 주소는 http://localhost:5173이며 API·Socket.IO·문제 이미지 요청은 Vite 프록시를 통해 http://localhost:5000으로 전달합니다. 관리자 개발 화면은 http://localhost:5173/manage/login입니다. 빌드에는 일반 화면과 관리자 화면의 HTML 진입점이 모두 포함됩니다. Windows PowerShell에서 npm 스크립트 실행이 정책에 막히면 같은 명령을 npm.cmd로 실행할 수 있습니다.

기본 검증:

cd backend
npm run check
node --test
cd frontend
npm run lint
node --test
npm run build

백엔드의 npm test는 문법 검사인 npm run check를 실행하므로 단위 테스트 실행과 구분합니다. 헬스 응답은 /api/ipep/health에서 확인할 수 있지만, 이것만으로 로그인·저장·메일·멀티플레이 전체 흐름이 검증되지는 않습니다.

환경 설정은 서버·DB 연결, 사이트 URL·허용 출처, 메일, 관리자 세션 쿠키·만료·권한, 방문 통계의 해시·캐시, 동의와 요청 제한 범위를 포함합니다. .env.example에는 구형 입장코드·hCaptcha·지도 항목도 남아 있으므로 현행 기능에 필요한 값은 실제 설정을 읽는 소스와 대조합니다. 실제 비밀값과 운영 데이터를 공개 저장소에 추가하지 않습니다.

현재 배포와 검증 범위

2026-09-08 홈 링크·QR 정리를 운영 사이트에 반영하고 Android 오프닝 보완 APK의 실기기 확인을 완료했습니다. 최종 APK는 공개 android/ 소스와 빌드 스크립트에서 직접 생성했습니다. 홈 변경과 공개 Android 소스는 커밋 028822a에 포함했습니다.

배포 전 전체 백업의 체크섬 24항목과 DB 49테이블을 확인했습니다. 프런트엔드 소스 3개 반영·2개 삭제와 빌드 결과를 배포했고 서버를 재시작하지 않았습니다. 정적 파일 522개와 실제 HTTPS로 받은 HTML·직접 연결 CSS/JS 7개의 SHA-256을 대조했습니다. 변경 대상 밖 운영 파일 565개, DB 스키마·보호 데이터·런타임 파일의 보존을 확인했으며, 확인 구간의 서버 오류 로그 증가량은 0바이트였습니다.

이번 변경의 검사 결과는 다음과 같습니다. 각 숫자는 검사 항목 수이며 실제 사용자나 기기 수가 아닙니다.

구분 결과 확인 범위
홈 합성 브라우저 129/129 대체 API 응답을 사용하는 화면별 링크·QR 제거, 남은 학습 흐름과 표시
운영 비회원 화면 48/48 6개 화면 조합; 실제 로딩 자산 13개의 SHA-256 일치
공개 Android 단위 검사 16/16 WebView 탐색·번들 정책과 기존 회귀
공개 Android Lint·debug 빌드 통과 공개 소스에서 최종 APK 생성
Galaxy Z Flip4 네이티브 검사 4/4 실제 WebView 시작·Activity 재생성 2항목과 제어된 시간의 오프닝 2항목; 전역 애니메이션 배율 0 유지
최종 APK WebView 화면·입력 화면 11/11, 입력 12/12 새 번들·비회원 홈·SQL 예제·빈 비밀번호란·키보드 가시성과 홈 복귀
화면 캡처 검수 운영 6장, 오프닝 8장 운영 화면과 문 열림·본문 전환 과정을 각각 직접 확인

운영 브라우저 도구의 전체 집계는 55/57입니다. 화면 검사 48/48은 통과했고, 전체 집계 중 2항목은 의도된 소켓 차단의 분류 오류로 확인했습니다. 원본 결과와 별도 분석을 보존하며 두 집계를 구분합니다. 운영 검사는 공개 GET/HEAD만 실제 서버에 연결하고 방문 수 표시를 대체했으며, 회원 요청·쓰기·소켓·외부 연결은 차단했습니다.

최종 확인 APK 번들은 mobile-ui-20260907T155718399Z이며 SHA-256은 4c848c5e4b9fa72259b085b68e80b990cfcd2470eafd69db0e9379aeb28d8616입니다. 포함된 웹 자산 392개가 서버에서 검증한 배포 파일 목록과 일치하고 CRC 검사를 통과했으며 관리자 HTML은 포함하지 않았습니다. 기기에 설치된 APK도 생성 파일과 일치합니다.

실제 앱의 360×800px 화면에서 키보드 표시 후 WebView 높이가 476px로 줄어들어도 빈 비밀번호란이 하단 메뉴 위에 보이고 마스킹을 유지했습니다. 검증 중 자격증명 입력·로그인·학습 제출은 수행하지 않았습니다. 합성 브라우저 결과, 실제 WebView 검사, 네이티브 검사와 화면 캡처 검수는 각각의 확인 범위로 해석합니다. 약 2.95초는 화면 구성을 시작한 뒤의 설정된 연출 시간이며 Android 프로세스 시작 시간을 포함하지 않습니다. 캡처 검수를 정밀한 시간 측정으로 해석하지 않습니다.

운영 회원의 가입·승인·메일·학습 결과와 오답의 DB 저장, 여러 사용자의 동시 시험, 네이티브 전체화면과 모든 기기의 호환성은 이번 확인 범위에 포함하지 않습니다. Activity 재생성 검사는 포함하지만 모든 화면 회전·복원 조건을 검증한 것은 아닙니다. 이전 UI·입력 보완 배포와 당시 APK 검사 결과는 변경 이력에 보존합니다.

추가 문서와 공개 범위

이 저장소는 애플리케이션 소스를 공개하는 범위로 정리합니다. 실제 환경 파일, 인증 키, 운영 DB 덤프, 사용자 파일·로그, 문제 이미지 등 별도 권리·데이터 검토가 필요한 자산, 의존성 폴더와 빌드·백업 산출물은 공개 대상에서 제외합니다.

About

정보처리기사 문제 풀이·오답노트·멀티플레이 CBT·게시판·관리자 운영을 함께 제공하는 웹 학습 서비스

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages