PYTHON · 디자인패턴
서비스 계층
서비스 계층으로 비즈니스 로직을 캡슐화하여 컨트롤러와 데이터 접근을 분리합니다.
디자인패턴고급service layer서비스비즈니스 로직계층
핵심 설명
서비스 계층으로 비즈니스 로직을 캡슐화하여 컨트롤러와 데이터 접근을 분리합니다.
Python code
from dataclasses import dataclass
@dataclass
class Order:
id: int
user_id: int
items: list[str]
total: float
status: str = "pending"
class OrderRepository:
def __init__(self):
self._orders: dict[int, Order] = {}
self._next_id = 1
def save(self, order: Order) -> Order:
if order.id == 0:
order.id = self._next_id
self._next_id += 1
self._orders[order.id] = order
return order
def find_by_user(self, user_id: int) -> list[Order]:
return [o for o in self._orders.values() if o.user_id == user_id]
class OrderService:
"""비즈니스 로직을 캡슐화"""
def __init__(self, repo: OrderRepository):
self._repo = repo
def place_order(self, user_id: int, items: list[str]) -> Order:
if not items:
raise ValueError("주문 항목이 비어있습니다")
total = len(items) * 10000 # 간단한 가격 계산
order = self._repo.save(
Order(0, user_id, items, total)
)
print(f"주문 생성: #{order.id} (총 {order.total:,.0f}원)")
return order
def get_user_orders(self, user_id: int) -> list[Order]:
return self._repo.find_by_user(user_id)
# 사용
repo = OrderRepository()
service = OrderService(repo)
service.place_order(1, ["노트북", "마우스"])
service.place_order(1, ["키보드"])
orders = service.get_user_orders(1)
for o in orders:
print(f" #{o.id}: {o.items} → {o.total:,.0f}원")학습 팁
서비스 계층은 트랜잭션 경계, 권한 검사, 이벤트 발행 등 횡단 관심사를 처리하기 좋은 위치입니다.
주의할 점
서비스가 너무 많은 책임을 지면 "God Service"가 됩니다. 도메인별로 서비스를 분리하세요.
자주 묻는 질문
서비스 계층란 무엇인가요?
서비스 계층으로 비즈니스 로직을 캡슐화하여 컨트롤러와 데이터 접근을 분리합니다.
서비스 계층 학습 시 주의할 점은 무엇인가요?
서비스가 너무 많은 책임을 지면 "God Service"가 됩니다. 도메인별로 서비스를 분리하세요.