"도메인(Domain)"이란 특정한 업무 영역을 의미합니다.
📌 쉽게 말하면, 우리가 해결하려는 '문제의 범위'를 나타내는 개념입니다.
| 도메인(업무 영역) | 설명 |
|---|---|
| 이커머스(쇼핑몰) | 상품 등록, 장바구니, 결제, 배송 등 |
| 은행 시스템 | 계좌 개설, 송금, 대출, 이자 계산 등 |
| 병원 시스템 | 환자 예약, 진료 기록 관리, 처방전 발행 |
| SNS 플랫폼 | 게시물 작성, 좋아요, 댓글, 친구 추가 |
도메인 규칙(Domain Rules)은 해당 도메인에서 반드시 지켜야 하는 비즈니스 규칙을 의미합니다.
| 도메인(업무 영역) | 도메인 규칙(업무 규칙) |
|---|---|
| 이커머스(쇼핑몰) | ✅ 주문 완료 후에는 취소 불가 |
| 은행 시스템 | ✅ 송금은 계좌 잔액보다 클 수 없음 |
| 병원 시스템 | ✅ 같은 시간에 같은 의사는 중복 예약 불가 |
| SNS 플랫폼 | ✅ 사용자가 본인 게시글만 삭제 가능 |
👉 이러한 도메인 규칙을 비즈니스 로직으로 구현해야 합니다.
위에서 정한 도메인 규칙을 실제 코드(비즈니스 로직)로 구현하면 다음과 같습니다.
class ProductService {
async updateProduct(productId: number, userId: number, productData: Partial<Product>) {
const product = await ProductRepository.findById(productId);
if (!product) {
throw new Error('상품이 존재하지 않습니다.');
}
// 🚀 도메인 규칙: 본인 상품만 수정 가능
if (product.seller_id !== userId) {
throw new Error('본인이 등록한 상품만 수정할 수 있습니다.');
}
return await ProductRepository.updateProduct(productId, productData);
}
}
✔️ "본인이 등록한 상품만 수정 가능"이라는 도메인 규칙을 적용하여, 다른 사람이 상품을 수정하는 것을 방지.
class ProductService {
async createProduct(productData: Product) {
if (productData.product_price < 0) {
throw new Error('상품 가격은 0원 이상이어야 합니다.');
}
return await ProductRepository.createProduct(productData);
}
}
✔️ 상품 가격이 음수인 경우 예외를 발생시키도록 구현.
class ProductService {
async updateTradeStatus(productId: number, status: string) {
const product = await ProductRepository.findById(productId);
if (!product) {
throw new Error('상품이 존재하지 않습니다.');
}
// 🚀 도메인 규칙: 거래가 완료된 후 다시 예약 상태로 변경 불가능
if (product.trade_status === 'completed' && status !== 'completed') {
throw new Error('거래 완료 상태는 변경할 수 없습니다.');
}
return await ProductRepository.updateTradeStatus(productId, status);
}
}
✔️ 거래가 "완료(completed)"된 경우, 다시 "예약 중(reserved)" 상태로 변경하지 못하도록 도메인 규칙 적용.
| 개념 | 설명 | 예제 |
|---|---|---|
| 도메인(Domain) | 중고거래 플랫폼이 다루는 비즈니스 영역 | "상품 등록", "거래 상태 변경", "채팅 기능" |
| 도메인 규칙(Domain Rules) | 반드시 지켜야 하는 업무 규칙 | "본인 상품만 수정 가능", "상품 가격은 0원 이상이어야 함" |
💡 중고거래 플랫폼의 도메인은 "사용자 간 중고 거래"
💡 올바르게 운영하기 위해 도메인 규칙이 필수!