도메인 주도 설계(Domain-driven Design): 설계 단계에서 비즈니스 도메인을 분석하여 도출된 도메인 모델의 디자인에 중점을 두어 소프트웨어를 개발하는 방식이다. 설계 산출물과 최종 개발 산출물(소스코드)의 차이를 없앰으로써 유지보수가 용이하고 향후 확장성을 얻어내는 설계 방법이다.
MSA(Micro Service Architecture): 하나의 거대한 시스템(Monolithic)을 작은 단위의 서비스로 잘게 나누어 설계하는 방식 (잘게 나누었을 때의 이점과 고통은 다른 글에서 더 설명하도록 한다.)
들어가며
나는 부끄럽게도 ‘내가 개발한 소프트웨어가 잘 동작할까?’에 대한 고민을 몇 년째 하고 있었다. 나의 주 업무는 개발자들의 생산성을 향상하는 모듈 개발이나, 인터페이스 규격화 작업등이었다. 이러한 프로젝트들은 테스트 코드나 사용자 테스트, 연동 테스트 등을 진행하고 나면 잘 동작했기 때문에(테스트의 막바지쯤 되면..) 운영하면서 발생하는 부하에 대한 문제점이나 성능 이슈는 잘 발견되지 않았다. 하지만 우리가 설립한 작은 스타트업의 백엔드 파트를 책임지게 되면서, 서비스의 운영이나 장애에 대한 대처방법이나 대비책을 알지 못하는 것이 부담되기 시작했다. 그래서 이를 해결할 방법에 대해 자연스레 관심을 가지게 되었다.
나의 MSA 입문 과정
퍼블릭 클라우드가 안정화되고 활성화되던 2018년도쯤 이미 업계의 프로젝트들은 레거시 시스템을 점진적으로 MSA로 전환하고 있었다.(스트랭글러 패턴 참고) 넷플릭스의 사례나 여러 블로그들을 통해서 MSA의 장점과 단점들에 대해서 접했지만 실제로 적용할 수 있는 환경 여건은 되지 않았다. 그러다 2021년 이희창 선생님의 MSA강좌를 접하게 되고 토대로 본격적인 입문이 시작되었다. (슬프게도 이때쯤에는 우리가 설립한 회사를 종료하기로 결정했기 때문에 공부할 수 있는 시간이 많았다. 그리고 이희창 선생님의 강의는 다른 MSA 강의보다 분량이 적었기 때문에 다른 강의에 비해 학습량에 대한 부담감이 적었다.)
강의는 29cm(쇼핑몰 도메인)에서 사용되었던 스프링부트 기반 MSA 구현체를 개념과 함께 풀어주는 형태로 진행되었다. MSA를 구현하기 위해 사용되는 도메인 주도 설계의 개념과 구현을 위해서 여러 가지 JAVA 및 객체지향의 개념이 필요했기 때문에, 지금까지 NodeJS 기반으로 백엔드를 개발해왔던 입장에서 이해하기가 쉽지 않았다. (도메인 주도 설계의 도메인 모델을 설계하고 구현체로 필요하기 위해서는 객체의 개념 및 다양한 JAVA의 성질을 이해해야 했다. 하지만 이 시절의 나는 비즈니스 도메인을 쿼리 형태로 풀어내는 식의 개발을 하고 있었다.) 다행히 핵심 개념들과 예제를 참고할 수 있는 곳들이 많아서 한 달 안에 프로젝트를 끝낸 것 같지만.. 아직 개선해야 할 부분이 엄청 많다고 생각한다. (feat. @Todo) 또한 현재 회사에 예전부터 JAVA 기반 프로젝트를 진행하시던 엔지니어분들이 소중한 시간을 내어 주셔서, 첫 번째 프로토타입 프로젝트를 제한된 시간 안에 마칠 수 있었다.
마치며
설 연휴가 되어 첫 번째 MSA 프로젝트를 되돌아보고, 아직 완전히 내것으로 만들지 못한 지식을 정리하는 의미있는 시간을 가질 수 있게 되었다. 지금 시점에서 좀 더 앞으로 나아가기보다는, 지금까지의 경험을 완전하게 나의 것으로 만들고, MSA를 관심 갖고 도전하는 다른 엔지니어들에게 도움이 되고자 지식을 기술 블로그에 정리하려고 한다. 또한 회사 외부의 컨퍼런스나 인터뷰들을 통해서 얻게 된 소중한 지식도 함께 공유해서 나와 비슷한 궁금증을 가진 사람들에게 도움이 되었으면 한다.
'MSA 설계 & 도메인주도 설계' 카테고리의 다른 글
[DDD] 도메인 계층의 Structure (0) | 2022.02.08 |
---|---|
[DDD] 인터페이스 계층과 응용 계층의 구현 (0) | 2022.02.07 |
[DDD] 애그리거트란? (0) | 2022.02.06 |
[DDD] 도메인 주도 설계의 계층 분리에 관하여 (0) | 2022.02.03 |
[MSA] 레이어드 아키텍처 vs 헥사고날 아키텍처 vs 클린 아키텍처 요약 (2) | 2022.01.17 |