CQRS Pattern
CQRS
Command Query Responsibility Segregation
์ํํธ์จ์ด ์ํคํ ์ฒ ํจํด ์ค ํ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธ์์ฉ์ ๋ํ ํจํด
๋ช ๋ น๊ณผ์กฐํ์ ์ฑ ์์ ๋ถ๋ฆฌํ๋ ์์น์ ๊ธฐ๋ฐ์ฝ๊ธฐ(Query)์ ์ฐ๊ธฐ(Command) ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ชฉํ
๊ธฐ์กด ์์คํ
๋ฌธ์ ์
์กฐํ์ ๋ช ๋ น์ ํ๋์ ๋ชจ๋ธ์์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ๊ฒฝํฉ ๋ฐ์
๋ณต์ก๋ ์ฆ๊ฐ

CQRS ์ด์
๋ฐ์ดํฐ์ ๋ณ๊ฒฝ(๋ช ๋ น)๊ณผ ์กฐํ(์ฟผ๋ฆฌ)๋ฅผ ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๋ถ๋ฆฌ ๋ฐ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ๋ณ๊ฒฝ๊ณผ ์กฐํ ๊ฐ์ ์์กด์ฑ ๊ฐ์
์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์
๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ ๋๊ท๋ชจ ์์คํ ์์ ์ ์ฉ
๋จ์ํ ์์คํ ์์๋ ์ค๋ฒ์์ง๋์ด๋ง
CQRS์ ๊ตฌ์ฑ ์์
๋ช
๋ น(Command)
์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ ์๋ฏธ
๋ช ๋ น ๋ชจ๋ธ์ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ์ํ ๋ณ๊ฒฝ์ ํต์งํ๋ค.
์ฟผ๋ฆฌ(Query)
์์คํ ์ ์ํ๋ฅผ ์กฐํํ๋ ์์ ์ ์๋ฏธ
์ฟผ๋ฆฌ ๋ชจ๋ธ์ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐํ
์ด๋ฒคํธ(Event)
์์คํ ์์ ๋ฐ์ํ๋ ์ค์ํ ์ฌ๊ฑด์ด๋ ์ํ ๋ณ๊ฒฝ์ ๋ํ๋
๋ช ๋ น ๋ชจ๋ธ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฒคํธ๋ก ๊ธฐ๋ก
๋ช
๋ น ํธ๋ค๋ฌ(Command Handler)
๋ช ๋ น์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋ด๋นํ๋ ๊ตฌ์ฑ ์์
๋ช ๋ น์ ๋ฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํด
์ด๋ฒคํธ ํธ๋ค๋ฌ(Event Handler)
๋ฐ์ํ ์ด๋ฒคํธ์ ๋ํ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๊ตฌ์ฑ ์์
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ด๋ฒคํธ๋ฅผ ์์ ํ์ฌ ์ฟผ๋ฆฌ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธ
๋ช
๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉ, ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๊ตฌ๋ถ

๋์ ๊ฒฉ๋ฆฌ ์์ค์ ์ํด ์ฐ๊ธฐ, ์ฝ๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถ

Code
// ์ปค๋งจ๋ ๋ชจ๋ธ
class Command {
private String data;
public Command(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
// ์ฟผ๋ฆฌ ๋ชจ๋ธ
class Query {
// ์กฐํ์ ํ์ํ ํ๋ ๋ฐ ๋ฉ์๋๋ค...
}
// ๋ช
๋ น ํธ๋ค๋ฌ
class CommandHandler {
public void handleCommand(Command command) {
//๋ช
๋ น์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ก์ง
}
}
// ์กฐํ ํธ๋ค๋ฌ
class QueryHandler {
public Query handleQuery() {
// ์กฐํ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ก์ง
return new Query()
}
}
// CQRS ์๋น์ค
class CqrsService {
private CommandHandler commandHandler;
private QueryHandler queryHandler;
public CqrsService(CommandHandler commandHandler, QueryHandler queryHandler) {
this.commandHandler = commandHandler;
this.queryHandler = queryHandler;
}
public void sendCommand(Command command) {
commandHandler.handleCommand(command);
}
public Query sendQuery() {
return queryHandler.handleQuery();
}
}
// ํด๋ผ์ด์ธํธ ์ฝ๋
public class CqrsExample {
public static void main(String[] args) {
CommandHandler commandHandler = new CommandHandler();
QueryHandler queryHandler = new QueryHandler();
CqrsService cqrsService = new CqrsService(commandHandler, queryHandler);
//๋ช
๋ น ๋ณด๋ด๊ธฐ
Command command = new Command("Update data");
cqrsService.sendCommand(command);
//์กฐํ ๋ณด๋ด๊ธฐ
Query query = cqrsService.sendQuery();
// ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง...
}
}Last updated