문득든 생각, 이런 아키텍처는 어떨까?
요즘 들어 아키텍처에 대한 고민이 많아지고 있습니다. 👀
사실 저는 아직 대규모 서비스를 만들어본 적은 없고,
항상 소규모 프로젝트를 다루다 보니 이게 대규모 서비스가 된다면 어떻게 구조를 짜야될까?
이런 상상을 자주 하게 되더라고요.
🌀 헥사고날 아키텍처를 접하고 나서
며칠 전에 우연히 헥사고날 아키텍처를 알게 됐는데,
처음 봤을 땐 그냥 API에서 DB까지를 잘 나눈 백엔드 구조라고만 생각했습니다.
근데 조금씩 보다 보니까,
“API에 종속되지 않고, 내부에서 도메인 로직을 자율적으로 설계할 수 있다”는 게 되게 인상 깊었어요.
이걸 보면서 다시 자연스럽게 MSA 생각으로 이어지더라고요.
🤔 MSA는 왜 필요한 걸까?
가끔 네이버 같은 서비스를 떠올려보면
“이런 덩치의 시스템이면 당연히 MSA로 가야겠구나”라는 생각이 들어요.
근데 또 그다음 생각은 항상 이거예요.
왜 MSA로 갈까?
모놀리식으로 하면 장애가 퍼지니까?
인증은 그래서 세션에서 토큰 방식(JWT)으로 넘어간 걸까?
그러다 보니 어느새
샤딩, 파티셔닝, 도커, 쿠버네티스까지
이 모든 기술들이 다 이어져 있는 느낌이 들더라고요.
🔍 근데 도메인이 DB까지 들고 있어야 할까?
MSA는 도메인 중심으로 서비스가 나뉘고, 각 서비스는 각자의 DB를 갖습니다.
이 구조는 장애 격리, 도메인 자율성, 기술 선택의 자유 같은 장점이 있죠.
하지만 저는 문득 “왜 도메인 서버가 DB까지 직접 관리해야 할까?” 라는 생각이 들었습니다.
모든 도메인이 자신만의 DB를 갖는다는 건,
곧 각 도메인이 데이터 책임까지 져야 한다는 것이니까요.
💭 도메인은 로직만 담당하면 안 될까?
도메인 서버가 로직만 처리하고,
데이터는 별도의 DB 서버에 요청해서 받는 구조를 상상해봤어요.
각 도메인 서버는 "이런 데이터가 필요합니다 !!!" 라고 요청만 하고,
DB 서버는 그걸 받아서, 내부적으로 어떤 DB든 알아서 처리해서
그 결과만 전달해주는 방식이요 ㅎㅎ
🛠 DS2라는 이름은 어떨까?
이 구조에 딱 맞는 이름이 뭐가 있을까 고민하다가
문득 Domain Server to DB Server, 줄여서 DS2라는 이름을 붙여봤어요 ㅎㅎ
뭔가 구조 흐름도 잘 보이고,
이름도 심플해서 나름 마음에 들더라고요.
너무 거창하게 뭔가를 정의한다기보다
“이런 이름은 어때?” 하는 상상선에서 붙여봤습니다..😄
📦 다양한 DB 기술, 함께 쓰면 안 될까?
예전 프로젝트 하면서 이런 생각을 자주 했거든요...
"이 기능은 MongoDB였으면 진짜 편했을 텐데..."
"아 이건 JPA가 아니라 MyBatis였으면 쿼리가 더 유연했겠다"
"이 정도 트래픽이면 Redis로 캐싱했어야 하는데..."
이렇게 세상에는 좋은 DB 기술들이 많은데
현실은 도메인마다 DB를 하나 정해서 끝까지 가야 하는 느낌이 좀 아쉬웠습니다
그래서 DS2 구조에서는 DB 서버가 다양한 기술을 쓸 수 있도록 하면 어떨까 싶었어요.
MySQL, MongoDB, Redis, Kafka… 뭐든 상관없이
요청만 오면 그에 맞게 데이터를 주는 역할만 하면 되니까요.
✏ 이런 방식도 가능하지 않을까?
제가 생각한 구조는,
DB 서버에서는 도메인 서버에서 요청한 자료를 주는 것에만 초점을 맞추고,
어떠한 DB를 사용하더라도 그 데이터를 주기만 하면 된다는 접근입니다.
예를 들어
대규모 쿼리가 필요하다면 MyBatis나 배치 돌리면 되고,
빠른 CRUD는 JPA 쓰면 되고,
캐싱 필요하면 Redis 쓰면 되고,
메시징이 필요하면 Kafka 연동하면 되고…
결국 DB 서버 개발자들은 도메인 서버에서 “이 데이터 필요해요!” 라고 요청 오면
그에 맞는 데이터만 주면 되는 구조가 되겠죠.
도메인 서버 입장에서도 뭔가 정해진 스키마나 DB 설계 없이
그냥 “이 데이터 필요해요”만 하면 되니까
정말 독립적이고, 유연하고, 역할도 분업이 잘 되는 아키텍처가 나올 수 있지 않을까 싶더라구요 ㅎ
🖼 간단히 구조를 그려보면?
[ Domain Server A ] [ Domain Server B ] [ Domain Server C ]
| | |
+---------+-------------+--------------+----------+
| |
[ DS2: DB Server ]
|
+-------------+-------------+-------------+-------------+
| | | | |
[ JPA(MySQL) ] [ MongoDB ] [ Redis ] [ Kafka ] [ Whatever DB ]
상상을 해보며 언젠가 실험해볼 수 있는 날이 오면 꼭 한 번 구현해보고 싶고,
혹시 이 생각을 본 누군가가 비슷한 고민을 하고 있다면 같이 얘기해보고 싶기도 합니다 ㅎㅎ
이상 !!!! DS2 아키텍처에 대한 저의 상상이었습니다! 😊 ㅎㅎ