|
| 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 |
| 92 | + |
| 93 | +* 서버 사이드 라우팅 |
| 94 | + |
| 95 | + * **runtime** 시 통합한다 |
| 96 | + |
| 97 | +* 컨테이너 |
| 98 | + |
| 99 | + * 웹 컴포넌트 + 워크스페이스 환경 앱 |
| 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 | + |
| 148 | +
|
| 149 | +### 웹 반응성 지표 |
| 150 | +
|
| 151 | +1. **TBT (Total Blocking Time)** |
| 152 | + - 모든 blocking time |
| 153 | + - Long Task: 메인 스레드에서 50ms 이상 실행되는 작업 |
| 154 | + - Blocking Time: Long Task 중 50ms 를 제외한 메인 스레드 점유 시간 |
| 155 | + -  |
| 156 | +
|
| 157 | +2. INP (Interaction to Next Paint) |
| 158 | + - 사용자 입력에 대한 이전 event가 끝내는 시간 + event handler + dom에 반영되어 나타나는 시간 |
| 159 | + -  |
| 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