Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

2019년, 내 학점 데이터 분석 여정

Muhun Kim
December 13, 2019

2019년, 내 학점 데이터 분석 여정

2019년 리틀 빅데이터 송년회에서 발표한 발표 슬라이드입니다.

제주대학교 학사 데이터의 복잡성을 풀어내고, 이를 시각화하며 사용자의 경험을 개선하는 과정을 담았습니다.
Preact와 TypeScript를 활용하여 최소 기능 제품(MVP)을 제작하였고, 그 과정에서 데이터 정제, UI 개선, 그리고 학점 시각화 프로젝트를 통해 얻은 인사이트를 공유했습니다.

Muhun Kim

December 13, 2019
Tweet

More Decks by Muhun Kim

Other Decks in Programming

Transcript

  1. 2019년, 내 학점 데이터 분석 여정 리틀 빅데이터 송년회 2019

    김무훈, 2019년 12월 13일 제주대학교 학적 데이터의 복잡성을 풀어내고, 분석한 과정을 소개합니다.
  2. 좀 특이한 이야기 저희 학교 서비스(dreamy.jejunu.ac.kr)의 학적 데이터를 풀어봅니다. 1.

    난해한 학적 데이터를 다시 정제합니다. 2. 이미 있는 웹 서비스를 가능한 가장 간단한 방법을 찾아 개선합니다/ 위 두가지를 반복하여, 주변에 피드백을 반복해서 얻었습니다.
  3. 목차 1. 2019년에 우리 학교 학사 시스템을 지탱하는 기술 2.

    난해한 학적 데이터 프로퍼티 문제 🤨 3. 꼭 필요한 데이터만 보여줄 수 없을까? ➡ 직접 만들어보자 4. 최소 기능 제품(MVP)을 구현하기
  4. 우리 학교 학사 시스템의 FE 기술 현실 🏚 - Namo

    webEditor v4.0 (평가판, Trial 사용 중) - EUC - KR 과 UTF - 8 텍스트 인코딩이 혼합된 콘텐츠 형식 - AJAX & <iframe/> based component < 그림 1, http://dreamy.jejunu.ac.kr:8080/sugang/index.html > < 그림 2, EUC - KR 인코딩 된 ъ੄_੗ܐ.txt>
  5. 웹 서비스의 기본? (주관) • 사용자 경험을 개선하기 위해 불편

    요소를 최소화하기 • 제공되는 정보의 의미를 명확하게 전달하기 • 사용 중인 기술과 도구를 적절히 활용해야 합니다. 😱 • < 그림 4> iframe 컴포넌트 로드가 간헐적으로 타임 아웃이 남. < 그림 4, iframe 컴포넌트 타임 아웃 >
  6. 난해한 학적 데이터 • 서버로부터 받는 학적 데이터의 프로퍼티 의미가

    명확하지 않습니다. • 암묵적인 프로퍼티 이름(예 : SEONGJEOG_TOT = 성적 토탈), 값의 숫자와 문자 타입의 구분 X • 위와 같은 전체 데이터를 사용자에게 별다른 힌트 없이 바로 보여주고 있음 ➡ 사용자가 서버의 내부 상황을 역으로 이해하거나 고려하도록 강요하고 있습니다. 메서드 URL Body (Form Data) 쿠키 POST https://dreamy.jejunu.ac.kr/susj/ com/com_su.jejunu {"mode":"doSchd", "job_id":"SEONGJEOG_TOT"} JSESSIONID, WMONID 표1, 전체 성적 요청 페이지에서 사용하는 AJAX 요청 중 하나. 코드1, 전체 성적 조회 요청의 AJAX 응답 데이터
  7. 난해한 학적 데이터 : 표 UI ❔ ”내 평점보다 4.5

    평균값이 더 높네? 전교생 표준 평균인 건가?” 아.. 4.3 만점을 4.5 로 치환해서 보여준거구나 (정규화 하면서 암) 그림 3, 전체성적조회 표 신입생 : 우리 학교는 4.3과 4.5 중 어떤 학점제를 사용하나요? 신청/평점, 취득 학점의 차이점?
  8. 사용자가 필요로 하는 핵심 데이터만 제공할 방법은 없을까? Preact 컴포넌트를

    활용한 확장 기능 프로토타입 테스트 • 로그인/로그아웃 • 메인 페이지 / 세션 유효 시 메인 페이지로 리다이 렉션 • 학번 또는 비밀번호 N회 틀림 알림 • 세션 만료 알림 Proof of Concept 결과물: https://github.com/reflation/prototype < 영상 1. 프로토타입, https://youtu.be/Ney5-npznkM > < 영상 1. 프로토타입, https://youtu.be/Ney5-npznkM >
  9. 최소 기능 제품(MVP) 만들기 “기존 UI를 React 컴포넌트로 전부 대체하기가

    힘드네요.. 아샬(멘토) : 독립적인 개발 환경을 만들어 작업해보면 어떨까요? 나중에 컴포넌트를 덮 어 씌우면 괜찮을 테니 말이죠. 그리고 모든 학적 데이터를 처리하기에는 양이 많은데, 대 학생이 가장 관심 있어할 정보가 뭘까요? 졸업 요건 정보가 가장 중요하겠죠. 아샬(멘토): 학점 시각화라는 단일 목표를 설정하여 일주일 내로 구현하고 검증해보세요. 이 과정이 바로 MVP 제작입니다”
  10. 주변에서 받은 피드백 •최대로 취득 가능한 평점 •졸업 가능한 최소한의

    점수 제시 •남은 필수 이수 교양 강의 목록 일주일 뒤의 첫 MVP < 영상 2. 첫번째 MVP, https://youtu.be/iVa9e1w9UMM > < 영상 2. 첫번째 MVP, https://youtu.be/iVa9e1w9UMM >
  11. 데이터 정제는 일반적으로 서버 측에서 처리하는 것이 이상적입니다. 그러나 저희

    학교의 학적 서비스는 그 책임을 클라이언트에게 전가하고 있습니다. (백여 줄에 달하는 데이터 요청 및 정보 가공 코드를 확인하며 경악했던 경험이 있습니다.) 데이터 정제하기
  12. 서드파티 전적 서비스(예: solved.ac, jubeat.tools 등)의 애플리케이션 모델 참고 별도의

    서버에서 데이터 정제 및 서빙하고 프런트엔드는 받은 데이터를 바로 보여주고 있습니다. 미러 서비스 만들기
  13. 한 함수당 한 기능을 수행하는 요청/정제 내부 모듈을 만들었습니다. 학적

    데이터를 별도의 서버에서 정제하기 * export const fetchAndParse = async (account: UserNoPw) = > { const { data: { semestersReqParams, . . . user }, cookie, } = await fetchList(account) const rawSemester = await Promise.all( semestersReqParams.map(params = > fetchSemester({ cookie, params })) ) return { . . . user, semesters: postSemesters(rawSemester) } } https://github.com/reflation/frontend/blob/legacy/src/components/Main.tsx#L109 - L166
  14. TypeScript와 Prisma로 데이터 타입 안전성 확보하기 • Prisma, 새로운 개념의

    ORM 클라이언트 • TypeScript, Golang 지원 • 데이터 모델에 대한 타입세트 생성
  15. enum SemesterType { FIRST SUMMER SECOND WINTER } type Subject

    { id: ID! @id title: String! code: String! grade: String! course: String! } / / Code generated by Prisma ([email protected]). DO NOT EDIT. export type SemesterType = "FIRST" | "SUMMER" | "SECOND" | “WINTER"; export type SubjectOrderByInput = | "id_ASC" | "id_DESC" | "title_ASC" | "title_DESC" | "code_ASC" | "code_DESC" | "grade_ASC" | "grade_DESC" | "course_ASC" | "course_DESC"; datamodel.prisma models/prisma/index.ts $ prisma generate 데이터 모델에 대한 타입 세트 생성하기 TypeScript와 Prisma로 데이터 타입 안전성 확보하기
  16. https://us1.prisma.sh/.../dev 정해둔 DBMS 엔드 포인트로 동기화 데이터를 타입 안전하게 다루기

    feat. TypeScript & Prisma enum SemesterType { FIRST SUMMER SECOND WINTER } type Subject { id: ID! @id title: String! code: String! grade: String! course: String! } datamodel.prisma $ prisma deploy
  17. 메일 기반 로그인 ➡ 데이터 받아오기 ➡ 메인 페이지 <

    영상 2, 두번째 MVP, https://youtu.be/txMMH4WNX_A > < 영상 2, 두번째 MVP, https://youtu.be/txMMH4WNX_A >
  18. 마치며 • 잘못된 사례를 통해 웹 개발의 중요한 교훈을 속성으로

    배웠습니다. • 적어도 5년차 웹 프로그래머 스택 완성? • 이런 경험을 멘토님과 공유하면서 Waterfall 에서 Agile 로 넘어가는 개발 체험을 했습니다. • MVP, TDD, 짝 프로그래밍 • 다만 품질을 신경쓰니 기간 편차가 심했습니다. • 1차 구현 : 4일 • 2차 구현 : 4주 (React Native 에서 미러 웹 서비스로 기획을 바꿈)
  19. 앞으로 해야 할 일 • 서비스 출시 준비 • 데이터

    확장 및 통합하기 (강의 정보와 성적 연동)