소프트웨어 설계에 사용되는 아키텍처 패턴 중 하나로
느슨하게 결합된 애플리케이션 구성요소를 만드는 것을 목표로 하는 아키
project/
|-- app/
| |-- user/
| | |-- adapters/
| | | |-- database_adapter.py
| | | |-- api_adapter.py
| | |-- api/
| | | |-- serializers.py
| | | |-- views.py
| | |-- domain/
| | | |-- models.py
| | | |-- services.py
| | |-- ports/
| | | |-- post_repository.py
| | | |-- post_api.py
| | |-- views.py
|-- manage.py
class User(objects):
def __init__(self, email, email):
self.name = name
self.email = email
from app.user.domain.models import User
class UserService(object):
def __init__(self, repository):
self.repository = repository
def create_user(self, name, email):
post = User(email, email)
self.repository.save(post)
from abc import ABC, abstractmethod
class CreateRepository(ABC):
@abstractmethod
def save(self, post):
pass
from django.db import models
from app.user.ports.post_repository import CreateRepository
class UserModel(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class UserRepository(CreateRepository):
def save(self, user):
UserModel.objects.create(
name=user.name,
email=user.email,
)
from rest_framework import serializers
from app.user.domain.models import User
class UserSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
email = serializers.CahrField(max_length=100)
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from app.user.api.serializers import UserSerializer
from app.user.domain.services import UserService
from app.user.adapters.database_adapter import UserRepository
...
...
class UserViewSet(
mixins.CreateModelMixin,
GenericViewSet,
):
serializer_class = UserSerializer
queryset = User.objects.filter()
permission_classes = [UserPermission]
pagination_class = CursorPagination
filter_class = UserFilter
def get_queryset(self):
# 이 부분은 어댑터를 통해 데이터를 가져오는 예시
# 실제 구현에서는 어댑터를 통해 필요한 데이터를 조회하고 반환
queryset = ......
return queryset
def perform_create(self, serializer):
user_data = serializer.validated_data
service = UserService(UserRepository())
service.create_post(user_data['title'], user_data['content'])