
CQRS (Command Query Responsibility Segregation) adalah architecture pattern yang memisahkan operasi mengubah data dan membaca data menjadi dua jalur yang berbeda.
- Command → operasi yang mengubah state/data (Create, Update, Delete).
- Query → operasi yang hanya membaca data.
Tanpa CQRS
Biasanya satu service/repository menangani semuanya:
public class UserService
{
public User GetById(int id) { ... }
public void Create(User user) { ... }
public void Update(User user) { ... }
public void Delete(int id) { ... }
}Dengan CQRS
Command dan Query dipisahkan:
// Command
public record CreateUserCommand(
string Name,
string Email
);
// Query
public record GetUserByIdQuery(
int Id
);Handler masing-masing:
public class CreateUserCommandHandler
{
public async Task Handle(CreateUserCommand command)
{
// insert ke database
}
}
public class GetUserByIdQueryHandler
{
public async Task<UserDto> Handle(GetUserByIdQuery query)
{
// baca data
}
}Contoh di ASP.NET Core + MediatR
Command:
public record CreateUserCommand(
string Name,
string Email
) : IRequest<int>;Handler:
public class CreateUserCommandHandler
: IRequestHandler<CreateUserCommand, int>
{
public async Task<int> Handle(
CreateUserCommand request,
CancellationToken cancellationToken)
{
// save user
return user.Id;
}
}Query:
public record GetUserQuery(int Id)
: IRequest<UserDto>;Handler:
public class GetUserQueryHandler
: IRequestHandler<GetUserQuery, UserDto>
{
public async Task<UserDto> Handle(
GetUserQuery request,
CancellationToken cancellationToken)
{
// read user
}
}Controller:
[HttpGet("{id}")]
public async Task<UserDto> Get(int id)
{
return await _mediator.Send(
new GetUserQuery(id));
}
[HttpPost]
public async Task<int> Create(
CreateUserCommand command)
{
return await _mediator.Send(command);
}Kelebihan
- Kode lebih terstruktur.
- Logic baca dan tulis tidak tercampur.
- Query bisa dioptimalkan khusus untuk read.
- Cocok untuk aplikasi yang kompleks.
- Mudah menambahkan pipeline seperti logging, validation, authorization.
Kekurangan
- Menambah jumlah file dan kompleksitas.
- Overkill untuk aplikasi CRUD sederhana.
- Membutuhkan disiplin dalam pemisahan command dan query.
Kapan menggunakan CQRS?
Gunakan jika:
- Aplikasi mulai besar.
- Business logic kompleks.
- Banyak query yang berbeda-beda untuk kebutuhan UI.
- Tim cukup besar sehingga pemisahan tanggung jawab membantu.
Hindari jika:
- Hanya aplikasi CRUD sederhana.
- Proyek kecil dengan sedikit business logic.