규도자 개발 블로그

쿼리로 구현하기 VS 코드로 구현하기 본문

Database/Database

쿼리로 구현하기 VS 코드로 구현하기

규도자 (gyudoza) 2018. 10. 24. 21:37

쿼리로 구할 수 있는 데이터는 따로 데이터베이스에 넣지 않는 것이 좋다.

그 데이터를 복잡한 연산에 자주 사용하는 것이 아니라면 말이다. 예를 들어 여러 플랫폼에서 흔하게 볼 수 있는 추천인 시스템을 구현한다고 했을 때, 해당 회원에 종속돼야할 정보는 해당 회원에게 발급된 추천인 코드와 해당 회원이 가입할 때 입력하였던 추천인코드, 이 두 개면 시스템을 구성하는 데는 충분하다. 하지만 만약, 해당 회원에게 종속된 데이터에 부가적인 정보, 예를 들어 해당 회원을 추천한 회원들의 목록, 추천한 회원들의 숫자 등의 정보가 부가적으로 존재할 뿐더러 이 정보를 실제 서비스플로우에서 사용하게 되는 경우라면... 갑자기 머리가 아파진다.
 특정 회원을 추천한 회원들의 목록은 쿼리로 구할 수 있다. 그 회원들의 숫자 또한 쿼리로 구할 수 있다. 하지만 이렇게 쿼리로 구할 수 있는 데이터를 따로 다른 열을 만들어 메타데이터로 저장하거나 혹은 다른 행을 만들어 다른 요소로 추가한 데다가 실제 코드에서 이용하고 있다면, 그건 구조적으로 굉장히 비효율적인 모습이다.
 한가지 예를 들어보자. 어떤 사람 A가 받은 추천인을 다른 회원 B에게 옮기고 싶다고 한다. 전자의 경우에는 A회원을 추천한 사람들이 가입할 때 입력하였던 코드(A가 발급받은 코드)를 옮기고 싶은 회원(B)의 코드로 변경하면 끝이다. 만약에 추천한 사람들의 내역이나 숫자들이 필요할 땐 해당 추천인코드로 쿼리를 짜면 된다.
 이제 두번째로, 추천인 정보를 기반으로 여러 부가적인 데이터가 종속돼있는 경우를 살펴보자. 위의 예처럼 A가 받은 추천인 리스트를 B에게 양도하고 싶다고 한다면... 일단 전자와 같이 A를 추천한 사람들의 코드를 B로 변경한다. 그리고 나서 B의 추천인 코드를 입력한 사람들의 숫자를 다시 구해서 업데이트 시켜줘야 하고, 또 그 목록 또한 다시 구해서 업데이트 시켜줘야 한다. 한 번의 작업이면 끝날 일을 세 번에 걸쳐서 하게 되는 것이다. 말이 세 번이지 실제 코드로 구현하게 되면 UPDATE로 구성된 쿼리 한 번이면 될 것을 여러번의 SELECT문과 반복문을 통해 업데이트과정을 거쳐야 한다. 행여 A와 B가 서로를 추천한 경우라고 하면 검색된 추천인 코드를 일괄적으로 바꿀 때 자기 자신을 추천하게 되는 등의 오류처리까지 해야한다. 어쩌면 더 편리하게 사용하기 위해 만들어놨던 부가데이터가 코드의 결합도를 높여 작업하기 불편하게 만들어진 것이다.

 

그렇다면 올바른 방법은 무엇일까.

쿼리로 구할 수 있는 요소는 따로 데이터베이스에 저장하지 않는 게 좋다. 데이터베이스 안에서 프로시저와 트리거, 그리고 각종 함수를 이용해 모든 연산을 처리하라는 말이 아니다. 데이터베이스는 기본적인 CRUD연산만 빠를 뿐, 다른 연산이 추가되면 급속도로 속도가 저하된다.

 최고의 방법은 쿼리는 간결하게, 나머지는 코드로 구현하여 해당 데이터에 대한 부가적인 정보(예 : 추천인의 총 수, 추천인의 리스트)가 필요할 때마다 해당 정보를 데이터베이스에서 직접 가져오는 방법이 아니라, 코드에서 데이터베이스를 조회하여 용도에 맞게 정제된 형태로 뿌려주는 함수를 각각 구성하여 사용하는 것이다. 읽다보면 연상되는 것이 있을 것이다. 바로 '클래스'라는 것이다. 추천인 클래스를 만들고 종속적인 데이터는 발급된 추천인 코드와 추천한 추천인 코드만으로 유지하면서 나머지 부가적인 데이터는 클래스 안에 함수로 구성하여 사용한다면 결합도는 낮고, 응집도는 높은 형태의 코드를 구성할 수 있다.


마지막으로 정리하자면... 조금 김새는 얘기일 수도 있지만 그럼에도 불구하고 절대적인 건 없다는 것이다. 대부분의 경우에는 위의 방식을 채용하고 있을 뿐더러 코드의 효율과 유지보수성도 좋지만 처음에도 언급했다시피 알고 보니 이 플랫폼에서는 추천인의 총 숫자를 가지고 하는 연산이 훨씬 많이 일어날 뿐더러, 추천인의 추가와 삭제, 혹은 양도가 극소수로 일어난다면 차라리 총 숫자를 데이터베이스에 저장하여 연산하는 게 그때그때 데이터베이스를 조회하여 코드로 결과값을 리턴받는 것보다 훨씬 효율이 좋고 빠르다. 결국 중요한 건 해당 플랫폼에 대한 깊이있는 이해도와 그것을 바탕으로 한 타당한 설계 및 데이터플로우를 짜는 것이다.


바로 그것이 역량이고 실력이다.

Comments