Skip to main content Link Search Menu Expand Document (external link)

Table of contents

  1. Service Layer란?
  2. 요점 : 계층간 데이터 교환을 위해 객체를 생성하여 내부에서 비즈니스 로직을 처리할 수 있습니다.

Service Layer란?

Service Layer란 모델과 뷰 사이에 비즈니스 로직을 담당하는 개념을 추가하는 것을 의미한다.

Service Layer가 추가되면, 모델에는 객체의 속성만 관리하게 된다.

설명을 위해 급하게 짠 코드이므로 양해 먼저 부탁드립니다.

요점 : 계층간 데이터 교환을 위해 객체를 생성하여 내부에서 비즈니스 로직을 처리할 수 있습니다.

# views.py
class BankViewSet(mixins.CreateModelMixin,
                       mixins.ListModelMixin,
                       GenericViewSet):
    """
        - 계좌 생성 및 취소 관련 api
    """
 
    queryset = Bank.objects.all()
    serializer_class = BankSerializer
 
    def create(self, request, *args, **kwargs) -> Response:
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        create_account = serializer.save()
        
        # Serivice 쪽에서 비지니스 로직을 처리
        _bank = Bank()
        _bank.set_guide(create_account)
        
        return Response(_bank, status=status.HTTP_201_CREATED)
 
# services.py
class Bank(object):
    
    def set_guide(self, create_account):
        # 입력된 나라에 따라 저장될 상태 분기
        if data.get('country') == 'kr':
            create_account.vendor_name = '신한은행'
            create_account.vendor_code = '신한'
        else:
            create_account.vendor_name = 'Shinhan'
            create_account.vendor_code = 'SHIN'
 
        create_account.save(updated_fields=['vendor_name', 'vendor_code'])
    ...

service layer를 구별하여 코드를 관리하면 Test code와 Unit Test 자체도 간단하게 구현할 수 있습니다.

비즈니스 로직을 상위와 같이 service Layer에서 처리하게 되면 model, view + serializer가 모두 깔끔해집니다.

Django에선 항상 비즈니스 로직의 위치가 정형화 되어 있지 않습니다. 회사마다 Code Convention이 있다면, 그 기준을 따르겠지만, 없다면 service Layer로 처리해보는 것도 나쁘지 않을 것 같습니다.

Django에 Service Layer를 두는 몇가지 방식은 다음과 같다.

  • Form / Serializer가 Service Layer를 대신한다.
  • utils 모듈에 비즈니스 로직을 추가해서 사용한다.
  • service 모듈에 비즈니스 로직을 추가해서 사용한다.