SW 아키텍처 - 레이어드

jjin·2024년 3월 25일
0

패턴화된 아키텍처: 레이어드, 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를 먼저 선택하고, 데이터 모델링부터 하게 된다.
객체지향에서 추구하는 '액션' 우선이 아닌 '상태' 중심 설계를 하게 된다.

profile
진짜

0개의 댓글

관련 채용 정보