데이터 접근 계층으로 작동하는 모놀리스

hyuckhoon.ko·2023년 4월 10일
0

TIL

목록 보기
6/69

문제

프로젝트 A와 프로젝트 B가 있다.
이 두 프로젝트가 공통의 데이터베이스를 공유한다고 하자.
(모놀리식 -> 마이크로 서비스 구조로의 마이그레이션 도중에 발생하는 불가피한 임시 상황이라고 해두자)

기존 로직과 모델 정보는 프로젝트 A에게 있다. 또한, 복잡도를 낮추기 위해 스키마 변경의 권한은 프로젝트 A에 한정한다. 프로젝트 A의 스키마 변경으로 인한 프로젝트 B의 부작용을 최소화시키려면 어떻게 해야 하는가?

접근 아이디어

추상화를 도입하여 프로젝트 A와 프로젝트 B의 의존성을 낮춘다.
또한, 프로젝트 B에서는 데이터 로직과 비즈니스 로직을 분리한다.

장고 예시

프로젝트 B의 serializers.py

from rest_framework import serializers


class UserSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    username = serializers.CharField(max_length=150)
    email = serializers.EmailField()
    # Add any other fields you expect to receive from project A's User model

    # You can add custom validation if needed
    def validate_email(self, value):
        if "example.com" in value:
            raise serializers.ValidationError("Invalid email domain.")
        return value

프로젝트 B의 views.py

from rest_framework import generics

from .serializers import UserSerializer
from .utils import get_project_A_data


class UserList(generics.ListAPIView):
    serializer_class = UserSerializer

    def get_queryset(self):
        user_data = get_project_A_data("users/")
        return user_data

프로젝트 A의 데이터 접근

# utils.py
import requests


def get_project_A_data(endpoint):
    base_url = "http://project_A_address/api/"
    url = f"{base_url}{endpoint}"
    response = requests.get(url)
    
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception(f"Error fetching data from project A: {response.status_code}")

0개의 댓글