계층형 아키텍처 vs Feature Folders

발행: (2026년 1월 12일 오전 05:31 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

번역을 진행하려면 번역하고자 하는 전체 텍스트(본문 내용)를 제공해 주시겠어요?
본문을 알려주시면 원본 형식과 마크다운을 그대로 유지하면서 한국어로 번역해 드리겠습니다.

Introduction

.NET에서 레이어드 아키텍처와 피처 폴더 중 어느 쪽을 선택할지는 종종 단순한 폴더 구조 결정으로만 여겨집니다. 실제로는 코드베이스 성장, 배포 속도, 그리고 기술 부채에 영향을 미치는 보다 깊은 아키텍처 선택입니다.

두 접근 방식을 모두 사용해 생산 시스템을 구축하고 유지해 보면서, 클래식 레이어링이 제공하는 안전성과 속도가 중요할 때 발생할 수 있는 마찰, 그리고 피처 폴더가 가져다 주는 흐름과 규율이 없을 때 나타나는 혼란을 직접 경험했습니다. 이 글은 무엇이 깨졌고, 무엇이 팀의 속도를 늦추었으며, 궁극적으로 무엇이 더 잘 작동했는지에 대한 실제 현장의 관찰을 바탕으로 작성되었습니다.

Source:

레이어드(또는 Onion) 아키텍처

대부분의 .NET 개발자는 경력 초기에 레이어드 구조를 접합니다: Core, Infrastructure, Application, 그리고 Web/API. 설명하기 쉽고, 다이어그램으로도 간단히 표현할 수 있으며, “안전한” 아키텍처 선택으로 널리 받아들여집니다.

문서상으로는 레이어드 아키텍처가 Clean Architecture 원칙을 만족합니다:

  • 의존성이 안쪽으로만 향함.
  • 비즈니스 로직이 격리됨.
  • 인프라스트럭처 관련 사항이 추상화됨.

일반적인 문제점

  • 여러 레이어 수정 필요: 새로운 기능을 추가할 때 작은 변경이라도 여러 레이어를 건드려야 합니다.
  • 레이어 간 누수: 인프라스트럭처 관련 코드가 애플리케이션 코드에 스며듭니다.
  • 온보딩 어려움: 신규 개발자가 로직이 어디에 위치해야 하는지 찾기 힘들어합니다.

예시: CreateOrder 엔드포인트 추가

// Web layer
/Web/API/Controllers/OrderController.cs          

// Application layer
/Application/Commands/CreateOrderCommand.cs       
/Application/Handlers/CreateOrderHandler.cs

// Core/Domain
/Core/Domain/Order.cs                             

// Infrastructure
/Infrastructure/Repositories/OrderRepository.cs
/Infrastructure/Mapping/OrderProfile.cs

이 접근 방식은 안전하고 명시적이지만, 특히 작은 팀에서는 번거롭고 느립니다.

Source:

기능 폴더

기능 폴더는 기술 계층이 아니라 비즈니스 역량별로 코드를 조직합니다. 기능과 관련된 모든 파일이 함께 위치해 있어, 한 곳에서 동작을 이해하고 수정하기가 더 쉽습니다.

관찰된 이점

  • 더 빠르고 집중된 기능 개발.
  • 격리된 기능에 대한 간단한 리팩터링.
  • 컨텍스트 전환 감소 및 코드 리뷰 용이.

예시 폴더 구조

/Features
  /Orders
    OrderController.cs
    CreateOrderHandler.cs
    OrderValidator.cs
    OrderRepository.cs
    OrderDto.cs

이 구조는 파일 배치에 대한 논쟁과 불필요한 절차를 최소화하여, 팀이 비즈니스 문제에 집중할 수 있게 합니다.

트레이드‑오프

측면레이어드 아키텍처기능 폴더
장점명확한 경계, SOLID 적용 용이, 대규모 팀에 적합빠른 반복, 온보딩 용이, 비즈니스 개념과 정렬
단점전달 속도 저하, 보일러플레이트 증가, 일상적인 변경에 대한 인지 부하 증가로직 중복 위험, 명확한 규칙 필요

What actually broke?

On one project we started with a layered approach because it was considered best practice. After six months:

  • Onboarding was painful.
  • Feature delivery slowed dramatically.

Refactoring toward Feature Folders restored momentum, but only after introducing rules for shared logic and avoiding uncontrolled sprawl.

올바른 접근 방식 선택

  • 소규모 팀 / 빠르게 움직이는 제품 → Feature Folders가 일반적으로 더 좋습니다.
  • 다양한 관점을 가로지르는 복잡한 요구사항을 가진 플랫폼 → 레이어드 아키텍처가 더 적합할 수 있습니다.
  • 하이브리드 솔루션 → 두 방식을 결합하는 것이 가장 효과적이며, 공유 인프라에는 레이어를 사용하고 기능별 코드는 Feature Folders에 유지합니다.

실용적인 권장 사항

  • 다음 수직 슬라이스에 Feature Folders를 시도해 보세요. 레이어드 프로젝트 안에서도 적용해 보고 속도와 명확성에 미치는 영향을 관찰하십시오.
  • 조기 추상화를 피하십시오: 공유 컴포넌트를 추출하기 전에 중복이 자연스럽게 드러나도록 두세요.
  • 명확한 소유권과 목적이 없는 일반적인 “Common” 폴더를 절대 만들지 마세요.

아키텍처는 팀을 제약하기보다 지원해야 합니다.

Back to Blog

관련 글

더 보기 »