연락처 서비스 개발시 많은 데이터를 조회해서 화면에 뿌려줘야 하는 경우가 있었는데, 페이징 처리를 하지 않고 한 번에 다 보여줘야 했다.
우선 DB에서 데이터를 조회할 때 함께 Join 걸어야 하는 테이블의 수가 많아서, 데이터가 많을 경우 시간이 오래 걸렸다.
그리고 화면에서는 보여줘야할 값들이 많아서, 스크롤을 내릴 때마다 버벅거림이 심했다.
이 두 가지 이슈를 해결하기 위해 쿼리 튜닝과 Indexed DB를 이용한 캐싱 처리를 진행했다.
1. 쿼리 튜닝
DB 구조
테이블 명 |
구조 |
기본정보 |
address_service_no(PK), user_no(PK), user_name, .... |
전화번호 정보 |
address_service_no(PK/FK), phone_no(PK), phone_type, phone_number, ... |
이메일주소 정보 |
address_service_no(PK/FK), email_no(PK), email_type, email_address, ... |
직장정보 |
address_service_no(PK/FK), company_no(PK), company_name, .... |
기본정보 테이블의 PK를 PK이자 FK로 사용하고 있는 다른 테이블에서 해당하는 데이터를 뽑아와야 했다.
user_no에 해당하는 address_service_no들의 기본, 전화번호, 이메일주소, 직장 정보를 모두 조회해야한다.
기존에는 테이블마다 Inner Join을 걸어서 조회했는데, 한 연락처에 가지고 있는 이메일, 전화번호, 직장 정보가 많을 경우에는 시간이 오래 소요되었다.
이 부분을 어떻게 해결해야할 지 막막했는데, 다른 서비스 개발자 분으로 부터 도움을 받았다.
그래서 사용한 것이 array_to_json 이다.
연락처 1개당 속해있는 전화번호, 이메일주소, 직장정보를 json array로 뽑아내는 것이다.
아래 'companyinfolist' 는 json_array로 뽑아낸 직장정보이다.
이렇게 array_to_json으로 데이터를 조회하니까 훨씬 속도가 빨라졌다.
참고: https://www.postgresql.org/docs/9.3/functions-json.html