1. Order Microservice
1.1 Entity ๊ตฌ์ฑํ๊ธฐ
- Order (์ฃผ๋ฌธ ์ ๋ณด ํตํฉ ์ ๋ณด)
- Customer (์ฃผ๋ฌธํ ์ฌ๋)
- DeliveryAddress (์ฃผ๋ฌธ ๋ฐฐ์ก ์ฃผ์)
- Payment (์ฃผ๋ฌธ ๊ฒฐ์ ๋ฐฉ๋ฒ)
- Product (์ฃผ๋ฌธ ์ํ)
1.2 SQL vs NoSQL
NoSQL์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ฅ์ ์ ๊ตฌ์กฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ Document๋ก ํ๋ฒ์ ์ ์ฅํ ์ ์๋ค๋ ๊ฒ์ด๋ค. populate๋ฅผ ํตํ join ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ๊ธด ํ์ง๋ง, ๋ณดํต ํ๋์ Document๊ฐ ํต์งธ๋ก ์ ์๋ฏธํ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
SQL์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ค์ํ Join ๊ธฐ๋ฅ๊ณผ ํจ๊ป โํ์ฌ ์ํโ๋ฅผ ์ ํํ ๋ณด์ฌ ์ค ์ ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด โOrder (์ฃผ๋ฌธ)โ ๋ฐ์ดํฐ๋ โ์ต์ ํ์ฌ ์ํโ๋ฅผ ๋ฐ์ํด์ผํ๋ ๋ฐ์ดํฐ์ผ๊น?
- Order ๊ฐ์ฒด์ Customer, DeliveryAddress, Product, Payment๋ ๋งค๋ฒ ์ต์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์๋ผ์ผํ๋๊ฐ?
2. Microservice Transporters
2.1 TCP๋ง๊ณ ๋ค๋ฅธ ์ต์

2.2 Synchronous Networking vs Asynchronous Networking
Broker๋ ๋ฉ์ธ์ง ๋๋ ์ด๋ฒคํธ๋ฅผ ์ค๊ฐํ๋ ์ํํธ์จ์ด๋ฅผ ๋ช
์นญํ๋ค!
Synchronous Networking- ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ด ๋์์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
- ์์ฒญ ์๋ต์ด ๋๋๋ค์ ๋ค์ ์์ ์ ์งํํ๋ค.
- ์๋ต ์๊ฐ์ด ๊ธด ์ฉ์ฒญ์ด ์์ ๊ฒฝ์ฐ ์์คํ ์ ์ฒด์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- ํต์ ํ๋ Microservice๋ผ๋ฆฌ Tight Coupling์ด ๋๋ค.
- ์ ํ ํตํ๋ฅผ ์์ํ๋ฉด ๋๋ค. ์ ํ๋ฅผ ๊ฑธ๋ฉด ์๋๋ฐฉ์ด ์ ํ๋ฅผ ๋ฐ์์ผํ๊ณ ํตํ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ค.
Asynchronous Networking- ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ด ์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌ ํ ์ ์๋ ๋ฐฉ์์ด๋ค.
- ์๋ต ๋๊ธฐ ์๊ฐ ๋์ ๋ค๋ฅธ ์์
์ ์ฒ๋ฆฌ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ ํ ์ ์๋ค.
- (๋๊ท๋ชจ ํธ๋ํฝ์ ์ ํฉ)
- ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๊ณ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
- ๋ฉ์ธ์ง/์ด๋ฒคํธ๊ฐ ํ๋ฒ ์ด์ ์ ๋ฌ๋๋ ์ํฉ์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ด๋ฉ์ผ์ ์๊ฐํ๋ฉด ๋๋ค.
- ์ด๋ฉ์ผ์ ๋ณด๋ด๋๋ฉด ์ธ์ ๊ฐ ์๋๋ฐฉ์ด ์ด๋ฉ์ผ์ ์ฝ์๊ฑธ ์๊ฐํ๊ณ ๋ค๋ฅธ ์์ ์ ํ๊ณ ์์ ์ ์๋ค.
๋ชจ๋ ํต์ ์ Synchronous ๋๋ Asynchronous๋ก ์์ ํ๋๊ฑด ์ ์ ํ์ง ์๋ค. Synchronous์ Asynchronous์ ํน์ฑ์ ์ ์ด๋ ค์ ํต์ ์ ํน์ฑ์ ๋ฐ๋ผ ์ ํฉํ ๊ธฐ์ ์ ์ฌ์ฉํด์ฃผ๋๊ฒ ์ค์ํ๋ค.
2.3 Broker๋?

2.4 Broker ์ข ๋ฅ ๋น๊ต
| Redis | MQTT | NATS | RabbitMQ | |
|---|---|---|---|---|
| ์ฃผ์ ํจํด | Pub/Sub, Streams | Pub/Sub | Pub/Sub, Request/Reply | Pub/Sub, Queue, Request/ Reply |
| Quality of Service (QoS) | ์์ | QoS(0, 1, 2) | ์์ | Acknowledgement (ํ๋ต ๋ฐ๊ธฐ) |
| ํ์ฅ์ฑ | ํด๋ฌ์คํฐ๋ง ํ์ | ์๋ฒ ํ์ฅ ๊ฐ๋ฅ | ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ฌ์คํฐ๋ง ์ง์ | Exchange/Binding ํตํ ํ์ฅ ๊ฐ๋ฅ |
| ๋ด๊ตฌ์ฑ | Streams ์ฌ์ฉ์ ์ ๊ณต | QoS ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ | NATS Streaming ์ฌ์ฉ์ ์ ๊ณต | ๋์ ๋ด๊ตฌ์ฑ |
(1) Redis
ํต์ ๋ฐฉ์: Pub/Sub ํจํด์ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.- ๊ฐ๋จํ ๋ฉ์์ง ํ๋ก์ ๋์ํ ์ ์์ผ๋,
- ๋ฉ์์ง๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ขฐ์ฑ ์๋ ๋ฉ์์ง ์ ์ก์ด ํ์ํ ๋๋ Redis Streams๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฑ๋ฅ: ๋งค์ฐ ๋น ๋ฅด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ด๋ฏ๋ก ์งง์ ์๋ต ์๊ฐ๊ณผ ๋์ ์ฒ๋ฆฌ๋์ ์ ๊ณตํ๋ค์ ๋ขฐ์ฑ: ๊ธฐ๋ณธ Pub/Sub์์๋ ๋ฉ์์ง ์์ค์ด ๋ฐ์ํ ์ ์๋ค.- Redis Streams๋ ๋ฉ์์ง ๋ณด์ฅ์ ์ ๊ณตํ์ง๋ง,
- ์ฌ์ ํ RabbitMQ๋ NATS๋งํผ์ ์๋ฒฝํ ๋ฉ์์ง ๋ด๊ตฌ์ฑ์ ์ ๊ณตํ์ง ์๋๋ค
ํ์ฅ์ฑ: Redis๋ ๋ถ์ฐ ์์คํ ์ผ๋ก ํ์ฅํ ์ ์์ง๋ง,- ์์ฒด์ ์ธ ๋ฉ์์ง ๋ณด์ฅ์ด๋ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด์๋ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํ๋ค.
์ฌ์ฉ ์ฌ๋ก: ์บ์ฑ, ๋น ๋ฅธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ค์๊ฐ ์๋ฆผ ๋ฑ. ๋จ์ํ ๋ฉ์์ง ํจํด์ด ์๊ตฌ๋ ๋ ์ ํฉํ๋ค.
(2) MQTT
ํต์ ๋ฐฉ์: Pub/Sub ํจํด ๊ธฐ๋ฐ์ ๊ฒฝ๋ ๋ฉ์์ง ํ๋ก ํ ์ฝ์ด๋ค.- ์ ์ ๋ ฅ ๋ฐ ๋คํธ์ํฌ ๋์ญํญ์ด ์ ํ๋ ํ๊ฒฝ์์ ํจ์จ์ ์ด๋ค.
์ฑ๋ฅ: ๋ฉ์์ง ํฌ๊ธฐ๊ฐ ์๊ณ ์ ์ก ์๋๊ฐ ๋น ๋ฅด๋ค.- ๋งค์ฐ ํจ์จ์ ์ผ๋ก ๋์ํ๋ฉฐ, ์ ๋น์ฉ ์ฅ์น ๊ฐ์ ํต์ ์ ์ ํฉํ๋ค.
์ ๋ขฐ์ฑ: QoS(์๋น์ค ํ์ง) ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฉ์์ง ์ ๋ฌ์ ๋ณด์ฅํ ์ ์๋ค.- ๋ฉ์์ง๋ฅผ ํ๋ฒ๋ง ์ ๋ฌํ๊ฑฐ๋, ์ต์ ํ ๋ฒ, ๋๋ ์ ์ด๋ ํ ๋ฒ ์ ๋ฌํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ๋ค.
ํ์ฅ์ฑ: ๋ธ๋ก์ปค๋ฅผ ํตํ ํ์ฅ์ด ๊ฐ๋ฅํ์ง๋ง, Redis ๋ NATS์ ๋นํด ๋ณต์กํ ํ์ฅ์ด ํ์ํ ์ ์๋ค.์ฌ์ฉ ์ฌ๋ก: IoT ๋๋ฐ์ด์ค ๊ฐ์ ํต์ , ์ ์ ๋ ฅ ์ฅ์น ๋ฐ ๋คํธ์ํฌ ๋์ญํญ์ด ์ ํ๋ ์ํฉ์ ์ ํฉํ ๋ค
(3) NATS
ํต์ ๋ฐฉ์:์ฃผ๋ก Pub/Sub๊ณผ Request/Reply ํจํด ์ ์ง์ํ๋ฉฐ, ๋ถ์ฐ ์์คํ ์ ์ํ ๊ฒฝ๋ ๋ฉ์์ง ์์คํ ์ด๋ค.์ฑ๋ฅ: ๋ฉ์์ง ์ ์ก ์๋์ ์๋ต ์๊ฐ์ด ๋งค์ฐ ๋น ๋ฅด๋ค. ํนํ ๊ณ ์ฑ๋ฅ ๋ถ์ฐ ์์คํ ์์ ์ฌ์ฉ ํ๊ธฐ์ ์ ํฉํ๋ค.์ ๋ขฐ์ฑ: NATS๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์์ง ์ ๋ฌ์ ์์ด ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ์ง ์์ง๋ง,- NATS Streaming(ํ ์ฌ JetStream)์ ๋ฉ์์ง ๋ด๊ตฌ์ฑ, ํ์ธ ์๋ต (ACK), ๋ฉ์์ง ์ ์ฅ ๋ฑ์ ์ ๊ณตํ๋ค
ํ์ฅ์ฑ: NATS๋ ํด๋ฌ์คํฐ๋ง์ ํตํด ๋งค์ฐ ์ฝ๊ฒ ํ ์ฅํ ์ ์์ผ๋ฉฐ,- ๊ธ๋ก๋ฒ ๋ถ์ฐ ์์คํ ์์ ๋ ๋งค์ฐ ์ ์ฐํ๊ฒ ๋์ํ๋ค.
์ฌ์ฉ ์ฌ๋ก: ๊ฒฝ๋ ๋ฉ์์ง ์์คํ ์ด ํ์ํ ๋, ๋์ ์ฑ ๋ฅ๊ณผ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์๊ตฌํ๋ ๋ถ์ฐ ์์คํ ์ ์ ํฉํ๋ค
(4) RabbitMQ
ํต์ ๋ฐฉ์: AMQP(Advanced Message Queuing Protocol)๋ฅผ ์ฌ์ฉํ๋ฉฐ,- Pub/Sub, Queue, Request/Reply ๋ฑ์ ๋ค์ํ ๋ฉ์์ง ํจํด์ ์ง์ํ๋ค.
์ฑ๋ฅ: ๋ฉ์์ง ์ ๋ฌ ์ง์ฐ ์๊ฐ์ด ์๋์ ์ผ๋ก ๊ธธ ์ ์์ง๋ง, ๋ฉ์์ง ๋ด๊ตฌ์ฑ, ์ ๋ฌ ๋ณด์ฅ ๋ฑ์์ ๊ฐ๋ ฅํ๋ค์ ๋ขฐ์ฑ: ๋ฉ์์ง ๋ด๊ตฌ์ฑ, ๋ฉ์์ง ๋ณด์ฅ(ํ์ธ ์๋ต), ์ฌ์๋ ๋ฉ์ปค๋์ฆ์ ํตํด ๋งค์ฐ ๋์ ์ ๋ขฐ์ฑ ์ ์ ๊ณตํ๋ค.ํ์ฅ์ฑ: ํด๋ฌ์คํฐ๋ง ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ์ ์ง์ํ๋ฉฐ, ํฐ ๊ท๋ชจ์ ์์คํ ์์๋ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๋ค.- ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ ์ผ๋ถ ์ค์ ์กฐ์ ์ด ํ์ํ ์ ์๋ค.
์ฌ์ฉ ์ฌ๋ก: ๊ธ์ต ์๋น์ค, ์ฃผ๋ฌธ ์ฒ๋ฆฌ ์์คํ , ํธ๋์ญ์ ๋ณด์ฅ ๋ฑ ์ ๋ขฐ์ฑ์ด ์ค์ํ ๊ณณ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
2.5 Redis์ ์๋ ๋ฐฉ์

2.6 Rabbitmq์ ์๋ ๋ฐฉ์


3. gRPC
3.1 gRPC๋?
gRPC๋ Google๋ Protocol Buffer๋ฅผ ์ฌ์ฉํ๋ Microservice์์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ ๋์ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ํต์ ํ๋กํ ์ฝ์ด๋ค.
RPC๋ Remote Procedure Call์ ์ฝ์๋ก ๋ด๋ถ ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์๋ฒ์ ํจ์๋ฅผ ์คํ ํ ์ ์๋ค. ์ค์ ์์ฒญ์ ๋คํธ์ํฌ ํต์ ์ผ๋ก ์ ๋ฌ๋์ง๋ง ์คํํ๋ ๋ฐฉ์์ ๋ด๋ถ ํจ์์ฒ๋ผ ์คํ ํ ์ ์๋ค.
gRPC๋ฅผ ์ฌ์ฉํ๋ฉด language agnostic (์ธ์ด์ ๊ด๊ณ์์ด) ์ผ๊ด๋ ์ธ์ด๋ก ํต์ ๊ท์น์ ๊ท์ ํ ์ ์๋ค
gRPC ์ฃผ์ ํฌ์ธํธ
- HTTP/2๋ฅผ ์ฌ์ฉํ๋ค.
- HTTP/2๋ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ์ธ์ฝ๋ฉ ํ๊ธฐ ๋๋ฌธ์ JSON ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ ์ก๋ ์ ์๋ค.
- Unary, Server Streaming, Client Streaming, Bi-Directional Streaming์ด ๊ฐ๋ฅํ๋ค.
3.2 Unary

3.3 Server Streaming

3.4 Client Streaming

3.5 Bi-Directional Streaming

3.6 Protobuf ๋ฌธ๋ฒ
1syntax = "proto3";23package codefactory;45service UserService {6rpc Unary(UserRequest) returns (UserResponse)7rpc ClientSideStreaming(stream UserRequest) returns (UserResponse)8rpc ServerSideStreaming(UserRequest) returns (stream UserResponse)9rpc BiDirectionalStreaming(stream UserRequest) returns (stream UserResponse)10}1112message UserRequest {13string name = 1;14}1516message UserResponse {17string result = 1;18}
3.7 Scalar Type ์ข ๋ฅ
๊ธฐ๋ณธ ํ์- bool โ ๋ถ๋ฆฌ์ธ ํ์
- string โ ์คํธ๋ง ํ์
- bytes โ ๋ฐ์ดํธ ํ์ (raw data, binary data)
- enum โ enum ํ์
Integer Type- int32, int64 โ 32๋นํธ, 64๋นํธ ์ ์ ํ์
- uin32, uint64 โ 32๋นํธ, 64๋นํธ ์์ ์ ์ ํ์
- sint32, sint64 โ 32๋นํธ, 64๋นํธ ์์ ์ ์ ํ์
Modifier- repeated > Array ํ์
Floating Point Type- float โ 32๋นํธ ์์ ํ์ (single precision)
- double โ 64๋นํธ ์์ ํ์ (double precision)
3.8 gRPC to Typescript
1syntax = "proto3";23package greeter45service Greeter {6rpc SayHello (HelloRequest) returns (HelloResponse)7}89message HelloRequest {10string name = 1;11}1213message HelloResponse {14string age = 1;15}
1import { Injectable } from '@nestjs/common'2import { HelloRequest, HelloReply } from './interfaces/greeter.interface'34@Injectable()5export class GreeterService {6@GrpcMethod('Greeter', 'SayHello')7sayHello(data: HelloRequest): HelloResponse {8return { message: `Hello, ${date.age}!` }9}10}
