패턴화된 아키텍처: 레이어드, MVC ..
project/
main.py
entry_point/
cli.py
use_cases/
train.py
predict.py
model/
image_classifier.py
기본적인 정보를 알 수 있다.
하위 레이어 방향으로만 의존성이 흘러야한다.
도메인 + 인프라스트럭처 = 데이터 접근 레이어로 3레이어 설계 가능
src/
presentation_layer/
product_controller.py
user_controller.py
application_layer/
product_service.py
user_service.py
domain_layer/
product.py
user.py
infrastructure_layer/
repositories/
product_repository.py
user_repository.py
database.py
orm.py
REST API 형태로 클라이언트의 입력을 받아, 이를 애플리케이션 서비스가 활용할 수 있는 형태로 바꾸어 전달. 애플리케이션 서비스가 결과를 내놓으면, 이를 REST API에서 약속한 형태로 변환하여 클라이언트에게 HTTP통신으로 반환
# src/presentation_layer/product_controller.py
from fastapi import FastAPI
from src.presentation_layer.web import app
from src.application_layer import product_service
@app.post("/products", status_code=200)
def register_products(json_req) -> None:
product = product_service.create_product(
name=json_req.name,
price=json_req.price
)
response = {
"product": product
}
return response
프레젠테이션 레이어에서 넘겨받은 입력을 비즈니스 로직에 맞게 처리(서비스)
필요에 따라 도메인 모델을 만들고, 저장소에 저장하는 등 여러 세부적인 로직을 오케스트레이션. 이후 다시 프레젠테이션 레이어에 처리 결과를 넘겨줌
from src.domain_layer.product import Product
from infrastructure_layer.repositories.product_repository import ProductRepository
def create_product(name: str, price: str) -> bool:
try:
product = Product(name, price)
with db.Session() as session:
product_repository = ProductRepository(session)
product_repository.save(product)
session.commit()
return product
except:
raise Exception("Product Not Created")
도메인 레이어는 도메인의 내용들을 표현
#src/domain_layer/product.py
from sqlalchemy import Column, String, Integer
from src.infrastructure_layer.database import Base
class Product(Base):
__tablename__ = 'product'
id = Column(Integer, primary_key=True)
name = Column(String)
price = Column(Integer)
소프트웨어가 최종적으로 인프라스트럭처(ex. DB)에 의존성을 갖도록 한다는 점.
소프트웨어에서 중요한 부분은 비즈니스 로직을 처리하는 애플리케이션 및 도메인 레이어이다.
도메인 레이어가 DB를 의존한다면 변경에 쉽게 영향받는다.
DB 중심 설계가 되며, 애플리케이션 설계에 앞서 DB를 먼저 선택하고, 데이터 모델링부터 하게 된다.
객체지향에서 추구하는 '액션' 우선이 아닌 '상태' 중심 설계를 하게 된다.