개발 공부/기타 공부

비즈니스 로직 vs. 도메인 로직

baby-t 2025. 9. 14. 10:24

MVC 패턴을 공부하면서 모델(Model)이 비즈니스 로직을 담당한다는 것을 알게 되었습니다. 그런데 '비즈니스 로직'이 정확히 무엇인지 궁금해져서 알아보았고, 그 과정에서 비슷한 용어인 도메인 로직도 함께 찾아보게 되었습니다.

두 용어는 매우 유사하여 종종 혼용되지만, 엄밀히는 다른 관점을 가집니다. 이 둘의 차이를 이해하면 더 견고하고 유지보수가 쉬운 모델을 설계할 수 있습니다.


## 1. 비즈니스 로직 (Business Logic) - '프로세스' 중심

비즈니스 로직은 애플리케이션이 특정 목표를 달성하기 위해 따라야 하는 전체적인 작업 순서나 규칙을 의미합니다. 즉, '무엇을, 어떤 순서로 처리해야 하는가'에 대한 **워크플로우(Workflow) 또는 프로세스(Process)**에 가깝습니다.

예시: 온라인 쇼핑몰의 "주문 처리" 비즈니스 로직 🛒

  1. 사용자의 로그인 상태를 확인한다.
  2. 상품의 재고가 있는지 확인한다.
  3. 사용된 쿠폰의 유효성을 검증하고 할인액을 계산한다.
  4. 최종 결제 금액을 확정한다.
  5. 외부 결제 시스템과의 연동을 요청한다.
  6. 결제가 완료되면 상품의 재고를 감소시킨다.
  7. 주문 내역을 데이터베이스에 기록하고 사용자에게 확인 이메일을 발송한다.

이처럼 여러 도메인 객체(사용자, 상품, 쿠폰 등)를 조율하여 하나의 비즈니스 목표를 완성하는 절차 전체가 비즈니스 로직입니다.


## 2. 도메인 로직 (Domain Logic) - '객체' 중심

도메인 로직은 특정 도메인(비즈니스 영역)의 핵심 개념(객체)에 내재된 규칙과 행동을 의미합니다. 이는 다른 프로세스와 무관하게, 해당 객체 자체가 가져야 할 고유의 논리입니다.

예시: 쇼핑몰의 각 도메인 객체가 가진 고유 로직

  • 주문(Order) 객체의 도메인 로직:
    • "주문의 총액은 각 주문 항목(OrderItem)의 가격과 수량을 곱한 값의 합계이다."
    • "배송이 시작되면 주문을 취소할 수 없다."
  • 상품(Product) 객체의 도메인 로직:
    • "상품의 재고는 0 미만이 될 수 없다."
  • 장바구니(Cart) 객체의 도메인 로직:
    • "장바구니에 담을 수 있는 상품의 최대 개수는 10개이다."

이처럼 도메인 로직은 특정 객체의 상태를 변경하거나 유효성을 검사하는 등, 해당 객체의 책임과 관련된 규칙을 말합니다.


## 3. 그래서, 둘의 차이점은?

두 개념을 요리에 비유하면 쉽게 이해할 수 있습니다. 🍳

도메인 로직은 **'재료의 본질적인 특성'**입니다.<br> (예: "계란은 삶거나 튀길 수 있다", "소금은 짜다", "밀가루와 물을 섞으면 반죽이 된다")

비즈니스 로직은 이 재료들을 가지고 요리를 완성하는 **'레시피'**입니다.<br> (예: "계란을 7분간 삶은 뒤, 반죽을 얇게 펴서 면을 만들고, 끓는 소금물에 면을 익혀 계란과 함께 낸다")

  • 범위: 비즈니스 로직이 더 넓은 개념이며, 도메인 로직을 포함하는 경우가 많습니다.
  • 관점: 도메인 로직은 개별 객체의 상태와 규칙에 집중하는 **'객체 중심'**의 관점이고, 비즈니스 로직은 여러 객체를 조율하여 하나의 서비스를 완성하는 **'프로세스 중심'**의 관점입니다.

"주문을 한다"는 비즈니스 로직을 수행하기 위해, 컨트롤러는 Order 객체의 도메인 로직(총액 계산)과 Product 객체의 도메인 로직(재고 감소)을 호출하여 전체 프로세스를 완성하는 것입니다.

이 두 로직을 잘 분리하면 객체의 재사용성이 높아지고, 시스템의 복잡도를 관리하기 용이해집니다.