[아키텍쳐] 헥사고날 아키텍쳐

GisangLee·2023년 11월 22일
0

아키텍쳐

목록 보기
1/1

1. 헥사고날 아키텍쳐란?

소프트웨어 설계에 사용되는 아키텍처 패턴 중 하나로
느슨하게 결합된 애플리케이션 구성요소를 만드는 것을 목표로 하는 아키


2. 구성요소

a. 내부 영역

  • 순수한 비즈니스 로직을 표현
  • 캡슐화된 영역
  • 기능적 요구사항에 따라 먼저 설계

b. 외부 영역

  • 내부 영역에서 기술을 분리하여 구성한 영역
  • 내부 영역 설계 이후 설계

c. 포트

  • 내부 비즈니스 영역을 외부 영역에 노출한 API
  • 인바운드(Inbound) / 아웃바운드(Outbound) 포트로 구분

[인바운드 포트]

  • 내부 영역 사용을 위해 노출된 API

[아웃바운드 포트]

  • 내부 영역이 외부 영역을 사용하기 위한 API

d. 어댑터

  • 외부와 포트 간 통신을 조정
  • 인바운드(Inbound) / 아웃바운드(Outbound) 어댑터로 구분

[인바운드 어댑터]

  • 외부 애플리케이션/서비스와 내부 비즈니스 영역(인바운드 포트) 간 데이터 교환

[아웃바운드 어댑터]

  • 내부 비즈니스 영역(아웃바운드 포트)과 외부 애플리케이션/서비스 간 데이터 교환

3. Django를 헥사고날 아키텍쳐로 구성

a. 프로젝트 구조 예시

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

domain/models.py

class User(objects):
    def __init__(self, email, email):
        self.name = name
        self.email = email

domain/services.py

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)

ports/post_repository.py

from abc import ABC, abstractmethod

class CreateRepository(ABC):

    @abstractmethod
    def save(self, post):
        pass

adapters/database_adapter.py

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,
        )

api.serializers.py

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)

api/views.py

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'])
profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글