Attend 리팩토링 프로젝트

기존에 만들었던 Attend 서비스를 리팩토링 하려고 합니다.

DU Things 에 속하는 Attend 서비스는 출석 QR 코드를 미리 저장해서 원클릭으로 출석하는 서비스입니다.

이 서비스는 2019년 처음 개발되었습니다. 비공개로 아는 사람끼리만 쓰다가 MiscThings 동아리를 개설하면서 장애학생을 위한 서비스로 2021년 11월에 공개 했습니다.

기능은 단순합니다. 그냥 출석 QR 코드를 미리 찍어 두면 다음부터는 사이트에 접속해서 출석 버튼을 누르기만 하면 됩니다. (물론 기존과 같이 DU Wifi 에 연결되어야 함.)

출석 QR 코드를 그냥 브라우저에 저장해도 됐지만, QR 코드를 이용해 출석 링크를 생성하는 과정에서 복호화가 필요합니다.
아무래도 복호화 키를 공개하는 것은 무리가 있다고 판단했습니다. 또한 기기간 연동도 될 수 있게 하려면 사용자 관리까지 들어가야 할 것 같아서 백엔드 서버를 두기로 했습니다.
그래서 백엔드 서버의 역할은 아래와 같습니다.

  • 회원 관리 (출석 QR 데이터 저장)
  • QR 복호화
  • 이벤트 관리

처음 구상했던건 QR 복호화와 회원 관리 밖에 없었습니다. QR 복호화는 데이터베이스 필요 없이 값을 해독해서 응답을 주면 되었고 회원 관리는 따로 데이터베이스가 필요했습니다.
일단 사용자가 많지 않을거라고 생각해서 sqlite 로 간단하게 개발했습니다. 하지만 공개 이후 많은 사용자들에게 배포해보자 라는 욕심이 생겼고 적극적인 홍보를 통해 지금은 약 1100명이 사용하고 있습니다.

리팩토링이 필요한 이유는 다음과 같습니다.

  • 데이터베이스 관리.
  • 서버 관리

두가지 걱정거리에 대해서 알아보겠습니다. 서비스를 운영하기 위해서 1100명의 인증 정보와 강의실 정보를 저장해야 합니다. 현재 데이터베이스 구조는 sqlite 를 사용하여 KV 저장소와 비슷하게 구성되어 있습니다.
Key 는 ID 로 Value 는 암호와 강의실 정보로 이루어진 JSON 을 담고 있습니다. 지금 json 이 잘못 저장되면 복구 할 수 있는 방법이 딱히 없기도 하고 실수로 지워버리면 돌이킬 수 없기 때문에 안정성이 높은 클라우드로 이전하려 합니다.

두번째는 서버 관리입니다. 현재는 vultr 에 가상서버 1대만 구성되어 있습니다. 업데이트를 할 때나 인스턴스 장애가 일어난경우 백엔드와 프론트엔드 모두 중단되는 구조입니다. 고가용성을 위해 홈서버를 포함하여 운영해볼 계획입니다.

그럼 다시, 데이터베이스는 뭘 고르고 서버 구조는 어떻게 구성해야 할 지 고민해야 합니다.

서버 언어는 Java 로 단계적으로 전환할 겁니다. Spring, JPA 연습 겸 선택했습니다.

데이터베이스는 cockroach database 를 사용할겁니다. 고가용성에 맞게 구성된 데이터베이스기도 하고 클라우드 서비스를 제공해줍니다.

서버 구조는 아래와 같이 구성했습니다.


cockroach db 도 cloud 상에 있고 정적 파일 또한 cloudflare page 라는 cloud 상에 있습니다.
정적 페이지 상에서 서버 목록을 읽고 연결을 테스트하고 가장 빠른 서버를 선택하게 할 것입니다. 물론 이 과정이 느리다는것은 잘 알고 있습니다. 아마 클라이언트에서 아래와 같은 단계를 거칠 것입니다.

서버를 여러대 두고 고를 수 있게 한다면 세션 관리를 각 서버마다 동기화 해줘야 합니다. 이 과정은 매우 어렵고 귀찮기 때문에 jwt(Json Web Token) 를 사용할 겁니다. 서버간 비밀키만 공유되면 어디에서든 토큰 검증을 할 수 있기 때문입니다.

위와 같이 서버 선택이 가능하도록 구현한다면 하나의 서버가 죽었을 때 클라이언트에서 나머지 접속이 가능할 것입니다. 보통은 HA Proxy 같은 소프트웨어를 사용하지만 관리할 서버를 줄이기 위해 클라이언트에서 서버를 선택하게 개선할 것입니다.

백엔드 서버 구조도 개선해야 합니다. 현재는 로그인 코드에 의존되어 있는게 많은데 인증 절차를 토큰으로 대신함으로써 미들웨어에서 전부 처리할 예정입니다.

Attend 특성상 방학기간에는 사용자가 없는 서비스입니다. 방학기간 내에 리팩토링을 마치고 과정까지 업로드 하겠습니다 😘

댓글 남기기