service는 실제 일을 하는 업무 담당자입니다. 일이 어떻게 수행되어야 하는지 결정하고, 규칙, 저장 데이터, 다른 서비스, 외부 API, 부수 효과를 하나의 의미 있는 비즈니스 액션으로 조합합니다.
상품 재고: 재고를 추가, 예약, 차감해도 되는지 확인한 뒤 재고를 업데이트합니다.
결제 흐름: 결제 제공자, 주문 상태, 영수증 기록, 알림을 함께 조율합니다.
예약 규칙: 예약 시간이 겹치지 않도록 막고, 해당 시간대를 확정할 수 있는지 판단합니다.
리포트 생성: 여러 모델의 데이터를 모아 화면에서 보거나 내보낼 수 있는 요약을 준비합니다.
간단한 기준은 이렇습니다. 코드가 비즈니스 질문에 답한다면 service 로직에 두고, 화면을 그리거나 임시 UI 상태만 다룬다면 UI 쪽에 둡니다.
의존성 주입
service는 필요한 도구를 직접 만들지 않고 주입받을 수 있습니다. 이는 한 업무 담당자가 다른 도메인 담당자, 공유 API, signal, 런타임 adaptor에게 도움을 요청하는 방식입니다.
service: admin이 security를 쓰거나 ticket이 notification을 쓰는 것처럼 다른 도메인 service를 주입합니다.
use / env: storage, email, payment, device API 같은 설정값이나 외부 API를 주입합니다.
signal: service 로직이 signal 수준의 동작을 publish하거나 호출해야 할 때 server signal을 주입합니다.
plug: plug는 service나 runtime 객체를 queue, cache, storage, scheduler, websocket 같은 adaptor role에 연결합니다.
adaptor: adaptor는 교체 가능한 런타임 연결자입니다. 같은 service가 solid, redis, local, cloud 기반 구현을 사용할 수 있습니다.
memory: memory는 service가 소유하는 런타임 상태를 로컬 또는 cache adaptor를 통해 보관할 때 사용합니다.