Random
DB에 쿼리하기 VS 클라이언트에서 데이터 분류하기
SeanK
2022. 5. 4. 15:09
바보 같은 질문에도 항상 현명한 답을 주시는 우리 토이 프로젝트 팀원님...
오늘은 sorting 기능을 구현하다가 문득 이런 의문이 들었다.
분류 옵션을 선택할 때 마다 데이터베이스에서 새로운 데이터를 받아온다면, 자원낭비가 아닐까?
만약에 데이터를 한번만 불러와 로컬에 저장하고 분류 옵션을 선택할 때마다 클라이언트에서 저장된 데이터를 분류해서 새로 랜더링 하면 되지 않을까?
바보같은 질문에 팀원님은 아주 좋은 질문이라며 좋아하셨다. 읭?

답변을 정말 상세하게 주셨는데 아래와 같다.
A:
제가 생각하기에 분류와 그룹핑과 같은 기능을 데이터베이스 서버에서 실행하는 이유는 다음과 같습니다.
- 잘 구현된 데이터베이스 서버는 보통 클라이언트의 컴퓨터보다 더 많은 리소스를 가지고 있습니다. 따라서 클라이언트보다 수월하게 분류와 그룹핑을 할 수 있습니다.
- 데이터베이스에서는 아마도 분류하는 필드마다 인덱스를 가지고 있을 겁니다. 따라서 원하는 대로 데이터를 가져가는데 최적화되어있을 가능성이 높습니다.
- 다수의 필드를 오름차순과 내림차순으로 분류한다고 가정해 봅시다. 만약 이 작업을 서버에게 맡기면 개발자는 단순히 어떤 필드 값을 어떤 순서로 분류하고픈지를 말하면 됩니다. 하지만 클라이언트에서 분류를 하기 위해선 애플리케이션이 분류할 수 있는 모든 옵션에 대해 분류할 수 있도록 설정해주어야 합니다.
- 관계형 데이터베이스를 이용할 때, 분류 로직을 가지고 있는 쿼리에 그루핑 로직을 더한다고 생각해 봅시다. 마찬가지로 서버에서 로직을 처리할 때는 단순히 요청을 하면 그만이지만 클라이언트에서 구현을 위해선 모든 로직을 다시 만들어야 합니다.
- 애플리케이션에서 페이지를 설정한다고 가정해 봅시다. 만약 클라이언트에서 처리하려면, 모든 가능한 결과를 선택하고, 페이지를 나누고, 보여줄 페이지를 선택해야 합니다. 이는 서버에서 처리하는 것보다 더 많은 리소스를 잡아먹을 수 있습니다.
- 클라이언트에서 더 많은 업무처리는 클라이언트의 프로세서와 메모리를 사용한다는 의미입니다. 이는 강력한 데스크톱 컴퓨터를 이용하는 환경에서는 수용 가능하지만, 모바일 클라이언트에게는 배터리 소진과 데이터 사용으로 결과가 나타날 수 있습니다.
- 데이터베이스는 수십 년간 모든 형태의 오퍼레이션을 처리하기 위해 최적화되어 왔습니다. 자기 자신만의 분류 로직을 작성한다는 것은 이미 존재하는 기능을 복제하려는 시도와 같으며 아마 데이터베이스 로직의 성능을 따라가진 못할 겁니다.
하지만 분류 로직을 새로 만들어 내는 게 항상 나쁜 아이디어인 것은 아닙니다. 때때로 애플리케이션에서 자신만의 분류/그룹 기능이 필요할 때도 있습니다. 저의 경우 지금 회사의 개발팀이 그러한 상황에 놓여있습니다. 저희 팀은 두 개의 다른 데이터베이스 서버에서 오는 데이터 결과를 분류하려 하는데 이를 위해선 다수의 데이터베이스를 연합시켜야 하지만 그러한 툴이 따로 없기 때문에 애플리케이션의 메모리 공간에서 분류와 그룹 작업 처리를 할 수밖에 없는 상황입니다.