## [[4. MSA 설계 원칙#Find grained (적절한 분리)|적절한 분리]] 관련 ### 1️⃣ 서비스 세분화 원칙 MSA 설계를 위해서는 [[4. MSA 설계 원칙#Find grained (적절한 분리)|마이크로서비스를 적절히 분리]]해야 한다. 분리하는 기준을 임의로 얼마든지 세울 수 있지만, 아래의 네 개의 요소를 고려하면 좋다. >1. **비즈니스 기능** : 하나의 마이크로서비스가 여러 비즈니스 기능을 제공하면 서비스 복잡도가 늘어나므로, 하나의 마이크로서비스에서 하나의 비즈니스 기능을 제공하는 것이 좋다. >2. **성능** : 특정 마이크로서비스의 크기가 커져 성능이 떨어진다면 해당 서비스를 나누는 것을 고려할 수 있다. >3. **메시지 크기** : [[4. MSA 설계 원칙#Lightweight Protocol (가벼운 프로토콜)|가벼운 프로토콜]]의 필요성과 비슷하게 메시지 크기가 너무 크면 직렬화/역직렬화 과정에서 성능 문제가 생길 수 있다. 메시지가 너무 큰 경우 마이크로서비스를 나누는 것을 고려하자. >4. **트랜잭션** : RDB의 최대 장점은 트랜잭션은 데이터의 일관성과 동시성, 무결성을 보장해준다. 따라서 이런 트랜잭션을 기준으로 마이크로서비스를 나누는 것도 좋다. 또한, 보통 트랜잭션을 유지하는 데이터들은 하나의 비즈니스 로직을 처리하는 일종의 세트기 때문에 마이크로서비스 크기를 최소한으로 설정하는데 도움이 된다. ### 2️⃣ 도메인 주도 설계의 바운디드 컨텍스트 [[0. 도메인과 바운디드 컨텍스트#`바운디드 컨텍스트`란|바운디드 컨텍스트]]는 다른 도메인 모델과 독립적인 로직과 모델을 가지기 때문에 마이크로서비스를 나누는 좋은 기준이 될 수 있다. ### 3️⃣ 단일 책임 원칙 객체 지향 설계 원칙 중 단일 책임 원칙 또한 마이크로서비스를 나눌 때 도움이 될 수 있다. 단일 책임 원칙은 "모든 클래스는 하나의 책임을 가지며, 그 클래스의 기능은 이 책임을 기반으로 개발되어야 한다"는 원칙으로 본래 클래스에 적용되는 원칙이다. 그러나 이런 아이디어를 마이크로서비스에도 적용하여 "모든 마이크로서비스는 하나의 책임을 가지며, 그 클래스의 기능은 이 책임을 기반으로 개발되어야 한다"로 바꿀 수 있다. ## [[4. MSA 설계 원칙#Lightweight Protocol (가벼운 프로토콜)|가벼운 프로토콜]] 관련 ### 4️⃣ 가벼운 통신 프로토콜 애플리케이션 내부에서 메서드를 호출하는 Monolithic Architecture와 다르게 MSA에서는 네트워크로 통신한다. 이 과정에서 데이터를 직렬화/역직렬화를 하게 되고, 이 작업은 시스템에 부하를 주게 된다. 따라서 통신 프로토콜은 부하를 줄이기 위해 가벼워야 하며, 특정 기술이나 언어에 의존성이 없어야 한다. 그래서 MSA에서 HTTP 기반의 REST-API를 주로 사용하는 것도 HTTP가 단순하고 범용적인 통신 프로토콜이기 때문이다. ## [[4. MSA 설계 원칙#Loosely coupled (느슨한 결합)|느슨한 결합]] 관련 ### 5️⃣ 이동 가능성 마이크로서비스는 다양한 실행 환경으로 쉽게 이동할 수 있어야 한다. 이를 위해 컨테이너 이미지를 사용하면, 이미지 저장소에서 다양한 목적지로 배포할 수 있다. 이는 자동화된 배포 프로세스를 용이하게 하며, 설정과 배포에만 집중할 수 있게 한다. ### 6️⃣ 독립된 데이터 저장소 마이크로서비스는 각자 독립된 데이터 저장소를 가져야 한다. 하나의 데이터 저장소를 여러 마이크로서비스가 공유할 경우, 하나의 마이크로서비스가 쿼리를 과하게 실행했을 때 다른 마이크로서비스의 처리 속도에 영향을 주기 때문이다. 또한, 특정 마이크로서비스가 사용하는 데이터의 용량이 많아졌을 때, 필요한 부분만 [[IT 용어 정리 📕#`스케일아웃`|스케일아웃]]을 할 수 없다는 문제도 존재한다. ### 7️⃣ 외부 공개 인터페이스 마이크로서비스는 서로 공개된 API를 통해 통신한다. 만약 한 마이크로서비스에서 API나 응답 메시지의 포맷을 변경하게 되면, 기존 API로 통신하던 다른 마이크로서비스에 영향을 미치게 된다. 따라서 인터페이스 설계는 매우 신중해야 하며, 버전 변경과 같은 방법으로 점진적으로 수정해야 한다.