NX + Angular 기반 개발시 엔터프라이즈 애플리케이션 개발방법에 대한 글을 정리한다. Micro Frontend 개발방법이라기 보다는 애플리케이션을 개발하며 지속적으로 확장할 필요가 있을 때 관심사들을 어떻게 분리하여(Bounded Context) 개발할 수 있을지 보여준다.
https://indepth.dev/the-shell-library-patterns-with-nx-and-monorepo-architectures/
https://connect.nrwl.io/app/books/enterprise-angular-monorepo-patterns
nx.dev를 이용한 라이브러리 관리
Nx는 하나의 레파지토리에서 멀티 애플리케이션과 라이브러리를 개발할 수 있는 환경을 제공한다. @angular/cli를 확장한 형태로 Angular, React, NodeJS를 함께 개발하고 별개로 번들링 배포할 수 있다. Nx 설치는 이전 글을 참조한다.
workspace/libs 하위로 폴더를 구분하여 업무를 개발할 수 있고, workspace/apps 의 애플리케이션에서 libs의 내용을 통합하여 사용하는 방법을 제시한다.
- application
- application 안에서 sub-domain을 import하거나, routing 한다.
- sub-domain을 통합하는 방식이다.
- 애플리케이션, web, desktop(using Eletron), mobile(Ionic)을 이용하여 sub-domain을 사용한다.
- sub-domain
- 업무 도메인이다.
- sub-domain은 Bounded Context 이다.
- Bounded Context는 업무 논리적으로 분리될 수 있는 단위이다.
- feature-shell
- 업무 도메인의 페이지를 통합하고 routing을 설정한다.
- sub-domain 안에 1개 존재한다.
- shell은 sub-domain을 접근토록 하는 entry point 모듈이다.
- shell orachestrate the routes of "Bounded Context"
- feature-<bizName>
- 일반적으로 웹 화면(Page) 하나라고 정의하자.
- sub-domain 안에는 feature-<bizName>가 여러개 존재할 수 있다.
Nx applications과 libraries 폴더 구조
Feature-shell에서 sub-doamin(Bounded Context) 라우팅하기
애플리케이션에서 Feature-shell 라우팅하기. 애플리케이션에서 feature-shell을 조합하여 사용한다.
NX에서 Library 분류 및 개발 방법
nx workspace의 libs/ 밑으로 라이브러리를 개발할 때 다음과 같이 분류하여 개발한다.
- Feature-Shell library
- 업무 sub-domain을 통합하여 애플리케이션에서 사용할 수 있도록 한다.
- UI library
- presentation component로써 버튼, 모달같은 업무 로직이 없는 컴포넌트들
- Shared library
- Data Access library
- REST API 서비스
- WebSocket 통신
- Ngrx/Store 기반 State 관리
- Utils library
- 유틸리티 서비스
- Data Access library
NX에서 tag 구분 keywords
- scope
- sub-domain
- grouping folder
- type
- feature-shell
- ui
- data-cess
- platform
- desktop
- mobile
예) scope:shared, type:feature,platform:desktop
각 라이브러리의 특성에 맞게 libs/ 밑으로 폴더/폴더 형태의 grouping folder 구조로 개발한다.
feature-shell의 모듈 명칭은 "feature-shell" 으로 한다.
nx를 이용하여 library 생성시 옵션들
- --directory=<grouping folder name>
- --routing: forChild routing 자동 설정
- --lazy: application에 lazy routing 자동 설정, 반드시 parent-module을 지정함.
- --parent-module=<application module path and file name>: lazy 옵션 설정시 lazy routing 설정할 module 위치를 지정함.
- --tags=<tag>,<tag>: nx.json에 포함됨, nx.json에서 직접 수정 및 추가 가능 예) --tags=scope:shared,type:feature
- --publishable: 특별히 npm registry에 publish 할 수 있는 library를 만들고 싶을 때 사용한다. ng-packagr 기반이다.
//Command
nx g lib feature-<sub-domain name> --routing --directory=<grouping folder name> --lazy --parent-module=apps/<application>/src/app/app.module.ts
//Sample
$ nx g lib feature-shell --routing --directory=admin --lazy --parent-module=apps/app-container/src/app/app.module.ts
? Which stylesheet format would you like to use? SASS(.scss) [ http://sass-lang.com ]
CREATE libs/admin/feature-shell/README.md (162 bytes)
CREATE libs/admin/feature-shell/tsconfig.lib.json (459 bytes)
CREATE libs/admin/feature-shell/tslint.json (276 bytes)
CREATE libs/admin/feature-shell/src/index.ts (50 bytes)
CREATE libs/admin/feature-shell/src/lib/admin-feature-shell.module.ts (367 bytes)
CREATE libs/admin/feature-shell/src/lib/admin-feature-shell.module.spec.ts (432 bytes)
CREATE libs/admin/feature-shell/tsconfig.json (138 bytes)
CREATE libs/admin/feature-shell/jest.config.js (405 bytes)
CREATE libs/admin/feature-shell/tsconfig.spec.json (258 bytes)
CREATE libs/admin/feature-shell/src/test-setup.ts (30 bytes)
UPDATE angular.json (15807 bytes)
UPDATE nx.json (1098 bytes)
UPDATE tsconfig.json (863 bytes)
품질 및 일관성 유지 방법
- Single Version을 apps와 libs에 적용한다.
- package.json에서 관리한다.
- Code Formatting은 prettier를 사용한다.
- Library Dependencies 관리
- library 순환 참조는 안된다.
- library가 application을 import하거나 의존하지 않는다.
- npm run dep-graph 또는 npm run affected:dep-graph 수행하면 라이브러리 의존관계도가 자동생성되어 웹브라우져에서 확인할 수 있다.
- MS Code Editor의 Plugin으로 "Nx Console"을 설치하면 Editor에서 바로 수행해 볼 수도 있다.
Nx Schematics 관리
Nx에 Built-in 된 schematics
- ngrx: Ngrx/store 기반으로 reducer, action, selector, facade를 자동 생성함
- node: Express node application의 경우
- jest: unit test
- cypress: E2E test
- etc..
Custom schematic 만들기
- 개발자들이 샘플코드를 copy & paste하지 않고 schematic을 통해 업무 개발을 위한 파일을 생성토록할 때 사용한다.
- nx g workspace-schematic <custom-schematic-name> 명령을 수행하면 workspace/tools/ 폴더 밑에 schematic파일이 생성됨.
- 예제 파일 생성: nx g workspace-schematic data-access-lib 수행
- 예제 파일 수행: npm run workspace-schematic data-access-lib <name>
//index.ts에 ngrx를 추가로 적용한 예제
import { chain, externalSchematic, Rule } from '@angular-devkit/schematics';
import * as path from 'path';
export default function (schema: any): Rule {
if (!schema.name.startsWith('data-access-')) {
throw new Error(`Data-access lib names should start with 'data-access-'`);
}
const stateName = schema.name.replace('data-access-', '');
return chain([
externalSchematic('@nrwl/workspace', 'lib', {
name: schema.name,
tags: 'type:data-access',
}),
externalSchematic('@nrwl/schematics', 'ngrx', {
name: stateName,
module: path.join('libs', schema.name, 'src', 'lib', `${schema.name}.module.ts`),
}),
]);
}
관련소스: github.com/ysyun/blog-5730-micro-demo.git
참조
https://indepth.dev/the-shell-library-patterns-with-nx-and-monorepo-architectures/
NX에서 Eletron, Ionic, NativeScript 통합 개발하기
https://nstudio.io/xplat/fundamentals/architecture
'React > Architecture' 카테고리의 다른 글
[MS-2] React & Nest 기반 애플리케이션 및 Micro Service 통신 설정 (0) | 2021.09.20 |
---|---|
[MS-1] Micro Service 환경 구축 (0) | 2021.09.20 |
[Micro Frontend] Web Components 기반 마이크로 프론앤드 (0) | 2020.05.18 |
[Micro Frontend] 마이크로 프론트앤드 - 개념 (0) | 2020.05.18 |
[React] 주요 개념 (Main Concept) 정리 (0) | 2020.04.23 |