시작하며
벌써 외박신청 어플을 만든지 약 7개월이 지났다. 현재(2022/04/24)에 내가 작년에 작성했던 후기를 읽어봤는데 조금 부끄럽기도 하고, 뿌듯하기도 하다.
작년 9월부터 현재 4월까지 함수 호출 횟수다. 출시일이 제일 피크고 이후로는 평범한 수를 유지하고 있다. 이번 3월에 홍보를 한번 더 해서인지 횟수가 조금 올라왔다.
에러는 거의 없지만(보통 에러가 나는 경우는 비밀번호를 틀리는 경우다) 3월에 엄청난 에러가 찍혔는데, 이는 교명 변경으로 인해 도메인이 바뀌어서이다. 해당 사항을 인지하자마자 업데이트를 진행해서 다행히 괜찮았다.
다른 함수들을 두고, 로그인 함수만 본 그래프다. 보통 어플을 키면 먼저 로그인을 하기 때문에 로그인 수와 하루 이용자 수는 비슷하다. 물론 똑같다고는 말할 수 없는데 하루에 두 세번 이상씩 어플을 접속할 수 도 있기 때문이다.
지금까지의 어플 이용 상황은 그렇다. 이제는 사회적 거리두기와 코로나가 점점 종식을 맞이하며 아마도 다음학기부터 학교에서 외박 신청 제외 대상 보호자 동의서를 다시 받기 시작할 것 같은데, 그렇게 되면 더이상 이 어플은 필요가 없게된다. 씁쓸하기도 하지만 외박 신청에 신경 쓸 필요가 없어지니 좋은 일이다.
어쨌거나, 그 때에 나의 지식과 지금의 내가 알고있는 지식은 많이 달라졌다. 지금 그 때 작성한 코드를 보니까 낡은 코드였고, 또 코드가 한 곳에 모아져 있어 가독성도 그렇게 훌륭하지 않았다.
따라서 리팩토링을 진행하기로 했다. 각 함수를 모듈화하고 기존에 낡은 방식으로 작성된 자바스크립트 코드를 es6 버전에 맞게 작성하기로 했다. 그리고 이를 위해 aws lambda에서 사용하던 런타임을 node.js 12.x에서 14.x로 변경하기로 했다.
import
이전에 require 방식으로 모듈을 가져오거나, 라이브러리를 사용했는데 require은 commonJS에서 사용되는 함수이고, ES6에선 Import 키워드를 사용한다고 한다. 따라서 전부 Import로 교체했다.
모듈화
우선, 이전에 작성한 함수 4개 login, sendStayOut, findStayOutList, findPointList를 전부 모듈화 시키기로 했다. 이전에는 handler.js안에 전부 작성했었는데, 각각 전부 분리했다.
이렇게 해서 handler.js에서는 4개의 함수 모듈만 남기고, 나머지는 전부 fucntion 폴더안에 있는 모듈들을 사용한다.
login함수가 굉장히 간결해진 것을 볼 수 있다. loginFunction에는 기존에 있던 로그인 함수 내용을 전부 옮겼다. 나머지 3개의 함수도 마찬가지다.
모듈화도 조금 달라졌는데, 기존에 exports.함수이름으로 내보냈던 함수들을 앞에 export키워드를 붙여 전부 정리했다.
에러 처리
내가 만든 백엔드의 구조는 클라이언트 -> 나의 API -> 학교 API의 구조로 이루어져 있다. 따라서 나는 catch를 사용하여 학교 API에 요청을 보내다가 발생할 수 있는 에러에 대해 처리해놨었다.
이런 형태로 에러가 발생하게 되면 에러 사유와 함께 404 코드를 보내기로 했었다. 다만, 이 부분이 너무 구체적이지 못한 것 같아서 조금 더 구체적이게 error 객체를 사용해서 에러에 대한 이름과(name) 사유(message)를 받아서 body에 담도록 하였다.
다음과 같은 구조로 변경되었고, 에러가 발생할 때마다 status code도 전송하고 싶은대로 전송할 수 있게 변경했다. 코드는 여러가지를 넣어보려 했으나, 대부분의 상황에서 404가 제일 알맞은 것 같아서 거의 404를 채택하게 되었다.
그리고 하나 더 추가한 것이 있는데, 학교 API에 대한 에러다. 클라이언트 쪽에서 값을 잘못 전달한 경우에도 학교 API가 정상이라면, status code 200을 돌려주게 된다. 학교 API에 장애가 발생한 경우를 파악하기 위해서 만약 학교로부터 응답에서 status code가 200이 아니라면 따로 에러를 띄우는 함수도 만들었다.
모든 axios 요청에서 checkStatusCode함수를 사용해서 학교 홈페이지의 에러에 대해 검사하도록 했다. 만약 학교 홈페이지 에러가 발생하면 받은 status code를 사용하여 에러를 발생시키도록 하였다.
끝으로
위에 쓰지 않은 내용 중에선, axios와 쿠키 저장을 도와주는 axios-cookiejar-support의 라이브러리 버전 업데이트가 있다. 특히 axios-cookiejar-support의 업데이트로 사용법이 좀 바뀌어서, 쿠키 저장을 하는데 애를 먹었다. 나중에 따로 포스팅할 예정이다.
코드는 https://github.com/AUTO-Overnight/Auto_Overnight_API
여기에 가면 볼 수 있고, Releases도 해놨다.
이번 리팩토링을 진행하면서 es6에 대해 더 알 수 있었고, export와 default export의 차이점 등등 여러 가지를 많이 배웠다. 나중에 이것도 포스팅해야겠다.
또 나는 내 코드 테스트를 그냥 aws lambda에 deploy 한 다음 postman을 이용하여 테스트했다.
그런데 모든 API에서 똑같이 Internal server error라는 메시지만 응답하니 대체 어디서 왜 에러가 일어나는지 알 수가 없어서 꽤 고생했다..
찾아보니 aws lambda에서 테스트 페이지를 지원하고 거기서 node js 환경으로 코드를 실행시켜주기 때문에 테스트 이벤트를 만든 다음 실행해 볼 수 있었다. 결과는 내가 코드를 잘못 적은 것이었다.
만약 try-catch문같은 것으로 에러 처리를 해놓고 응답에 에러를 반환하도록 만들어놨다면, 조금 훨씬 더 만들기 수월했을 것 같다. 에러 처리를 조금 더 열심히 해야겠다는 생각을 했다.
'Backend > Nodejs' 카테고리의 다른 글
학교 외박 신청 어플 제작 후기 : serverless를 이용한 aws lambda backend (1) | 2021.09.27 |
---|