https://medium.com/class101/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-79eef2e30c77
- 코드베이스가 커진다는 것 = 이해하기도, 수정하기도 어려워진다는 것
- 해결 방법은? 코드베이스를 작게 유지하면 됨.
- 도메인 별 코드베이스 분리 & 마이크로 프론트엔드 to rescue!
- 모노레포 안에서 라이브러리의 의존 관계 설정 & 의존성 확인 등의 니즈는 [Nx](https://nx.dev/)를 도입하여 해결
- 애플리케이션과 라이브러리로 코드를 분리
- 애플리케이션은 의존성 및 설정 주입의 역할
- 라이브러리에 대부분의 기능을 구현
- 라이브러리에는 범용적으로 사용할 수 있는 디자인 시스템, 국제화, 서드파티 모듈 뿐만 아니라 홈 페이지의 히어로 배너, 상품 상세 페이지, 주문 내역 등 재사용하지 않는 코드까지 작성.
### Feature 라이브러리
- 기본적으로 한 페이지에서 사용되는 모든 컴포넌트들은 같은 이름의 Feature 라이브러리에 작성
- ex) `account` 도메인의 `SignInPage` 페이지의 모든 컴포넌트들은 `account/feature-sign-in` 라이브러리에 작성
- 같은 도메인의 둘 이상의 페이지에서 공유하는 컴포넌트는 해당 도메인 내 별도의 feature로 분리
- ex) `account` 도메인의 `SignInPage`와 `SignUpPage`에서 `KakaoLoginButton` 컴포넌트를 공통으로 사용한다면 해당 컴포넌트는 `account/feature-social-login` 라이브러리에 작성
- 서로 다른 도메인의 페이지들에서 공유하는 컴포넌트는 공용 도메인 내 별도의 feature로 분리
- ex) `landing` 도메인의 `HomePage`와 `classroom` 도메인의 `LecturePage`에서 공유하는 `GlobalNavigation` 컴포넌트는 `shared/feature-navigation` 라이브러리에 작성
### Shell 라이브러리
- Feature, UI 라이브러리의 컴포넌트들을 조합해 페이지들을 만듦
- ex) `SignInPage` 컴포넌트는 account/shell-kr-web 라이브러리의 컴포넌트. 여기에는 `SignUpPage`, `PhoneVerificationPage` 등이 있음.
- Shell 라이브러리는 애플리케이션에 제공되는 특정 도메인의 진입점
- 애플리케이션 별로 다른 진입점을 제공할 수 있음
- 예를 들어..
- `HomePage` 컴포넌트에서 사용하는 컴포넌트들은 `landing/feature-home` 라이브러리에 작성되어 있음.
- 하지만 같은 `HomePage`라도 미국 사이트의 `HomePage`인지, 일본 사이트의 `HomePage`인지, 한국 사이트의 `HomePage`인지에 따라 그 구성이 다를 것.
- 따라서 `landing` 도메인에 접근하는 각각의 애플리케이션을 위한 `shell` 라이브러리를 만들 수 있음. (`shell-us-web`, `shell-jp-web`, `shell-kr-web`)
### Provider 라이브러리
- 둘 이상의 Feature 라이브러리에서 공유하는 상태를 관리하는 라이브러리
- ex) 로그인 상태를 관리하는 `shared/provider-auth-state`
### UI 라이브러리
- 둘 이상의 라이브러리에서 공유하는 Presentational 컴포넌트의 모음.
### Utility 라이브러리
- 위 4가지 분류에 해당하지 않는 모든 모듈들
- 클래스101의 도메인 모델과 무관하게 테스트 및 배포가 가능한 수준으로 독립적인 기능을 제공해야 함.
- ex) `shared/utils-apollo-client`, `shared/utils-i18n`
### 애플리케이션
- 설정 및 의존성 관리의 역할만 담당하게 됨 = 애플리케이션의 코드는 거의 없음
언어를 감지 갈리시아어 구자라트어 그루지야어 그리스어 네덜란드어 네팔어 노르웨이어 덴마크어 독일어 라오어 라트비아어 라틴어 러시아어 루마니아어 룩셈부르크어 리투아니아어 마라티어 마오리어 마케도니아어 말라가시어 말라얄람어 말레이어 몰타어 몽골어 몽족 미얀마어 (버마어) 바스크어 베트남어 벨로루시어 벵골의 보스니아어 불가리아어 사모아어 세르비아어 세부아노 세소토어 소말리아어 쇼나어 순다어 스와힐리어 스웨덴어 스코틀랜드 게일어 스페인어 슬로바키아어 슬로베니아어 신디어 신할라어 아랍어 아르메니아어 아이슬란드어 아이티 프랑스 말 아일랜드어 아제르바이잔어 아프리칸스어 알바니아어 암하라어 에스토니아어 에스페란토 말 영어 요루바어 우르두어 우즈베크어 우크라이나어 웨일즈어 이그보어 이디시어 이탈리아어 인도네시아어 일본어 자바어 줄루어 중국어(간체) 중국어(번체) 체와어 체코어 카자흐어 카탈로니아어 칸나다어 코르시카어 코사어 쿠르드어 크로아티아어 크메르어 키르기스어 타갈로그어 타밀어 타직어 태국어 터키어 텔루구어 파슈토어 펀자브어 페르시아어 포르투갈어 폴란드어 프랑스어 프리지아어 핀란드어 하와이 사람 하우사어 한국어 헝가리어 히브리어 힌디어
갈리시아어 구자라트어 그루지야어 그리스어 네덜란드어 네팔어 노르웨이어 덴마크어 독일어 라오어 라트비아어 라틴어 러시아어 루마니아어 룩셈부르크어 리투아니아어 마라티어 마오리어 마케도니아어 말라가시어 말라얄람어 말레이어 몰타어 몽골어 몽족 미얀마어 (버마어) 바스크어 베트남어 벨로루시어 벵골의 보스니아어 불가리아어 사모아어 세르비아어 세부아노 세소토어 소말리아어 쇼나어 순다어 스와힐리어 스웨덴어 스코틀랜드 게일어 스페인어 슬로바키아어 슬로베니아어 신디어 신할라어 아랍어 아르메니아어 아이슬란드어 아이티 프랑스 말 아일랜드어 아제르바이잔어 아프리칸스어 알바니아어 암하라어 에스토니아어 에스페란토 말 영어 요루바어 우르두어 우즈베크어 우크라이나어 웨일즈어 이그보어 이디시어 이탈리아어 인도네시아어 일본어 자바어 줄루어 중국어(간체) 중국어(번체) 체와어 체코어 카자흐어 카탈로니아어 칸나다어 코르시카어 코사어 쿠르드어 크로아티아어 크메르어 키르기스어 타갈로그어 타밀어 타직어 태국어 터키어 텔루구어 파슈토어 펀자브어 페르시아어 포르투갈어 폴란드어 프랑스어 프리지아어 핀란드어 하와이 사람 하우사어 한국어 헝가리어 히브리어 힌디어
음성 기능은 200자로 제한됨