여러분, 데이터베이스 선택이 얼마나 중요한지 아시나요? 현대 애플리케이션에서 데이터베이스는 그야말로 중심 역할을 합니다. 올바른 데이터베이스를 선택하는 것은 프로젝트의 성공을 결정짓는 중요한 요소 중 하나입니다. 저는 이번 글에서 대표적인 관계형 데이터베이스인 MySQL과 비관계형 데이터베이스인 MongoDB를 비교해 보려고 합니다. 각 데이터베이스의 특징을 살펴보고, 제가 직접 겪었던 경험도 공유해 보겠습니다.
먼저, MySQL과 MongoDB의 가장 큰 차이점은 데이터 구조입니다.
데이터를 어떻게 모델링하는지도 두 데이터베이스 간의 큰 차이 중 하나입니다.
이 부분에서 많은 차이가 있는데요, 바로 JOIN 기능입니다.
JOIN 기능을 사용합니다. 예를 들어, 사용자의 주문 정보와 해당 사용자의 정보를 한 번에 가져올 수 있죠.JOIN 연산을 지원하지 않지만, aggregation 파이프라인의 $lookup을 사용하면 제한적으로 조인 기능을 구현할 수 있습니다. 하지만 이는 MySQL의 JOIN만큼 최적화되어 있지는 않아서 대량의 데이터를 다루는 경우 성능 문제가 발생할 수 있습니다.저희 팀이 MongoDB를 선택하게 된 이유는 두 가지였습니다.
그렇지만 많은 데이터를 참조해야되는 인사관리 프로그래밍 특성상 맞지 않았고 이로 인해 직접적으로 문제와 그때 당시 해결했던 방법에 대해서 작성해볼까 합니다.
MongoDB를 사용하면서 가장 고생했던 순간 중 하나는 JOIN 기능의 부재였습니다.
당시 제가 맡았던 작업은 한 달 동안의 근무 기록을 가져와서 각 조직 내 근로자들의 하루 근무 데이터를 바탕으로 연장근무, 야간근무, 휴일근무를 계산해 보여주는 기능을 구현하는 것이었어요. 문제는 MongoDB에서 JOIN이 없기 때문에 각 데이터를 일일이 접근해야 했다는 점이었죠.
예를 들어, 한 조직에 대해서 user_id + company_id를 사용해서 userCompanyRecord(인사정보)를 가져오고, 다시 company_id 와 userCompanyRecord_id를 가지고 근태 기록을 가져와야 했죠. 이걸 매달 30일치(대략 한 달의 일수) 데이터를 조회하고, 이를 통해 연장근무, 야간근무, 휴일근무를 하나씩 계산해야 했습니다. 게다가 가장큰 조직은 회사 전체 조직으로 약 1000명의 근로자에 대한 데이터를 다루면서 각 인원의 근무 정보를 그래프로 시각화하는 기능도 포함되어 있었습니다.
이렇게 많은 데이터를 반복적으로 조회하다 보니, 개발 서버에서 테스트할 때 리소스 사용량이 급격히 증가했고, 속도도 매우 느려졌습니다. 결국 대량의 데이터를 실시간으로 처리하기에는 한계가 있었습니다. 외주 회사에서는 실시간성이 필요하지 않다고 했기 때문에, 이를 빠르게 해결하기 위해 자정에 하루 단위로 데이터를 미리 계산해 저장하고, 이를 조회하는 데이터 캐싱 방식으로 변경했습니다.
이 경험을 통해 대량의 데이터를 다루는 상황에서는 관계형 데이터베이스의 JOIN이 얼마나 효율적인지 다시 한 번 깨닫게 되었고, MongoDB를 사용할 때는 처음부터 데이터 조회 구조를 잘 설계하는 것이 얼마나 중요한지를 절실히 느꼈습니다.
추가적으로 그 당시에는 $lookup 기능을 사용하진 않았습니다. 아마 사용했으면 조금 더 좋아질 수는 있었겠지만 JOIN 과 완벽하게 동일하진 않기 때문에 여전히 문제가 지속될 가능성이 있습니다. (다음엔 기회가 된다면 $lookup 을 사용해 봐야겠습니다!)
이 부분에 대해서는 다음 기회에 더 자세히 다뤄보려 합니다!
그렇다면 MySQL과 MongoDB는 어떤 경우에 적합할까요?
결국, 적절한 데이터베이스를 선택하는 것이 중요합니다. MongoDB와 MySQL은 각기 다른 장점과 단점을 가지고 있으며, 프로젝트의 요구사항에 따라 알맞은 데이터베이스를 선택하는 것이 성공의 열쇠입니다. 저 역시 이번 경험을 통해 JOIN 없이도 효율적으로 데이터를 다루기 위해 데이터 모델링 방식에 대해 깊이 고민하는 것이 얼마나 중요한지 깨달았습니다.
여러분은 어떠신가요? MongoDB나 MySQL을 사용하면서 겪었던 어려움이나 배운 점이 있다면 댓글로 공유해 주세요! 여러분의 경험을 통해 서로 배울 수 있기를 기대합니다.