사수님과 데이터 베이스 성능에 대한 의견을 나눴다.
사수님께서 제안하신 방법은 두 가지 였다.
1. 거리 계산 문제
현재 내가 만든 API는, 쿼리를 통해 사용자와 식당 간의 거리를 계산하여 Response한다.
하지만 사수님은 클라이언트 단에서 사용자 좌표에서 기준이 되는 거리만큼 떨어진 곳에 위치한 남서쪽, 북동쪽 좌표를서버로 보내주면 식당 좌표의 위경도와 남서쪽, 북동쪽 좌표의 위경도를 단순 비교하여 해당되는 식당을 Response하는게 어떠냐는 제안을 주셨다.
하지만 이 방법은 사용자 위치를 기준으로 사각형 범위 내에 있는 식당들만 가져오게 된다.
전자의 방법은 사용자 위치를 기준으로 원형을 그리면서 동일한 거리 내에 있는 식당을 가져오므로, 후자의 방법을 채택할 경우 훨씬 적은 숫자의 식당이 SELECT 될 것이다.
과연 이렇게 사용자 편의를 포기할 만큼 쿼리를 통한 계산식이 리소스를 많이 소모하는 것인지 궁금했다.
2. VIEW 사용 문제
회사에서 기존에 VIEW 테이블을 사용하고 있다고 하셨다.
그래서 내가 하는 프로젝트에서도 VIEW 테이블을 직접 SELECT하는 방법을 사용하는 것이 어떻냐고 제안하셨다.
하지만 이미 원 테이블을 API에 잘 연결해 놓은 상태였기 때문에 VIEW 테이블을 생성해서 연결해야 하는 성능적인 이유를 알고 싶었다. (VIEW 테이블을 사용해 본 적이 없기 때문에 이에 대해 고민해 본 적이 없기도 했다.)
이 두 가지가 데이터 베이스 성능 향상을 위한 방법들을 찾아보게 된 계기이다.
찾아보다 보니 위 두 문제보다 많은 것을 알 수 있었다.
VIEW 사용은 자제한다.
우선 VIEW 테이블은 개발자의 편의를 위한 것이라고 한다.
큰 회사의 경우 DB가 방대하고 테이블은 더 방대하다.
각 부서에서 그들에게 필요한 컬럼명을 그때그때 알기란 쉽지 않다.
그러므로 VIEW 테이블을 통해 필요한 테이블과 컬럼을 편집하여 제공한다.
하지만 나처럼 작은 테이블을 운용하는 경우, 이것은 불필요하다.
더하여, 성능상의 문제 때문에 무분별한 사용은 지양하는 것이 좋다고 한다.
- 결과 레코드가 가장 적은 (HIT RATIO가 높은) 문장이 먼저 실행되어야하는데, VIEW를 먼저 가져오는 작업이 그 뒤에 실행되는 WHERE조건절보다 더 많은 결과를 가져오게 하는 것이 대부분이므로, 성능에는 불리할 수 밖에 없다.
- 또한 여러개의 테이블이 조인되는 경우 인덱스 사용에 제약이 많다. 물론 INDEXED VIEW가 있어서 어느정도 성능에는 효과가 있으나, 관련 테이블의 수정이 발생할 경우 문제가 생길 수 있다.
여기서 부터는 내가 평소에 실수하고 있던 부분이다.
1. JOIN을 사용하는 경우 INNER JOIN을 되도록 사용하라.
- 동일한 효과를 가지는 쿼리를 작성할 경우 INNER JOIN이 아닌 LEFT OUTER JOIN을 습관적으로 사용하는 경우가 있다. 두개의 조인방식은 확연한 속도 차이가 나므로 되도록이면 INNER JOIN을 사용하는 것이 좋다.
- 나의 경우 항상 LEFT JOIN을 사용하고 있었다.
2. DATA TYPE 정의시 가장 작은 데이터타입을 선택한다.
- 대부분의 경우 가장 작은 데이터타입을 선택하고 있었으나, 간혹 url을 데이터로 받을 때 한 없이 길어지는 경우가 있어서 TEXT로 받아오곤 했다.
- 8000자 이내의 문자열은 VARCHAR 데이터 타입을 사용하는 것이 좋다고 하니, 웬만하면 VARCHAR을 이용해야겠다.
이 외에는 대부분 잘 하고 있던 것 같다.
(그게 좋은 방법인 것을 알아서 잘 하고 있던 것은 아니다^^ 이제는 알고 잘할 수 있겠다!)
이렇게 공부한 부분에 대하여 사수님께 상의드렸고,
view는 사용하지 않고, 거리계산도 원래처럼 쿼리계산 하는 방식을 사용하기로 했다!
REFERENCE
관련 내용을 정말 잘 정리해 두신 것 같다.
'STUDY > 서버' 카테고리의 다른 글
[TI/Spring] 스프링이란? EJB와 비교 (0) | 2022.02.17 |
---|---|
백엔드 개발자 기술면접 질문 정리 (0) | 2022.01.27 |
[SERVER][SPRING] 검색하기 API (0) | 2022.01.21 |
[SERVER][HTTP, AJAX 통신, WebSocket, SSE] 특징, 장단점 (0) | 2022.01.20 |
[SERVER] AWS 서버 구축 + WinSCP로 EC2 접속 A to Z (0) | 2021.12.01 |