백엔드에 입문한 이래로, 계속하여 대용량 데이터 혹은 대용량 트래픽처리는 어떻게 하는 것인가에 대한 생각을 하고 있다. 백엔드 개발자로써 모든 능력이 중요하겠지만, 대용량 트래픽을 감당할 수 있는 아키텍처 설계 및 구현보다 더 중요한 능력은 없다고 생각하기 때문이다.
아마 이는 병렬컴퓨팅과 비슷한 내용일 것이다. 병렬컴퓨팅은 여러 컴퓨터를 사용하여 하나의 거대한 계산을 처리하는 컴퓨팅 방법으로, 병목현상이 어디서 발생하는 지, 어떤 오버헤드가 발생할 지에 대해 끊임없이 생각하여야 한다. 물론 코드의 계산 효율을 고려하는 것은 당연시해야 한다. 아직은 잘은 모르겠지만, 대용량 트래픽 처리 역시 서비스에서 발생하는 병목지점을 찾고 이를 해결하는 방법에서 시작하리라 믿는다.
현재 존재하는 대부분의 어플리케이션은 memory bound에서 발생한다고 한다. 아마 극소수의 어플리케이션만이 CPU bound일 것이다. memory bound된다는 말은 CPU는 충분히 고성능으로 처리할 수 있지만, 메모리의 공급속도 때문에 계산 성능이 저하된다는 의미이다. 이를 해결하기 위하여 컴퓨터의 메모리는 계층적 구조(캐시메모리-메모리-하드디스크, 혹은 SSD)를 갖는다. 캐시메모리는 가장 접근이 빠르지만 비용의 문제로 용량이 작고, 하드디스크는 가장 접근이 느리면서 가장 느린 접근을 보인다.
그렇다면 데이터베이스에 접근하는 것은 어떠한 가에 대해 생각해보아야 한다. 하드디스크는 유선으로 연결된 버스를 통하여 접근하는 반면, 데이터베이스는 네트워크를 통하여 접근하여야 한다. 이 때에 발생하는 병목현상과, MySQL과 같은 DBMS는 온-디스크 방식이라는 것을 결합하면 데이터베이스 접근이 가장 큰 병목지점이라는 것을 유추할 수 있을 것이다! 아직까지 알아본 바에 의하면, DBMS는 옵티마이저라는 것이 존재하는 데, 옵티마이저를 잘 활용할 수 있도록 쿼리를 작성하면 데이터베이스의 성능을 높일 수 있다고 한다.
따라서 다음과 같은 결론이 가능할 것이다. 대용량 트래픽 처리를 위해서는(혹은 좋은 API를 구현하기 위해서는) 병목현상을 찾아서 제거해야 하며, 대부분의 병목현상은 데이터베이스 접근에서 발생하므로, 데이터베이스의 성능을 최대한 높이는 방법을 찾아야 할 것이다.
아직까지는 주니어 백엔드 엔지니어이므로 위와 같은 가설이 틀릴 가능성은 매우 높다. 하지만 이렇게 정답을 찾아가려고 노력한다면 언젠가는 옳은 지점에 도달할 수 있을 것이라 믿는다.
데이터베이스, 특히 RDBMS를 공부하기 위해서는 먼저 기본적인 사용법에 대해서 잘 이해하는 것이 필요해 보인다. 이를 위해서 인프런의 데이터베이스 강의 중에 이교준 강사님의 "Database - SQL"강의를 수강하고 있다. 아마 "데이터베이스 기초"탭에는 이 강의의 내용을 정리할 것 같다. 이교준 강사님의 강의를 선택한 이유는 단순히 다른 강의보다 트랜잭션 비중이 가장 많아서이다.