이 repo는 Next.js에서 깨끗한 아키텍처를 달성하는 방법의 예입니다. 이 프로젝트를 진행하는 비디오 자습서가 있습니다. YouTube에서 확인하려면 이미지를 클릭하십시오.
npm install 및 npm run dev 실행하여 프로젝트를 실행할 수 있습니다.

메모
? 원래 클린 아키텍처 다이어그램의 단순화 된 버전을 그렸습니다. 나는 나에게 더 합리적 인 방식으로 그것을 단순화했으며 이해하기가 더 쉽습니다. 나는 그것이 당신도 도움이되기를 바랍니다.
Clean Architecture에 대해 처음 듣는 경우 Bob 삼촌의 원본 기사를 읽어 보는 것이 좋습니다. 그러나 아래에서 요약하겠습니다.
Clean Architecture는 응용 프로그램이 유지 관리 및 테스트가 쉽고 테스트하기가 쉽고 코드베이스를 예측할 수있는 방식으로 구조화하는 데 도움이되는 일련의 규칙 입니다. 그것은 기술적 배경과 프로그래밍 언어 선호도에 관계없이 개발자가 이해하는 공통 언어와 같습니다.
깨끗한 아키텍처 및 유사한/파생 아키텍처는 모두 동일한 목표 - 우려 사항을 분리합니다 . 그들은 비슷한 코드를 함께 묶는 계층을 소개합니다. "레이어링"은 코드베이스에서 중요한 측면을 달성하는 데 도움이됩니다.
클린 아키텍처는 종속성 계층 구조를 정의함으로써이를 달성합니다. 레이어는 그 아래의 레이어에만 의존하지만 위에 있지는 않습니다.
app - 프레임 워크 및 드라이버 레이어 - 기본적으로 다음 모든 것 (페이지, 서버 동작, 구성 요소, 스타일 등) 또는 앱의 논리를 "소비"합니다.di 종속성 주입 - DI 컨테이너와 모듈을 설정하는 폴더drizzle - 모든 DB- DB 클라이언트 초기화, 스키마 정의, 마이그레이션src 시스템의 "루트"application - 애플리케이션 계층 - 저장소 및 서비스를위한 사용 사례 및 인터페이스를 보유합니다.entities - 엔터티 레이어 - 모델 및 사용자 정의 오류를 보유합니다.infrastructure - 인프라 계층 - 리포지토리 및 서비스 구현을 보유하고 application 에서 인터페이스를 가져옵니다.interface-adapters - 인터페이스 어댑터 레이어 - 시스템의 진입 점으로 사용되는 컨트롤러를 보유합니다 (시스템과 상호 작용하기 위해 프레임 워크 및 드라이버 계층에 사용됨)tests - 단위 테스트는 여기에 살고 있습니다 - unit 하위 폴더의 구조는 src 와 일치합니다..eslintrc.json eslint-plugin-boundaries 플러그인이 정의되는 곳 - 종속성 규칙을 위반하는 것을 막을 수 있습니다.vitest.config.ts @ alias가 정의되는 방법에 유의하십시오! User 모델이 있습니다.catch 하고 해당 오류를 우리 자신의 오류로 변환합니다.getTodo , createTodo 또는 updateTodo 와 같은 단일 데이터베이스 작업을 수행하는 방법을 노출시키는 클래스입니다. 이는이 클래스에서만 데이터베이스 라이브러리 / 드라이버를 사용한다는 것을 의미합니다. 데이터 검증을 수행하지 않고 데이터베이스에 대한 쿼리 및 돌연변이를 실행하고 사용자 정의 된 오류 또는 반환 결과를 던지십시오.di 디렉토리에서 추상화를 만듭니다. 우리는 저장소, 서비스, 컨트롤러 및 사용 사례를 기호로 "바인딩"하며 실제 구현이 필요할 때 해당 기호를 사용하여 "해결"합니다. 그것이 구현을 명시 적으로 의존하지 않고도 구현을 사용할 수있는 방법입니다 (가져 오기). 팁
FAQ가 다루지 않는 질문이있는 경우이 리포지어에서 문제를 열거 나 Discord 서버에 가입하여 대화를 시작하십시오.
예! 페이지 라우터, 앱 라우터, 미들웨어, API 핸들러, 서버 작업 등을 사용할 수 있습니다! 일반적으로 JavaScript 프로젝트에서 의존성 주입을 달성하는 것은 Node를 제외한 다른 런타임과 호환되지 않는 Inversify.js 라이브러리를 사용하여 수행됩니다. 이 프로젝트는 reflect-metadata 에 의존하지 않고 모든 런타임에서 작동하는 간단한 IOC 컨테이너 인 ioctopus를 구현합니다.
나는 아니오라고 말하고 싶다. 새로운 프로젝트를 시작하는 경우 가능한 한 빨리 MVP 상태를 달성하는 데 집중하는 것이 좋습니다 (따라서 아이디어를 검증 / 프로젝트의 미래가 있는지 확인할 수 있습니다). 상황이 심각해지기 시작하면 (더 많은 기능이 구현되기 시작하거나, 사용자 기반이 상당한 성장을 경험하거나 프로젝트의 다른 개발자를 탑승시키고 있음),이 아키텍처 (또는 해당 문제에 대한 아키텍처)를 조정하는 데 시간을 투자하고 싶을 때입니다.
이미 프로젝트의 잡초에 깊은 곳이 있다면, 귀하와 팀은 다음 스프린트에서 시작하여 점진적인 리팩토링을 계획 할 수 있습니다. 이 경우 이미 코드가 작성되었으며, 코드를 조금만 재구성하면 코드를 조금만 재구성하면 Route Handler를 통해 경로 처리기, 서버 작업에 의한 서버 작업을 부분적으로 수행 할 수 있습니다. 그건 그렇고, 나는 그것을 가볍게 "조금만 재구성해야한다"고 말하지만, 그다지 단순한 것과는 거리가 멀다. 리팩토링을 계획 할 때 항상 "잘못되는 것"을 고려하십시오. 그리고 테스트를 작성하는 데 시간을 투자하십시오!
이에 대해 생각하면 3 분 이상을 쓰지 않으면 그렇습니다. 그러나 그렇게한다면, 건축 = 징계를 알게 될 것입니다. 아키텍처는 어디로 가는지 정의하는 개발자 간의 계약입니다. 실제로 코드베이스를 예측할 수있게하기 때문에 기능 개발을 단순화하고 그러한 결정을 내립니다.
작업하는 모든 개발자가 가장 편리한 코드를 작성하면 프로젝트를 지속적으로 성장시킬 수 없습니다. 코드베이스는 함께 일하기에 악몽으로 변할 것이며, 그때는 실제로 복잡한 기능 개발 프로세스를 느낄 것입니다. 이것에 맞서기 위해 결국에는 몇 가지 규칙을 내려 놓을 것입니다. 팀이 새로운 문제에 직면하고 해결함에 따라 이러한 규칙이 커질 것입니다. 이 모든 규칙을 문서에 넣으면 자체 아키텍처 정의가 있습니다. 당신은 여전히 일종의 아키텍처를 구현할 수 있습니다. 방금 그 지점에 매우 느리고 고통스럽게 도달했습니다.
깨끗한 아키텍처는 테스트 된 바로 가기와 사전 정의 된 아키텍처를 제공합니다. 그렇습니다. 물론이 모든 것을 배워야하지만 평생 한 번 수행 한 다음 앞으로 사용할 언어 나 프레임 워크에 원칙을 적용합니다.
아니요 . 프로젝트가 기능의 수, 사용자 수, 또는 그 작업을 수행하는 개발자 수 모두로 성장할 것으로 기대하지 않는 경우가 아닙니다.
Readme의 상단에서 언급 한 원래 블로그 게시물에서 언급했듯이 :