[단잠] MSA로 마이그레이션 하다 - 1
📜서론
단잠은 현재 모놀리식으로 구현되어있습니다. 여러가지 문제로 인해 이를 MSA 아키텍처로 변환하는 과정을 기록하기 위해 해당 글을 작성하였습니다.
🚨문제점
단잠은 기존에 모놀리식 아키텍처로 구현되어 있습니다. 전체적인 도메인은 크게 나누면 다음과 같습니다.
세세하게 보면 그안에서도 다양한 도메인들이 존재하고 있습니다. 전체 테이블만 23개의 테이블이 존재합니다.
- user
- mate : room, food, workout, study, walk
- chat
- chatRoom
- notice
- admin
- schedule
- security
1. 이게 무슨 x같은 코드야
단잠의 초창기 코드베이스는 명확한 코드 컨벤션이 존재하지 않은 상태로 시작되었습니다.
당시 코드 작성에 대한 합의는 '카멜케이스를 사용하자' 정도였고, 이를 제외한 규칙은 개발 과정에서 필요에 따라 구두로 합의하는 방식이었습니다. 하지만 시간이 흐르며 여러 가지 문제가 발생하기 시작했습니다.
1) 초반의 느슨한 규칙
초기에는 코드 작성 시 일관성보다 기능 구현에 더 집중했습니다. 개발팀이 소규모였기 때문에 코드 작성 시 대화로 합의하거나, 다른 개발자가 개발한 코드를 보고 맞추면서 코드를 작성했습니다. 이러한 상황에서 명확한 규칙이나 문서화가 없었기 때문에 코드는 점점 일관성을 잃기 시작했습니다.
2) 개발자 추가로 인한 코드 스타일 충돌
단잠의 서비스가 점차 커지면서 새로운 개발자들이 팀에 합류되었습니다.
문제는 명확하게 문서화된 코드 컨벤션이 존재하지 않았기 때문에 각 개발자는 기존의 코드를 보고 자기 스타일대로 판단하여 개발을 진행하게 되었습니다.
3) 구두로 정한 규칙은 보이지 않는다
팀 내에서는 간혹 대화나 코드 리뷰를 통해 규칙을 정했지만, 이러한 규칙들이 문서화되지 않았습니다.
팀원들이 시간이 지나면서 합의한 규칙을 잊기 시작했고, 결국 각자 기억하는 규칙이 달라져 코드의 일관성은 더욱 무너지게 되었습니다.
4) 결국, 스파게티 코드 탄생
이 모든 문제가 누적되면서 코드베이스 전체에 영향을 미쳤습니다. 중구난방의 코드 스타일은 코드를 읽기 어렵게 만들었고, 기능이 추가될수록 급격히 꼬이기 시작했습니다. 코드 간 의존성과 복잡도가 높아지면서 매번 코드를 서버에 올릴때 기도하기 시작했습니다.
2. 서버2개로 뭐하고 있어?
단잠은 현재 2개의 자체 서버를 사용하고 있지만, 구조적으로 비효율적이고 취약한 운영 방식을 가지고 있습니다. 마치 모든 재료를 한 냄비에 다 때려 넣은 요리처럼 서버 역할이 명확히 분리되지 않고 섞여 있어 여러 문제가 발생하고 있습니다.
왜 이 상황이 문제인가?
1. 비효율적인 요청 처리
현재 Gateway와 네트워크 대역대 처리를 따로 나누지 않고 Nginx만 사용하고 있습니다. 이는 도시의 모든 교통을 하나의 신호등이 통제하는 것과 같습니다.
차량(요청)이 늘어나면 병목 현상이 발생하고, 교통 흐름(네트워크 대역폭)이 최적화되지 않아 지연이 생깁니다.
즉, 2개의 서버를 가지고 있지만 모든 요청이 Nginx를 거쳐 두 서버로 전달되다 보니, 네트워크 처리량이 늘어나면 병목이 발생합니다. 서비스 간 분리가 되지 않아 각 요청을 개별적으로 최적화하는 것이 불가능합니다.
3. 객체지향이라며..
단잠은 객체지향 프로그래밍(OOP)을 기반으로 개발되었지만, 현재의 구조는 객체지향의 장점을 제대로 활용하지 못하고 있습니다.
[수정 하나에 전체가 흔들리는 구조]
하나의 코드를 수정하면 연관된 여러 부분까지 영향을 받는 문제가 발생하고 있습니다. 이는 도메인 간 강한 결합도(Tight Coupling) 때문입니다. 각 도메인과 클래스들이 서로 직접적으로 의존하고 있어 작은 변경에도 여러 곳을 수정해야 하는 상황이 발생합니다.
또한, 비즈니스 로직이나 데이터 흐름이 서로 엉켜 있는 상태입니다. 서비스 간 결합도가 높다 보니 하나의 작업이 다른 도메인으로 이어져 성능 저하가 발생합니다.
객체지향의 목표는 유연하고 확장 가능한 구조를 만드는 것이지만, 현재 구조는 도메인 간 강한 의존성 때문에 객체지향의 이점을 누리지 못하고 있습니다. 이 문제를 해결하려면 도메인 분리와 결합도를 최소화하여 시스템의 유연성과 성능을 개선해야 할 필요가 있습니다. 즉 객체지향의 장점인 재사용, 독립성을 하나도 얻지 못하고 있습니다.
결론적으로, 단잠은 기존의 모놀리식 아키텍처에서 발생한 비효율성과 문제를 해결하고, 더 나은 성능과 확장성을 위해 MSA로의 마이그레이션을 결정했습니다.
이제 본격적으로 다음글 부터 MSA로의 전환을 위한 전략을 살펴보겠습니다