반갑다. Monolithic.
이직한지 이제 1개월이 되어간다. 모놀리식.. 요즘 씨름 중인 녀석이다. 새로운 환경에서 새로운 프로젝트를 진행하면서 6년만에 이 아키텍처를 다시 마주하게 되었다. 처음 마주했을때와 1개월이 지난 현재, 시간이 지나면서 고민이 점점 더 깊어져만 간다.
Back-End와 Front-End의 모호성
요즘의 대부분의 서비스 개발은 백엔드와 프론트엔드가 완전히 분리되어 작업이 명확히 격리되어있다. 따라서 이 둘은 병렬로 작업이 가능하기 때문에 모놀리식 아키텍처에서 자주 일어나는 불필요한 병목이 발생하지 않는다. 하지만 지금의 프로젝트는 한 통의 소스에 구분없이 관리되고 한번에 배포가 되는 구조이다. 이것은 과거 MVC 패턴을 끝으로 사라진 형태라고 볼 수 있다. 물론 혼자서 백엔드, 프론트엔드 다 할 수 있다면 이것만큼 편한 것은 없다. 하지만 구조상 동일한 코드의 재생산과 규모가 커지는 순간 유지보수에서 큰 리스크를 짊어질 수 밖에 없다. 핵심 로직이 중앙으로 모이지 않고 View나 Controller 레이어에 기준 없이 작성되는 경우를 자주 봐왔다. 이런 경우 같은 로직의 코드를 여기저기 계속 찍어내야하는 불상사가 일어나고 규모가 커지면 커질 수록 어디를 고쳐야할지 갈피를 잡지 못하기 시작한다. 그래서 서비스 레이어가 탄생했다. 백엔드 단에서는 서비스 레이어부터 분리를 시작해야한다는 생각이 제일 먼저 떠올랐다.
기능을 잘게 나누기
지금의 프로젝트 코드를 보면 하나의 화면 Function에서 너무 많은 역할을 하고 있었다. 다른 화면을 보면 비슷한 기능을 동일하게 하는 코드가 똑같이 붙어있다. 이것은 위에서 설명한 문제와 같다. 나는 이 프로젝트의 기능을 하나 하나 잘게 쪼개 API 기능 단위로 재구성하기로 했다. 결국 이 프로젝트는 단기성이 아니고 우리가 계속 운영하고 고도화할 메인 비즈니스 서비스이다. 따라서 시스템 확장의 유연성이 필요하고 결합성을 최소화 시켜야 한다. 그리고 이 것은 기능 단위로 명세가 가능해진다는 뜻이고 개발자가 현업에 설명하기도 수월해지며 개발자가 아니더라도 기능에 대한 이해를 할 수 있는 수준으로 로직 이해에 대한 비용이 크게 감소한다.
데이터의 관계가 강하게 결합되어있음.
이 프로젝트에서는 ORM을 사용하고 있다. ORM은 장단점이 명확하고 단순한 쿼리에서는 손쉽게 ORM으로 구현해낼 수 있다. 하지만 데이터 관계가 복잡해지거나 쿼리 자체가 커질 경우는 ORM 사용에 오히려 주의할 점이 늘어난다. 그 중 가장 단골손님으로 얘기되는 것은 N+1 문제가 되겠다. 아직까지 비즈니스 로직이 복잡한 것은 아님에 불구하고 테이블 관계 구조가 복잡하게 설계되어있다. 유저가 어떤 책(Book)을 읽었는지를 알기 위해서는 유저의 책 열람 내역을 저장하고 있는 중간 테이블을 참조하면 될 것이라 생각했으나 이 프로젝트에서는 그렇지 않았다. 그 중간 과정에 외래키 참조 테이블이 몇 단계가 더 있었고 결정적으로 책 열람 내역 테이블에는 유저 ID가 존재하지 않았고 외래키 참조 테이블의 PK ID가 존재했다. 때문에 구조적인 문제로 여러 테이블을 참조해야하는 일이 발생하고 있었다.
머리가 아파왔다. 단순한 문제를 어렵게 구현한 느낌을 지울 수가 없다. 요구조건이 그때 그때 추가되면서 붙여나간 모양새다. 데이터를 바로 건드릴 수 없으니 현재 상태에서 구현을 해둔 뒤 시장에 내놓는게 우선이라고 생각한다. 그리고 곧바로 문제점들에 대해서 볼륨이 큰 것부터 뜯어고쳐가기로 생각하고 있다. 우선 순위를 볼륨이 큰 것부터 둔 것은 시간이 지날 수록 덩치 큰 과제들은 해결 난이도가 점점 올라가기 때문이다.
마무리
글로 적지 못하는 해결해야하는 과제들이 많다. 현재의 서비스는 초기인 만큼 구현에 초점을 두어 개발이 된 것으로 보인다. 앞으로 서비스의 모습은 구현에 목표도 중요하겠지만 그 간 이 곳에서는 경험하지 못했던 이슈에 대해서 미리 대비를 할 필요가 있다. 이 것을 내부 조직에 이해를 도모하고 실행에 옮기는 것이 나의 가장 큰 역할로 생각한다. 요즘은 이런 생각에 가득 차 있어서 코딩하는 중에도 좌뇌, 우뇌가 따로 노는 느낌이다. 그래서 재미있다. 재미있으니까 크리스마스에 이렇게 글 쓰고 앉아있는 것 아닐까. 재미를 느낀다는 것은 나 자신이 몰입하고 있다는 방증이 아닐까 싶다. 모놀리식을 시작으로 글이 삼천포로 빠졌는데 결국 목표는 이 모놀리식을 잘게 분해하고 마이크로 서비스로 나눈 뒤 프론트엔드의 영역을 떼내는 것이다. 그리고 열정있는 새로운 친구들과 함께 과제를 해결해나가는 것. 2024년도 달려보자.