
암묵적인 연결과 모듈의 복잡성떄문에 유지보수가 어려움

최상위 디렉토리, 애플리케이션 분해의 첫번쨰 단계
레이어의 수는 최대 7개로 제한

app
애플리케이션 진입점
전역 설정 - 프론트 앱, 모바일 앱 전체적인 설정
slice : BroswerRouter, Provider, ApoloClient 같은 HOC
render(
<BrowserRouter>
</BrowserRouter>
)
processes
한 페이지에서 정보를 다 입력하지 않고
(Step by Step)
닉네임 입력 -> 휴대폰 인증 -> 이메일 인증
--> widgets 폴더로 이동
pages
주소별 Page
slice : 각각의 주소별 Page
widgets
페이지에 사용되는 독립적인 UI 컴포넌트
(기존의 layout 폴더)
feature의 묶음
어떻게 묶을지는 재사용 여부에 따라
features (동사, 행동)
slice : 동사
api segment에서는 해당 행동을 요청함
ex) onclick 이벤트
entities (명사)
(기존의 components 폴더)
데이터 그 자체
slice : data
api segment에서는 데이터를 조회
shared
(기존의 hooks, typings, utils)
공유 컴포넌트
slice : 없음
각 Layer에는 애플리케이션 분해의 두번째 수준인 slice라는 하위 디렉토리가 있습니다.
주요 목표 : 코드를 값 별로 그룹화 하는 것
ex) 사진 갤러리 - 사진, 앨범, 갤러리
소셜 네트워크 - 게시물, 사용자, 뉴스피드
게시물 - user, post, comment

Segment는 목적에 따라 Slice 내의 코드를 나누는데 도움이 됩니다.
팀의 합이에 따라 Segment의 구성과 이름이 변경될 수 있습니다.
일반적으로 사용되는 세그먼트
actions, selectorsex) 재사용할 Button -> shared
Button 클릭했을 때 동작 -> features

Fork 버튼을 구현한다고 하면
/*
* onClick : feature (클릭하는 행위)
* icon : shared (공유하는 아이콘)
* data : entity (데이터 그 자체)
*/
<Shared.Button
onClick={forkFeature.api.fork}
icon={shared.icon.fork}
data={forkEntity.model.forkCount}
/>
상위 계층이 하위 계층을 import 가능
❗반대로는 불가능

app - 하위 6가지(processes, pages, widgets, features, entities, shared) 전부 import
pages - 하위 4가지(widgets, features, entities, shared) import
features - 하위 2가지(entities, shared) import
각 slice와 segment에는 공개 API가 있습니다.
index.js 또는 index.ts 파일이며,
이 파일을 통해 slice 또는 segment에서 필요한 기능만 외부로 추출하고 불필요한 기능은 격리할 수 있습니다. index 파일은 진입점 역할을 합니다.
공개 API는 import 및 export로 단순하게 작동하므로
애플리케이션을 변경할 때 코드의 모든 곳에서 import를 변경할 필요가 없습니다.
export { Button } from './Button';
export { Title } from '.Title';
export { Textfiled } from './Textfield';
export { Modal } from './Modal';
export { Select } from '.Select';
export { Range } from './Range';