Skip to content

Commit a25a0fd

Browse files
authored
Create if (kakao) dev 2022.md
1 parent 5f46087 commit a25a0fd

File tree

1 file changed

+232
-0
lines changed

1 file changed

+232
-0
lines changed

etc/if (kakao) dev 2022.md

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
# if (kakao) dev 2022
2+
3+
## MFA, 누구냐 너: 공통 플랫폼 파트의 MFA 도입기
4+
5+
### MFA, why ?
6+
7+
* App이 커짐에 따라 프론트앤드의 중복 개발이 많아짐
8+
=> 동일한
9+
* 업무 결합도 증가
10+
=> 다양한 운영주체 (협의가 많아짐)
11+
12+
### MFA 란
13+
14+
* 독립적으로 작동하는 SPA
15+
* injection하여 조립
16+
* 응집력 / 유지보수와 배포 등 업무의 분리
17+
18+
### MFA 구현 방법
19+
20+
[martinFowler.com](https://martinfowler.com/) 참고
21+
22+
1. Iframe을 통한 통합
23+
- Container App 에서 Micro App을 ifrmae 방식으로 표출
24+
2. Web-component를 통한 runtime 통합
25+
- Mricro App을 하나의 custom-element로 만들어 container app에서 runtime 환경에서 injection
26+
3. NGINX 통한 routing
27+
- NGINX에서 유입된 URL에 따라 표출할 HTML 결정
28+
- 단순한 routing 정도 수준이지만 각 app이 분리되어 개발, 배포돼있어야 하므로 MFA 방식 중 하나
29+
- 완전한 조각은 아님
30+
4. NPM 화를 통한 Build time 통합
31+
- 각 micro app들을 npm화 하여 container app에서 install 하여 이용
32+
- build time에 조합되기 때문에 각 조직간의 배포를 완전히 분리할 순 없다
33+
5. **Runtime JS, CSS injection**
34+
- build된 micro pp의 js를 container app에서 runtime에 다운로드하여 injection
35+
- 과도한 payload 크기가 단점
36+
37+
### MFA 구현 방법
38+
39+
1. Container app => component로 injection하기 위해서 manifest.json 파일을 요청
40+
2. css, js 위치를 담은 manifest.json 파일 응답
41+
3. 요청 후 bundling된 파일을 다운받은 후 container app에 injection
42+
4. constainer app과 micro app 모두 NPM Module 이용
43+
5. NPM Module => appName, renderFunction 필요
44+
6. function 실행 시 micro app object 생성됨
45+
7. render하는 시점에 render function 실행 micro app 실행
46+
8. unmount 시점에는 delete가 이뤄짐 (unmount callback stack push)
47+
=> cache time 이후 실행됨 (default: 5분)
48+
=> 중복된 static file download 막음
49+
9. 필요한 값을 props로 전달해서 mount하도록
50+
=> micro app이 존재하는지 확인 후
51+
=> 없다면 다운로드 후 injection
52+
10.
53+
54+
### MFA 장단점
55+
56+
* 장점
57+
* 업무 결합도 감소
58+
* ownership 증가
59+
* 컴포넌트 재사용성 증가
60+
* 단점
61+
* 과도한 payload 크기
62+
* 공통적으로 사용하는 library가 bundling된 js마다 존재하므로 payload 크기 과도
63+
* monolithic 보다 좋다하지만 과도함
64+
* 운영 복잡도 증가
65+
* micro app마다 다른 빌드, 배포 파이프라인을 갖고 있어야하므로 관리 포인트가 늘어남
66+
* CSS 오염 문제
67+
* Global window 공유
68+
* container에 injection 된 이후에 원인 debugging 하기 어려움
69+
70+
=> 얼마 되지 않은 기술로 여전히
71+
72+
## 마이크로 프론트엔드 실무에 쓸만할까?
73+
74+
### MFA 언제 필요한가?
75+
76+
* UX적으로 괜찮은가?
77+
* 배포 주기의 문제
78+
* dependency의 업데이트
79+
* 신규 기능은 필요한데 시간이 없어 리팩토링을 할 순 없었다
80+
81+
### HOW?
82+
83+
* 쪼개서 해야한다
84+
85+
* frontend는 티가나면 안된다
86+
* 부분부분 쪼개서 순차적으로
87+
88+
* 구조 분리
89+
90+
* NPM + webpack
91+
* pnpm + turborepo + vite![image-20221211215648659](https://user-images.githubusercontent.com/19357410/206906840-6b29d72e-05a9-4ff4-8dc6-0cb1242c86cb.png)
92+
93+
* 서버 사이드 라우팅
94+
95+
* **runtime** 시 통합한다
96+
97+
* 컨테이너
98+
99+
* 웹 컴포넌트 + 워크스페이스 환경 앱![image-20221211215826874](https://user-images.githubusercontent.com/19357410/206906842-7d0224d6-71b3-4bb5-8570-cbc194e3794f.png)
100+
101+
* 웹 컴포넌트
102+
103+
* 프레임워크로부터 독립적
104+
105+
* ```vue
106+
<work-container routes={devRoutes}>
107+
<WorkSpace/>
108+
</work-container>
109+
```
110+
111+
* => container
112+
113+
### 왜 이제 시작?
114+
115+
1. 속도
116+
117+
- 개발 속도
118+
119+
=> 사람이 많아진다면 좋다
120+
121+
- 로딩 속도
122+
123+
=> 불필요한
124+
125+
=> `관리자` 서비스이기 때문에 적절했다
126+
127+
2. 늙지 않는 코드
128+
129+
## 웹 반응성 개선하기
130+
131+
### 웹 성능이란
132+
133+
* 보통 로딩 속도를 얘기함 (로드 성능)
134+
135+
#### 성능 측정
136+
137+
1. Synthetic Monitoring
138+
2. Real User Monitoring
139+
3. 성능 개선 가이드, 지원
140+
141+
#### 페이지 로드 이후
142+
143+
* 로드 보다는 interaction이 중요해지고 있는 경우도 있음 (지도)
144+
145+
### 웹 반응성
146+
147+
![image-20221211220610914](https://user-images.githubusercontent.com/19357410/206906843-452ea5ea-24cf-4ac5-83ac-d96d1e52a465.png)
148+
149+
### 웹 반응성 지표
150+
151+
1. **TBT (Total Blocking Time)**
152+
- 모든 blocking time
153+
- Long Task: 메인 스레드에서 50ms 이상 실행되는 작업
154+
- Blocking Time: Long Task 중 50ms 를 제외한 메인 스레드 점유 시간
155+
- ![image-20221211220751416](https://user-images.githubusercontent.com/19357410/206906844-1ca32c68-605e-4657-a5d4-6023c56d698f.png)
156+
157+
2. INP (Interaction to Next Paint)
158+
- 사용자 입력에 대한 이전 event가 끝내는 시간 + event handler + dom에 반영되어 나타나는 시간
159+
- ![image-20221211220857174](https://user-images.githubusercontent.com/19357410/206906846-bb1ec01f-7bf5-4d7f-95f9-61495bc3e639.png)
160+
161+
3. CLS (Cumulative Layout Shift)
162+
- 예기치 않은 레이아웃 이동 점수
163+
164+
### 측정 방법
165+
166+
1. Lighthouse Userflow
167+
168+
- 기존 lighthouse
169+
170+
- Navigation
171+
172+
- 단일 페이지 로드 분석
173+
- LCP, Speed Index 와 같은 페이지 로드 성능 점수 제공
174+
- Performance, Accessibility, Best Practice, SEO, PWA 등 과 같은 카테고리
175+
176+
- Snapshot
177+
178+
- 사용자 인터렉션 이후 특정 상태의 페이지 분석
179+
- SPA나 복잡한 폼의 접근성 이슈 확인
180+
181+
- **Timespan**
182+
183+
- 임의의 시간동안 사용자 인터렉션 분석
184+
- 수명이 긴 페이지, SPA에서 성능 개선 포인트 제공
185+
186+
- ```javascript
187+
import puppeteer,lighthout;
188+
```
189+
190+
2. chrome에서 recorde하고 export (chrome devtools recoder)
191+
=> Puppeteer 등 자동화 도구로 확인 가능
192+
193+
### 웹 반응성 개선 사례
194+
195+
#### TBT 개선 사례
196+
197+
* 챗봇 주문
198+
* callstack 확인 시 강제 reflow가 발생되었음
199+
* Render: Javascript > Style > Layout > Paint > Composite
200+
* 개선되지 않은 element 의 style 을
201+
202+
#### INP 개선 사례
203+
204+
* WPM (Web Performance Monitoring)
205+
206+
* chart를 바꿨을 때
207+
208+
* 긴급 업데이트 (사용자가 직접)
209+
210+
* 전환 업데이트 (긴급하지 않은)
211+
212+
=> 사용자가 직접 변경한 부분을 우선 적용하고 그 이후에 전환하였음
213+
214+
#### CLS 개선 사례
215+
216+
* 카카오 페이 구매
217+
* 미리 영역에 height 값을 주었음 (반응형이면.. how..?)
218+
219+
> **요약**
220+
>
221+
> 1. 로드 성능은 여전히 중요하지만 반응성도 중요해진다.
222+
>
223+
> 2. Lighthouse userflow 로 측정
224+
>
225+
> 3. 반응성 지표별 개선 사례
226+
> - 블로킹 타임 발생시 강제 리플로우 확인
227+
> - 전체화면 업데이트 발생시 중요한 부분 우선 업데이트 진행
228+
> - 레이아웃 시프트는 간단한 작업만으로 쉽게 개선 가능
229+
230+
231+
### 참고
232+
* https://if.kakao.com/

0 commit comments

Comments
 (0)