러너틱 컨텐츠 매니지먼트 서버
개요
해당 프로젝트는 러너틱에서 제공하는 mAuthor OpenAPI를 가지고 mAuthor 홈페이지에서 로그인 후, 컨텐츠 하나 하나 다운 후에 NCP ObjectStorage에 업로드하는 과정을 자동화하고, 웹 페이지에서 간단하게 업로드한 프로젝트 및 컨텐츠를 확인할 수 있는 서비스를 제공하는 역할을 한다.

서버 역할
- Learnetic Open API: 러너틱 컨텐츠를 다운받을 수 있게 하는 서버로 러너틱에서 제공하며, 제공된 계정에 권한이 없을 경우 다운로드 요청 시, 443 에러가 발생할 수 있다.
- Streamlit: Python에서 Library로 간단한 프론트 Web Server를 컴포넌트 형식으로 구현할 수 있게 한다.
- FastAPI: Python, Backend Framework로 Async Parallel REST API를 구성하였다.
- Redis: Memory 기반 Cache 사용된 데이터베이스이다. 로그인 관련된 정보를 CRUD한다.
- aidt-learnetic-mysql: NCP에서 제공하는 mysql 데이터베이스이다. 컨텐츠와 관련된 project, lesson(contents), user, log 테이블을 포함한다.
- ObjectStorage: NCP에서 제공하는 데이터베이스로 실제 mAutor에서 다운 받은 컨텐츠를 업로드하는 장소이다. AWS에서 제공하는 S3와 동일한 기능을 한다.
1차년도 개선점
- 로그인 프로세스가 추가되었다.
- 기존 Parallel 로직을 처리하는 부분의 버그 및 예기치 않은 상황에 대한 예외처리 추가.
- Streamlit은 불완전한 Async를 지원하고 공식적으로는 지원하지 않는다. 1차년도에서는 불완전한 Async를 사용하고 있었으나, 이것을 sync 형식만 사용하고 REST 서버에서 완전한 Async 및 Parallel 로직을 수행하도록 API 신규 추가 및 개선이 되었다.
- Streamlit에서 제공하는 Caching 방법 또한 위로 인한 사유로 정상적으로 동작하지 못하였고 그로 인해 제대로 cache를 사용하지 못했었다. 이번 변경점에서는 TTL 추가와 화면 Refresh를 획기적으로 caching을 사용하여 줄였다.
- 기존의 다운로드 요청 → 서버 내부 Local Storage 저장 → 업로드 하는 프로세스에서 서버 내부 Memory 사용 → Chunk로 업로드 요청 하는 프로세스로 변경되어 서버 내부 Disk 증설하지 않아도 된다.
- REST 서버의 Async, Parallel의 로직 개선으로 기존에 다운로드 요청 → 다운로드 → 업로드 과정에 소모되던 시간이 엄청나게 많이 줄었으며 (체감 상 4배 이상), 해당 프로세스를 동작 중에 에러 발생율이 획기적으로 줄었다.
리펙토링 문제점