구조화 코드 - 층별 봉인 및 특성별 봉인

1. 계층형 패키지


대부분의 애플리케이션에서 다음과 같은 Clean 아키텍처와 같은 코드 계층화를 지원합니다.
com.awesome.project
    .common
        StringUtils
        ExceptionUtils
    .controllers
        LocationController
        PricingController
    .domain
        Address
        Cost
        CostFactory
        Location
        Price
    .repositories
        LocationRepository
        PriceRepository
    .services
        LocationService

층포장이 비교적 유행하는 원인은 개발자가 기능이 비슷한 코드를 쉽게 발견할 수 있고 사람들이'사물을 분류하는 데 익숙하다'는 사상에 부합되기 때문일 수 있다. 그러나 층포장은 다음과 같은 문제를 가져올 수 있다.
  • 업무 추가 또는 수정 시 다중 층 수정 코드 필요
  • 한 층에 봉인된 코드는 일반적으로 관련이 없다(예를 들어 Location Repository와Price Repository)
  • 서로 다른 개발자는 서로 다른 코드층에 포함되어야 하는 기능에 대해 서로 다른 인식을 가지기 때문에 모두의 인지를 통일하는 시간이 필요하고 신인에 대한 통일된 교육이 필요하다
  • 어떤domain을 단독 마이크로 서비스로 추출하는 것은 쉽지 않다
  • 계층을 늘리면 복잡성이 높아집니다
  • .
  • 개발자는 코드를 어느 층에 두어야 할지 생각할 시간이 필요하다
  • 업무가 점점 복잡해지고 구조에 대한 수호가 부족해지면서 층 구조는 점점 부패하고 최초의 구조 설계에서 멀리 떨어진다
  • 2. 특성(또는domain)으로 캡슐화


    계층 분리 문제를 고려하여 우리는 특성이나domain에 따라 코드를 봉인할 수 있다. 예를 들어 다음과 같다.
    com.awesome.project.component
        .location
            Address
            Location
            LocationController
            LocationRepository
            LocationService
        .platform
            StringUtils
            ExceptionUtils
        .price
            Cost
            CostFactory
            Distance
            Price
            PriceController
            PriceRepository
    

    이런 구조화된 코드는 OO원칙에 더욱 부합되고 업무의 높은 내적 집합을 할 수 있으며 층을 나누어 코드를 봉인하는 문제를 해결할 수 있을 뿐만 아니라 다음과 같은 장점을 가진다.
  • 개발자는 업무에 더욱 초점을 맞추고 우리의 코드를 어떻게 조직하는지 시간이 걸리지 않는다
  • DDD의 측면에서 보면 개발자는 어떤domain 아래의 집합근을 쉽게 찾을 수 있다. 예를 들어 price 가방에 있는Price류는 집합근이 틀림없다. 왜냐하면 우리는PriceRepository를 통해Price를 직접 얻을 수 있기 때문이고Cost는Price에 의해 사용될 가능성이 높다. 왜냐하면 우리는 직접 그것을 얻을 수 없기 때문이다
  • 이런 포장 방식을 사용하여 해결해야 할 가장 중요한 문제는 다음과 같다. **업무 규칙을 응용하는 것은 왕왕 여러 분야의 업무 규칙이 조합되어 완성되는 것이고 어디에서 이런 분야의 업무 규칙의 조합을 완성합니까? **개발자마다 다른 해결 방법이 있을 수 있습니다. 예를 들어 Controller를 하나의 층으로 제시하는 것입니다.
    com.awesome.project
        .controller
            LocationController
            PriceController
        .component
           .location
               Address
               Location
               LocationRepository
               LocationService
           .platform
               StringUtils
               ExceptionUtils
           .price
               Cost
               CostFactory
               Distance
               Price
               PriceRepository
    

    Github 블로그 주소

    좋은 웹페이지 즐겨찾기