포트폴리오
주식회사 퍼닌에서 경기도교육청 AI 기반 LMS '하이러닝' 프로젝트에 참여하며 한 일입니다. 사례를 누르면 상세 페이지로 이동합니다. 설계 사례는 문제와 배경, 결과, 설계와 구현으로, 트러블슈팅은 이슈 상황, 원인 분석, 개선, 결과로 정리했습니다.
하이러닝 성능 최적화 및 운영 안정화
트러블슈팅
피크 시간대 수업 목록 쿼리를 여러 차례 고쳐 5초에서 팀 기준 1.3초 이내로 단축 상시 APM과 실행 계획으로 수업 목록 쿼리의 원인을 하나씩 찾아, 쓰지 않는 조인 제거, 인덱스를 막던 형변환 제거, 건수 집계 분리, 인덱스 재설계를 여러 차례 나눠 반영 반복 조회와 요청마다 하던 집계를 줄여 API 응답 지연 해소 반복문 안에서 매퍼를 부르던 구조와 요청마다 원본을 집계하던 쿼리를 한 번에 읽는 구조로 바꿔, 교사용 설문 상세 응답을 4초 이상에서 1초대로 줄임 끝나지 않던 수동 트랜잭션 경로를 닫고 readOnly 적용 단위를 API 호출 경로로 정함 선언적 트랜잭션 대상에서 빠진 나의 수업 메뉴 수동 트랜잭션의 종료 경로에 commit·rollback을 넣어 커넥션 풀 고갈 위험을 줄이고, Replica 라우팅을 위한 readOnly 적용 기준을 API 호출 경로 전체로 정함EBS 외부 API 연동 및 대용량 데이터 동기화 시스템 구축
단계를 나누고 원본을 보존해 외부 장애에도 재처리 가능한 동기화 구조 설계
- [1단계] 원천 적재 → [2단계] 검증 → [3단계] 내부 반영을 단계별 트랜잭션으로 분리(3단계는 1만 건 묶음마다 커밋)해 실패한 단계만 다시 실행
- EBS API 응답 원본을 호출 기록과 연결해 보존해, 2~3단계가 실패해도 외부 재호출 없이 재처리
- 작업 지시와 내부 데이터 상태로 정합성 플래그(통과, 보류, 오류)를 정하고, 이미 있는 키로 온 생성 지시는 수정으로 바꿔 같은 지시가 반복돼도 결과가 같게 처리
- 교육과정 개편 2회와 EBS API 버전 변경 1회에도 같은 동기화 구조로 외부 콘텐츠 10만+ 건 반영
LMS 플랫폼 고도화(하이러닝·뉴쎔)
EBS 문항과 자체 제작 문항을 같은 분류체계로 묶어 학년·단원별 문제집 출제 구조 구현
- 교사가 학년과 단원을 고르면 그 단원의 문항으로 문제집을 만들고, 학생의 응시와 결과 확인까지 한 흐름으로 연결
- 직접, 선택, 랜덤, AI 추천 출제를 하나의 등록 흐름에서 유형별로 처리
- EBS 동기화 테이블과 문제집 테이블을 나눠, EBS 데이터를 다시 반영해도 교사가 만든 문제집이 유지되는 구조
- 여러 학생이 같은 문항을 받으면 뒤 학생의 문항이 저장되지 않던 문제를 유니크 범위에 학생 식별자를 넣어 해결
jQuery 화면을 전면 재작성 없이 Vue 컴포넌트 구조로 전환하고 응답 규격 통일
- SPA 전면 재작성 대신 JSP 화면에 Vue 컴포넌트를 마운트하는 방식을 골라, 구버전 병행 없이 2023년 9월에 새 화면으로 오픈
- Tiles 레이아웃의 head에서 Vue, 공통 통신 함수, 공통 컴포넌트를 한 번 불러오는 화면 구조 도입
- JSP로 응답 필드를 하나씩 매핑하던 방식을 공통 응답 객체의 JSON 응답으로 바꿔 팀 API에 적용