본문 바로가기

Develop/Web

UOSTime 업데이트 계획

 

나는 현재 서울시립대학교 시간표 관리 서비스 UOSTime을 개발/관리 중이다.

 

UOSTime은 08학번 선배님이 만드신 것으로 알고 있다. 그것이 이후 다른 선배님들에 의해 계속해서 개선되어왔고, 나는 2017년 말부터 팀에 합류했다. 내가 합류했을 당시, UOSTime은 완전히 새롭게 개발될 계획이었다(서버 작성 언어도 기존 PHP에서 Node.js로 변경되었다). 나는 프론트엔드를 맡았고, 나를 포함한 총 3명의 학우가 선배들의 도움을 받아 개발을 시작했다. 그렇게 2018년 8월, 새 UOSTime이 출시했다. 같이 UOSTime을 개발했던 두 선배는 이후 자연스레 졸업 및 취직을 했고, 그때부터는 나 혼자 간단한 유지보수 및 업데이트를 진행해오고 있다.

 

출시 이후로 UOSTime은 많은 것이 변했다. 하지만 대부분은 간단한 개선과 유지보수였다. 많은 시간과 노력이 필요한 큰 과제가 몇 개 있지만, 학업과 병행하기에는 무리라 생각하여 시작할 엄두를 못 내고 있었다. UOSTime을 관리할 새로운 후배님들도 아직 못 찾았다. 내가 적극적으로 찾지 않은 까닭도 있고, 가끔씩 친한 후배들에게 제안했던 것이 안 통했던 것도 있다.

 

어쨌든 고인 것은 썩는다. UOSTime은 중요한 개선 과제를 갖고 있고, 언젠가는 (되도록 빨리) 작업을 시작해야 한다. 그래서 그중 하나를 드디어 시작해보려고 한다.

 

DB 최적화

이런 작업에 대한 명칭이 따로 있는지 모르기 때문에 이름은 내 마음대로 붙였다. 주 내용은 다음과 같다.

 

강의목록 전체를 메모리에 적재하여 강의 검색 요청을 빠르게 처리하기

현재 모든 강의정보는 DB에 있고, 사용자가 강의를 검색하면 UOSTime은 DB에서 그 정보를 찾아 제공한다. 한 사용자는 일반적으로 여러 번의 강의 검색을 요청하기 때문에, 검색에 걸리는 시간을 줄이는 것은 꽤 중요하다. 그래서 모든 강의정보를 메모리에 적재하면 강의 검색 요청을 더 빠르게 처리할 수 있을 것이다. 전체 강의정보의 용량이 그렇게 크지 않고, 강의정보의 갱신이 드물기 때문에 이 방법은 유효할 것으로 생각된다. 기존 DB 접근 코드를 모두 수정, 테스트해야 하기 때문에 간단한 작업은 아니다.

 

 

기존 강의 스키마를 개선하고 사용자지정 강의 스키마를 만들기

현재 UOSTime은 Lecture 스키마와 MyLecture 스키마를 갖고 있다. Lecture는 강의정보를 담고 있다. 사용자가 강의를 검색하면 UOSTime은 해당 강의를 Lecture 중에 찾아 제공한다. UOSTime은 서울시립대학교로부터 강의정보를 제공받고 그 내용을 Lecture에 저장한다. MyLecture는 사용자의 시간표에 담긴 강의정보를 담고 있다. 사용자가 시간표에 강의를 추가하면, 해당 강의정보는 MyLecture의 형태로 저장된다. 시간표 스키마는 MyLecture의 배열을 가지고 있다.

 

문제는, MyLecture를 생성할 때 Lecture를 참조하는 것이 아니라 그대로 복사한다는 것이다. 따라서 Lecture가 갱신되어도 MyLecture는 갱신되지 않는다. 예를 들어, 내가 시간표에 'C언어및실습'을 추가했다고 가정하자. 이후에 해당 강의의 강의실 정보가 '19-110'에서 '19-B114'로 갱신되어도 내 시간표에는 '19-110'이 계속 저장되어 있다는 것이다. 현재는 사용자가 이 문제를 모르고 있거나, 해당 강의를 시간표에서 삭제 후 재등록함으로써 해결하고 있다. 이 문제를 해결하는 방법은 여러 가지가 있겠지만, 내가 생각한 방법은 시간표 스키마의 구조를 변경하는 것이다. MyLecture의 배열 대신 Lecture 배열을 갖도록 하는 것이다.

 

여기서 궁금점이 생길 수 있다. 처음부터 Lecture 배열로 쓰면 되는 것이 아닌가? 왜 MyLecture를 따로 만들었나? 사실기존에는, 사용자가 시간표에 등록된 강의정보를 자유롭게 수정하도록 하고 싶었다. 예를 들어 'C언어및실습' 강의의 이름을 'C언어'로 바꾸어서 보기 편하게 하는 등이다. 하지만 해당 기능을 일부 구현 중인 상태로 중단되어 있었다.

 

그래서 기존 MyLecture의 구조를 변경할 것이다. MyLecture는 Lecture의 ID를 통해 강의정보를 참조하고, 앞서 언급한 강의정보의 자유로운 변경을 위해 new_name 등의 속성을 추가할 예정이다.