나는 이번에 매출 관리 페이지를 맡았다. 매출 관리 페이지에서는 주문 정보를 가공해서 여러 정보를 보여주고자 하였다.
특정 기간 동안 판매된 메뉴 들의 판매 갯수와 금액. 그리고 총합.
특정 기간 동안 방문한 매장 식사 고객 수와, 포장 고객 수. 총합.
특정 기간 동안 방문한 신규고객과, 재방문고객 그리고 이를 토대로한 재방문율.
총 세 가지의 정보였다.
이걸 구현하기 위해서는 order 테이블에서 정보를 조회해와야 했다. 처음에는 단순히 order테이블에서 내가 필요한 정보를 가져와서 띄어주었다. 그러나 이렇게 했을 경우 order 테이블의 컬럼이 너무 많았기에 데이터를 조회해올 때 효율성이 떨어진다는 단점이 존재하였다.
그래서 그 다음 단계로 order테이블에서 필요한 컬럼만을 추출해 낸 테이블, 판매된 메뉴에 관한 정보를 담은 orderMenu와 방문 고객에 정보를 담은 orderVisit테이블을 만들었다. 처음에는 order라는 테이블에 주문이 입력될 시에 orderMenu와 orderVisit에도 동시에 값이 입력되도록 하면 어떨까 하였다. 그러나 이 경우에는 데이터 입력 시 세 테이블에 동시에 값이 입력되어야 하기 때문에 비효율적이었다.
그래서 order테이블의 정보를 가져오기만 하면 될 것 같았는데 처음에는 order테이블의 고유키를 참조할 필요 없이 다른 필요한 정보만 컬럼으로 만들어 값을 가져올 생각이었다. 누가 주문한 것인지 주문 자체의 정보는 사용할 필요가 없으니 굳이 가져오는 게 불필요하다는 생각 때문이었다.
그러나 이 과정에서 같은 팀원 중 한 분이 고유키 값을 토대로 값을 참조해와야 효율적인 조회가 가능하다고 조언해주셨다. 고유키값의 인덱스를 토대로 정보를 조회해오기 때문에 이 방법이 훨씬 효율적이라는 것이었다.
그래서 order의 고유키를 외래키로 참조해서 테이블을 다시 만들었는데 이 단계에서 한 가지 더 신경써야 하는 부분이 테이블의 동기화였다. 나는 단지 값을 가져오기만 하면 괜찮을 것이라 생각하였는데 데이터의 무결성과 신뢰성을 위해서 테이블간의 동기화 설정도 해주어야 했다. 이 과정에서 테이블의 동기화 방법이 다양하다는 것을 알게 되었는데
네 가지 방법이 존재하였다. 그러나 우리가 사용하는 Sequelize는 view와 트리거를 자체적으로 지원하지는 않았다. 물론 사용할 수는 있었는데 그렇게 할경우 과정이 더 복잡해지고 비효율적이라는 생각이 들어 배제하였다. 그래서 훅과 include중에 고민을 하였는데 나는 데이터를 조회할 때 동기화가 필요했기 때문에 include가 더 적합해 보였다.
훅을 사용할 경우에 동기화는 가능했지만 테이블에 데이터가 입력될 때마다 동기화가 이루어진다. 이렇게 할 경우 조회하는 상관없이 계속해서 동기화가 발생하고 있는 것이기 때문에 자원을 낭비한다는 생각이 들었다. 그래서 include로 테이블을 동기화 시킨 뒤 값을 조회해올 수 있었다.
그러나 사실 각 방식을 비교해봤을 때 동기화를 위한 가장 효율적인 방법은 view테이블이라는 생각이 들었다. 물리적인 환경에 저장되지 않는 가상의 테이블. 특정 테이블에서 필요한 데이터만 컬럼으로 가지는 가상의 테이블을 임시로 만들어 값을 조회해오면 더 효율적이지 않았을까. 이번에 데이터 조회 효율성까지는 측정해볼 수 없었는데 다음 프로젝트는 이 부분을 염두해보고 프로젝트를 진행해야겠다.