현재 재직중인 회사의 프로젝트 PoC의 전체적인 개발을 진행했습니다. React.js 기반의 Frontend는 익숙했지만 MySQL DB 사용부터 Flask를 사용하는 API Server 구현은 주변 분들의 도움을 많이 받고도 중간 과정에서 잡음이 참 많았습니다. 물론 지금은 정말, 제가 최대한 꼼꼼하게 확인한 범위 내에서는, 잘 동작하고 있으니 다행입니다.
저번 주에는 Python과 PyMySQL을 사용해 DB에 정보를 직접 보냈다면, 이번 주에는 SQL을 생성하는 ORM 중 하나인 SQLAlchemy를 사용해 DB에서 정보를 가져왔습니다. DB의 설계를 입력하면 Query를 직접 작성하지 않아도 된다는 점이 좋았지만, 정상적으로 작동하게 하기 위해선 Query를 포함해 ORM 라이브러리에 대한 이해가 선행이 필수라는 것을 배웠습니다. 만약 그런 것들이 없다면, 저처럼 요청부터 응답까지 5초 가량 걸리도록 코드를 작성하는 실수를 범해놓고 감히 ORM을 의심할 테니까요.
그리고 비록 단 하나였지만 API를 설계하고 Postman에 기록하는 과정도 경험했습니다. 그 과정에서 Postman과 같은 프로그램으로 API의 동작을 테스트하는 것이, 브라우저에 직접 요청을 보내는 것보다 몇 배는 더 편하다는 것을 깨달았습니다.
Grid.js라는 라이브러리를 이용해 API로 받은 데이터를 표로 보여주는 React.js 웹 어플리케이션을 만들었습니다. 빠른 개발이 필요했으므로 Create React App을 이용해 초기화를 진행했고, API를 사용해 데이터를 가져오는 로직을 작성했습니다. 더불어서 스타일링을 위해 오랜만에 SCSS를 사용하기도 했습니다.
사실, 이전에 진행했던 다른 프로젝트에서 배웠던 것들을 적용할 수 있었던 좋은 기회였기도 했습니다. 특히 API 요청을 너무 빈번하게 보내지 않도록 Lodash의 Debounce를 React.js에서 사용하는 방법에 대해 고민했습니다.
이미 준비된 VM 서버에 제가 제작한 결과물들을 배포하는 과정도 경험했습니다. 이를 위해 Flask 프로그램이 API Server 프로젝트를 인식할 수 있도록 구조를 변경했고, NGINX 관련 설정도 짧게나마 작성했습니다. Front 프로젝트의 Build도 진행했습니다. 배포 과정이 우아하지 못했던 것은 아쉽지만, 이는 앞으로 개선해나갈 수 있는 부분이라 생각합니다.
Flask를 사용하는 프로젝트라면 flask run
명령어로 간편하게 실행할 수 있다. 이 경우 코드 내의 Flask 객체를 인수로 넘겨주거나 Flask가 알아서 탐색할 수 있도록 프로젝트 구조를 변경해야 한다. 이 때 Module을 올바르게 import하고 있는 지 살펴보아야 한다.
나의 경우, 그냥 python
으로 실행할 때는 오류 없이 잘 동작했었던 코드를 Flask와 Gunicorn이 인식할 수 있도록 하는 과정에서 모든 import 문을 절대경로로 변경했다. 사견이지만, 절대경로를 사용하는 것이 개발자에게도 프로그램에게도 혼란스러움이 없는 것 같다. Python에도 경로 Alias 같은 것이 있으면 좋겠다는 생각이 드는 경험이었다.
/var/etc/nginx/*
에서 관리할 수 있다.상술한 상세 조건 검색 기능을 구현하기 위해 Grid.js 객체에 전달하는 URL의 Parameter를 변경하는 방식이었는데, 이때 React.js의 state를 사용했기 때문에 값이 변경되면 Grid.js의 표까지 다시 Render하며 API를 호출해버린다. 이렇듯 Input의 값이 하나씩 변할 때마다 빈번하게 호출하는 것을 막기 위해선 Lodash 라이브러리의 Debounce라는 기능이 필요했다.
단, React.js와 같이 사용할 경우 useEffect의 Callback의 반환값으로 cancel 메소드를 호출해줘야 한다. 컴포넌트가 unmount될 경우 debounced된 함수가 남아있는 케이스를 대응하는 것이다.
API 호출이 너무 오래 걸린다면 Query에 문제가 있을 가능성이 있다. EXPLAIN
으로 Query를 어떻게 DB가 연산할 것인지를 확인하는 것이 가능하다.
데이터의 추가와 삭제 및 수정보다 탐색이 상대적으로 빈번하다면 Index를 설정하는 것도 속도를 올릴 수 있는 방법 중 하나다. Index에 설정할 Column의 기준 중 하나는 값의 고유성이며, 이는 여러 Column을 엮어 Index를 생성할 때 이들의 순서를 정할 때에도 영향을 미친다.