거인과 목숨을 걸고 싸우는 진격의 거인이라는 만화에서 심장을 바치라는 대사가 있다. 그렇다. 심장은 인간의 생명을 나타내는 가장 상징적인 인체기관이다. Microservices Architecture (MSA) 프로젝트에서도 심장과 같은 역할을 하는 Module이 있다. 그것은 바로 Common이다. Common의 동작이 올바르지 않거나 문제가 발생하면 프로젝트 전체에 영향을 미쳐 프로젝트는 생명력을 잃을 것이다. Common을 설계하는 것은 심장을 바치는 일 만큼 중요한 일이다.
- MSA 프로젝트 전반에서 사용할 공통 기능을 구축해주세요.
- sync, blocking I/O를 기반으로 한 spring-web-mvc를 기반으로 service를 개발할 수 있도록 해주세요.
- async, non-blocking I/O를 기반으로 한 spring-webflux 기반으로 service를 개발할 수 있도록 해주세요.
필자에게 주어진 요구사항을 크게 3가지로 정리하면 위와 같다.
'질문의 질이 답의 질을 결정한다.' 올바른 답으로 나아가기 위해 올바른 질문을 해야 한다는 중요한 교훈이 담긴 말이다. 스스로 질문해보자. 무엇을 설계해야 하는가, 각 프로젝트에서 공통으로 무엇을 대응해야 하는가, 공통으로 비지니스 로직을 구현하기 위한 수단(보조 로직)은 어떤 것들이 있는가, spring-web-mvc, spring-webflux의 경계는 어떻게 나눌것인가
- Hexagonal Architecture
- API Result
- mvc module, webflux module 경계
- Tomcat vs Netty
- CPU Bounds
- I/O Bounds
- Spring Web MVC vs Spring WebFlux
- MSA JWT 전달 전략 like Fractal
- Local Thread, Reactor Context
- MSA Resolver
- MSA Filter
- MSA Handle Exception
- MSA 통신 전략
- CommonHttpClient
- CommonWebClient
- Kafka
위에서 한 질문을 기반으로 6가지 기준을 산정해서 설계했다. 'No Silver Bullet'이라는 말이 있듯 개발에 정답은 없다. 이 설계도 정답은 아닐 것이고, 지속적으로 다듬고 발전시켜 나가야 한다.
개발에 정답은 없지만 각 시점에서 자신의 연구하고 정리한 궁극은 있다. 최근에 정말 많은 고민과 생각을 했다. 어떤 날은 코드를 작성하는 시간보다 생각을 하는 시간이 더 많은 날도 있었다. 각 경계를 머릿속으로 그리며 이렇게 내가 코드를 작성하고 설계 했을 때 과연 팀원들이 납득 하면서 사용할지 일관되게 사용할 수 있는지, 이러한 구조로 코드를 작성하는 것은 타당하고 올바른지 생각의 사냥을 멈추지 않았다. 머릿속의 코드가 수십 번 지워지고 다시 작성되었다. 그렇게 나의 궁극이 탄생 되었다. MSA 심장부를 설계하다 시리즈는 어떻게 MSA 프로젝트의 공통부를 설계해야 하는가에 대한 현재 나의 궁극이다.