본문 바로가기

순이코딩/프로젝트

정보처리기사 필기 CBT 앱

728x90
반응형

정보처리기사 CBT 앱은 정보처리기사 필기시험을 준비하면서, 개발한 토이 프로젝트입니다.
앱의 핵심 목표는 사용자 친화적인 인터페이스와 간단한 통계를 바탕으로 학습 효율을 높이는 것입니다.

React를 처음 학습하던 시기에 제작했으며, 최근에는 자체 제작한 Soon UI Design Library로 전체 UI/UX를 개선하였습니다.

✅ 시험 형식 및 데이터 구성

  • 2020년 이후 정보처리기사 시험이 개편되면서 이전 회차 문제는 더 이상 유효하지 않습니다.
  • 2022년 3회부터 문제지가 외부에 공개되지 않고 있으며, 따라서 앱에는 최근 복원 기출 중심의 제한된 회차만 수록되어 있습니다.
  • 참고로, 일부 카페 등에 복원 기출이 존재하지만, 개인 프로젝트라 하더라도 무단 수집은 부적절하다고 판단해 공식적으로 확보 가능한 데이터만 사용했습니다.

 

 

 

CBT - 정보처리기사 필기 CBT 문제 은행

정보처리기사 필기 문제를 풀 수 있는 CBT 문제 은행입니다.

cbt-app-self.vercel.app

 

 

1. 메인 페이지 (Google 로그인)

단순히 문제를 풀기 위한 기능은 로그인 없이도 이용할 수 있습니다.
하지만, 개인 학습 데이터 분석(학습률, 예상 점수 등)을 제공받기 위해서는 Google 로그인이 필요합니다.
Firebase Authentication을 이용하여 로그인 기능을 구현하였으며, 저장하는 정보는 다음과 같이 최소한으로 제한합니다

  • 구글 UID (중복 방지 목적)
  • 이름, 이메일, 프로필 이미지 (모두 Google 제공)

2. 랜덤 테스트


사용자가 특정 과목을 선택하면, 해당 과목 내 모든 회차 문제 중 랜덤으로 출제됩니다.
문제 풀이 후 즉시 정답 확인이 가능하며, 정답을 확인하지 않고 다음 문제로 넘어가는 것도 가능합니다.

이 기능은 실전 감각을 기르기 위한 훈련 모드입니다.

 

3. 회차 별 문제풀이


특정 회차를 선택하여, 해당 시험에 포함된 모든 문제를 순차적으로 풀 수 있습니다.
풀이 후 '채점하기'를 클릭하면 결과가 요약되어 표시됩니다.

  • 평균 점수 ≥ 60점: 합격
  • 과목별 40점 미만 존재 시: 불합격 처리
    (과락 방지 로직 포함)

 

4. 마이페이지 – 학습 데이터 분석


로그인 사용자를 대상으로, 학습 이력 기반의 간단한 통계 분석을 제공합니다.

저장 구조

  • 문제 컬렉션
  • 회원 컬렉션
  • 각 문제별로 회원의 정답 여부(맞춤/틀림 횟수)를 기록

점수 예측 로직

문제별 정답 확률을 기반으로 과목별 예상 점수를 산출하고, 평균 점수를 계산합니다.
머신러닝 모델은 도입하지 않았으며, 데이터량이 적은 사용자에게도 적용 가능한 단순 통계 기반 예측을 사용했습니다.

def calculate_subject_pass_rate(cbt_records, passing_score=40):
    subject_scores = {}
    subject_pass_rate = {}
    
    for record in cbt_records:
      subject = record['subject_name']
      if subject not in subject_scores:
        subject_scores[subject] = {'correct':0, 'incorrect':0}
      subject_scores[subject]['correct'] += record['correct']
      subject_scores[subject]['incorrect'] += record['incorrect']
      
    for subject, scores in subject_scores.items():
        total = scores['correct'] + scores['incorrect']
        if total == 0:
            subject_pass_rate[subject] = 0
        else:
            rate = (scores['correct'] / total) * 100
            subject_pass_rate[subject] = round(rate, 2)
    
    return subject_pass_rate

def calculate_overall_pass(subject_pass_rate):
    if not subject_pass_rate:
        return 0.0
    average_score = sum(subject_pass_rate.values()) / len(subject_pass_rate)
    average_score = round(average_score, 2)
    return average_score

 

5. 개발 비하인드

앱 자체의 개발 기간은 하루에 불과했지만, 가장 많은 시간이 소요된 부분은 문제 데이터 수집과 전처리 작업이었습니다.
시험지 형식이 회차마다 제각각이었기 때문에, 다음과 같은 전처리 작업이 필요했습니다

  • 이미지 포함 여부 판별 및 정리
  • 코드/표/답안지 데이터 구조 통합
  • 문제-정답 매핑 재구성

 

 

 

 

SUD - Soon UI Design

SUD(Soon UI Design)는 쉽고 빠르게 사용할 수 있는 React UI 라이브러리입니다. 컴포넌트, 아이콘, 스타일 등 웹 개발에 필요한 모든 것을 제공합니다.

www.sud.co.kr

 

 

SoonLog - Soon's Blog

SeeUSoon93의 블로그입니다. 개발, 디자인, 일상 등 다양한 주제로 글을 작성합니다.

www.soonlog.site

 

728x90
반응형