프둬 λ©”μ‹œμ§€ μ›Ή 버전은 μ•ˆλ‚˜μ˜€λ‚˜μš”?

NaHCoH
  • #FrontEnd
  • #PoC
  • #Migration
  • #Fromm

λ“€μ–΄κ°€λ©°

β€œμ›Ή ν•˜λ‚˜λ‘œ λͺ¨λ“  ν”Œλž«νΌμ„ 컀버할 수 μžˆλ‹€λ©΄?” λ§Žμ€ νŒ€μ΄ ν•œ 번쯀 ν’ˆμ–΄λ³Έ 생각이싀 κ²λ‹ˆλ‹€. 저희 νŒ€λ„ λ§ˆμ°¬κ°€μ§€μ˜€μŠ΅λ‹ˆλ‹€. Kotlinκ³Ό Swift둜 각각 개발된 λ„€μ΄ν‹°λΈŒ μ±„νŒ… 앱을 μ›Ή λ²„μ „μœΌλ‘œ μΆœμ‹œν•˜κ³ , κΈ°μ‘΄ μ•±μ—λŠ” μ›Ήλ·°λ₯Ό μ”Œμš°λ©΄ 개발 λ¦¬μ†ŒμŠ€λ₯Ό 절반으둜 쀄일 수 μžˆμ§€ μ•Šμ„κΉŒ ν•˜λŠ” κΈ°λŒ€λ‘œ PoCλ₯Ό μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘ λΆ€ν„° λ§μ”€λ“œλ¦¬λ©΄, 프둬 λ©”μ‹œμ§€μ˜ μ›Ή μ „ν™˜μ„ μ§„ν–‰ν•˜μ§€ μ•ŠκΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

ν₯미둜운 점은, PoCλ₯Ό μ‹œμž‘ν•˜κΈ° μ „μ—λŠ” β€œμ„±λŠ₯이 κ°€μž₯ 큰 걸림돌이 λ˜μ§€ μ•Šμ„κΉŒβ€λΌκ³  μ˜ˆμƒν–ˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ›Ήλ·° μœ„μ—μ„œ μ±„νŒ… μ„œλΉ„μŠ€λ₯Ό 돌리면 λ„€μ΄ν‹°λΈŒ λŒ€λΉ„ 체감될 만큼 λŠλ¦¬μ§€ μ•Šμ„κΉŒ μš°λ €ν–ˆλŠ”λ°, 막상 ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•΄ λ³΄λ‹ˆ 일반적인 μ‚¬μš© νλ¦„μ—μ„œμ˜ λ°˜μ‘μ„±μ€ μ˜ˆμƒλ³΄λ‹€ μ€€μˆ˜ν–ˆμŠ΅λ‹ˆλ‹€. λ©”μ‹œμ§€ μ†‘μˆ˜μ‹ , 단건 λ Œλ”λ§ λ“± 기본적인 λ™μž‘μ€ λ„€μ΄ν‹°λΈŒμ™€ 비ꡐ해도 μ‹€μ‚¬μš©μ— μ§€μž₯이 μ—†λŠ” μˆ˜μ€€μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, λŒ€λŸ‰μ˜ λ©”μ‹œμ§€λ₯Ό λΉ λ₯΄κ²Œ νƒμƒ‰ν•˜λŠ” μƒν™©μ—μ„œλŠ” μ›Ή ν”Œλž«νΌμ˜ λ Œλ”λ§ ν•œκ³„κ°€ λ“œλŸ¬λ‚¬κ³ , μ΄λŠ” λ’€μ—μ„œ λ‹€λ£° 슀크둀 가상화 λ¬Έμ œμ™€ μ§κ²°λ©λ‹ˆλ‹€. 그리고 μ„±λŠ₯ 외에도 μ˜ˆμƒμΉ˜ λͺ»ν•œ κ³³μ—μ„œ λ¬Έμ œλ“€μ΄ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

이 κΈ€μ—μ„œλŠ” PoC κ³Όμ •μ—μ„œ 마주친 λ¬Έμ œλ“€κ³Ό 각각에 λŒ€ν•΄ κ²€ν† ν•œ ν•΄κ²° λ°©μ•ˆ, 그리고 μ΅œμ’…μ μœΌλ‘œ μ§„ν–‰ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν•œ 이유λ₯Ό κ³΅μœ ν•˜κ² μŠ΅λ‹ˆλ‹€.


1. λ°±κ·ΈλΌμš΄λ“œ 방치 μ‹œ λ©”μ‹œμ§€ 손싀

ν˜„μƒ

앱을 μ—΄μ–΄λ‘” μ±„λ‘œ μ•½ 30λΆ„κ°„ λ°±κ·ΈλΌμš΄λ“œ μƒνƒœλ₯Ό μœ μ§€ν•œ λ’€ λ³΅κ·€ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. Android와 iOS λͺ¨λ‘ λΈŒλΌμš°μ €(μ›Ήλ·°) μžμ²΄κ°€ μ’…λ£Œλ˜μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” κ·Έ μ΄ν›„μ˜€μŠ΅λ‹ˆλ‹€.

λ°±κ·ΈλΌμš΄λ“œλ‘œ λ‚΄λ €κ°„ μ‹œμ μ— μ±„νŒ… μ„œλ²„μ™€μ˜ λ„€νŠΈμ›Œν¬ 연결이 λŠκΈ°λŠ” κ²½μš°κ°€ μžˆμ—ˆκ³ , μ›Ήλ·°λ‘œ λ³΅κ·€ν•œ λ’€ μž¬μ—°κ²°μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€μ˜ 사이에 μˆ˜μ‹ λ˜μ–΄μ•Ό ν•  λ©”μ‹œμ§€κ°€ μœ μ‹€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

핡심 λ‚œμ œ

λ©”μ‹œμ§€ 손싀이 μ •ν™•νžˆ μ–Έμ œλΆ€ν„° λ°œμƒν–ˆλŠ”μ§€ ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œ μ•Œ 수 μ—†λ‹€λŠ” 점이 κ°€μž₯ 큰 λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. 연결이 끊긴 μ‹œμ μ„ μ •ν™•νžˆ νŠΉμ •ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ—, 볡ꡬ μ „λž΅μ€ β€œλ§ˆμ§€λ§‰μœΌλ‘œ ν™•μΈλœ λ©”μ‹œμ§€ μ΄ν›„μ˜ λͺ¨λ“  λ©”μ‹œμ§€λ₯Ό μ„œλ²„μ—μ„œ λ‹€μ‹œ κ°€μ Έμ˜€λŠ”β€ 방식이 될 μˆ˜λ°–μ— μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ μ•±μ—μ„œλŠ” OS 레벨의 λ°±κ·ΈλΌμš΄λ“œ 처리(Background Fetch, FCM/APNs λ“±)λ₯Ό ν™œμš©ν•˜μ—¬ μ—°κ²° μœ μ§€ λ˜λŠ” λΉ λ₯Έ 볡ꡬ가 κ°€λŠ₯ν•˜μ§€λ§Œ, μ›Ήλ·° ν™˜κ²½μ—μ„œλŠ” μ΄λŸ¬ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ 직접 ν™œμš©ν•  수 μ—†λ‹€λŠ” 근본적인 ν•œκ³„κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ–΄λŠ 방식이든 β€œμ—°κ²°μ΄ 끊긴 λ™μ•ˆμ˜ λ©”μ‹œμ§€λ₯Ό 사후에 λ³΅κ΅¬ν•œλ‹€β€λŠ” 접근이기 λ•Œλ¬Έμ—, λ„€μ΄ν‹°λΈŒμ²˜λŸΌ λ°±κ·ΈλΌμš΄λ“œμ—μ„œλ„ 연결을 μœ μ§€ν•˜λŠ” κ²ƒκ³ΌλŠ” 근본적인 차이가 있고 κ΅¬ν˜„ 방식에 따라 데이터가 μ˜€μ—Όλ  μ—¬μ§€κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

process

λ©”μ‹œμ§€ 손싀 λŒ€μ‘ ν”„λ‘œμ„ΈμŠ€


2. iOS ν‚€λ³΄λ“œμ™€ μ›Ήλ·° μ˜μ—­ 좩돌

ν˜„μƒ

iOSμ—μ„œλ§Œ λ°œμƒν•œ μ΄μŠˆμž…λ‹ˆλ‹€. μ±„νŒ… μž…λ ₯을 μœ„ν•΄ ν‚€λ³΄λ“œκ°€ 올라였면, ν‚€λ³΄λ“œ λ†’μ΄λ§ŒνΌ μ›Ήλ·° μ˜μ—­ 전체가 μœ„λ‘œ λ°€λ € μ˜¬λΌκ°€λ©΄μ„œ 상단 μ½˜ν…μΈ κ°€ ν™”λ©΄ λ°–μœΌλ‘œ μ‚¬λΌμ§€λŠ” ν˜„μƒμ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ μ•±μ—μ„œλŠ” ν‚€λ³΄λ“œ 이벀트λ₯Ό 직접 κ΅¬λ…ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒμ„ μ •λ°€ν•˜κ²Œ μ œμ–΄ν•  수 μžˆμ§€λ§Œ, μ›Ήλ·°μ—μ„œλŠ” λΈŒλΌμš°μ €κ°€ ν‚€λ³΄λ“œ 처리λ₯Ό 자체적으둜 μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ œμ–΄κ°€ κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€.

κ²€ν† ν•œ ν•΄κ²° λ°©μ•ˆ

Native Bridgeλ₯Ό 톡해 ν‚€λ³΄λ“œμ˜ 높이값을 μ›Ήλ·°λ‘œ 전달받아 CSS λ˜λŠ” JavaScriptμ—μ„œ 뷰포트 높이λ₯Ό μž¬κ³„μ‚°ν•˜λŠ” 방식을 κ²€ν† ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ‘ μ μœΌλ‘œλŠ” ν•΄κ²° κ°€λŠ₯ν•˜μ§€λ§Œ, ν‚€λ³΄λ“œ λ“±μž₯/퇴μž₯ μ• λ‹ˆλ©”μ΄μ…˜κ³Ό μ›Ήλ·°μ˜ λ¦¬μ‚¬μ΄μ¦ˆ 타이밍을 μ •ν™•νžˆ λ™κΈ°ν™”ν•˜λŠ” 것이 쉽지 μ•Šμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.


3. 쀑볡 둜그인 문제

ν˜„μƒ

κΈ°μ‘΄μ—λŠ” λ„€μ΄ν‹°λΈŒ μ•±μ—μ„œλ§Œ 둜그인이 κ°€λŠ₯ν–ˆκΈ°μ— 쀑볡 둜그인 μžμ²΄κ°€ ꡬ쑰적으둜 λΆˆκ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€. μ›Ή 버전이 μΆ”κ°€λ˜λ©΄ 동일 κ³„μ •μœΌλ‘œ μ•±κ³Ό 웹에 λ™μ‹œ 접근이 κ°€λŠ₯ν•΄μ§€λ©΄μ„œ 두 κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

첫째, 전솑 횟수 μ œν•œ μš°νšŒμž…λ‹ˆλ‹€. MQTTλ₯Ό ν†΅ν•œ λ©”μ‹œμ§€ 전솑 μ‹œ ν΄λΌμ΄μ–ΈνŠΈ λ‹¨μœ„λ‘œ κ±Έλ € 있던 μ΅œλŒ€ 전솑 횟수 μ œν•œμ„, 두 ν΄λΌμ΄μ–ΈνŠΈκ°€ 각각 μ†Œμ§„ν•˜μ—¬ 사싀상 μ œν•œμ„ μ΄ˆκ³Όν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄은 λ°±μ—”λ“œμ—μ„œ μœ μ € λ‹¨μœ„λ‘œ μ œν•œμ„ κ±°λŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²° κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

λ‘˜μ§Έ, MQTT clientId μΆ©λŒμž…λ‹ˆλ‹€. λ™μΌν•œ clientId둜 두 κ³³μ—μ„œ MQTT 연결을 μ‹œλ„ν•˜λ©΄, μ„œλ‘œ 연결을 λΉΌμ•—κΈ° μœ„ν•œ 경쟁(connection flapping)이 λ°œμƒν•˜μ—¬ λ©”μ‹œμ§€κ°€ μ–΄λŠ μͺ½μœΌλ‘œ 전달될지 μ˜ˆμΈ‘ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μœ μ €λ³„λ‘œ μ„œλ‘œ λ‹€λ₯Έ clientIdλ₯Ό λΆ€μ—¬ν•˜λŠ” 방식을 κ²€ν† ν–ˆμœΌλ‚˜, κΈ°μ‘΄ λ©”μ‹œμ§• 둜직 μ „λ°˜μ— λ―ΈμΉ˜λŠ” 영ν–₯을 ν™•μΈν•˜κΈ° μœ„ν•œ μΆ”κ°€ κ²€ν† κ°€ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

κ²€ν† ν•œ ν•΄κ²° λ°©μ•ˆ

λ°©μ•ˆμ„€λͺ…ν•œκ³„
μ„Έμ…˜ 기반 clientId 뢄리userId + deviceType μ‘°ν•©μœΌλ‘œ clientIdλ₯Ό μƒμ„±ν•˜μ—¬ μ•±κ³Ό 웹이 μ„œλ‘œ λ‹€λ₯Έ MQTT μ„Έμ…˜μ„ μœ μ§€κΈ°μ‘΄μ— β€œν•˜λ‚˜μ˜ μœ μ € = ν•˜λ‚˜μ˜ clientId”λ₯Ό μ „μ œλ‘œ μ„€κ³„λœ λ©”μ‹œμ§• 둜직 μ „λ°˜μ„ κ²€ν† ν•΄μ•Ό ν•˜λ©°, λ©”μ‹œμ§€ λΌμš°νŒ…, 읽음 처리, μƒνƒœ 동기화 등에 영ν–₯ λ²”μœ„κ°€ λ„“μŒ
ν›„μˆœμœ„ μ„Έμ…˜ κ°•μ œ μ’…λ£Œμƒˆλ‘œμš΄ 접속이 λ°œμƒν•˜λ©΄ κΈ°μ‘΄ μ„Έμ…˜μ„ λŠλŠ” λ°©μ‹μœΌλ‘œ λ™μ‹œ 접속 자체λ₯Ό μ°¨λ‹¨μ‚¬μš©μž κ²½ν—˜ μΈ‘λ©΄μ—μ„œ λΆˆνŽΈν•˜λ©°, μ›Ή 버전을 μΆœμ‹œν•˜λŠ” μ˜λ―Έκ°€ 반감됨

전솑 횟수 μ œν•œμ€ 비ꡐ적 κ°„λ‹¨νžˆ ν•΄κ²°ν•  수 μžˆμ—ˆμ§€λ§Œ, clientId 좩돌 λ¬Έμ œλŠ” κΈ°μ‘΄ μ•„ν‚€ν…μ²˜μ— λ―ΈμΉ˜λŠ” 영ν–₯이 μ»€μ„œ λ‹¨μˆœν•œ μˆ˜μ •μœΌλ‘œλŠ” ν•΄μ†Œν•˜κΈ° μ–΄λ €μ› μŠ΅λ‹ˆλ‹€.

μ„œλΉ„μŠ€ 운영 관점

기술적 이슈 외에도, μ›Ή 버전 μΆœμ‹œλ‘œ μ ‘κ·Ό κ²½λ‘œκ°€ λ‹€μ–‘ν•΄μ§€λ©΄μ„œ 동일 κ³„μ •μ˜ λ™μ‹œ 접속을 μ–΄λ–»κ²Œ 관리할 κ²ƒμΈκ°€λΌλŠ” μ„œλΉ„μŠ€ μ •μ±… μ°¨μ›μ˜ 고민이 μΆ”κ°€λ‘œ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. κΈ°μ‘΄μ—λŠ” μ•±μ΄λΌλŠ” 단일 μ±„λ„λ§Œ μ‘΄μž¬ν–ˆκΈ°μ— κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ λ˜μ—ˆλ˜ 뢀뢄이, μ›Ήμ΄λΌλŠ” 채널이 μ—΄λ¦¬λŠ” μˆœκ°„ μ„Έμ…˜ 관리 μ •μ±…, 이용 μ•½κ΄€, 과금 ꡬ쑰 λ“± μ—¬λŸ¬ μ˜μ—­μ— 영ν–₯을 미치게 λ©λ‹ˆλ‹€.


4. ν΄λΌμ΄μ–ΈνŠΈ μΊμ‹œμ˜ λΆˆμ•ˆμ •μ„±

ν˜„μƒ

λ„€μ΄ν‹°λΈŒ μ•±μ—μ„œλŠ” SQLite λ“± 기기의 둜컬 DB에 데이터λ₯Ό μΊμ‹±ν•˜μ—¬ μ•± μž¬μ‹œμž‘ μ‹œμ—λ„ 즉각적인 UI λ Œλ”λ§μ΄ κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€. 반면 μ›Ήλ·° ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λΈŒλΌμš°μ € μ €μž₯μ†Œ(IndexedDB, LocalStorage λ“±)λŠ” OS에 μ˜ν•΄ μ–Έμ œλ“  데이터가 μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 iOS Safari의 WebViewμ—μ„œλŠ” μ €μž₯μ†Œ 관리 정책이 μ—„κ²©ν•˜μ—¬ 이 λ¬Έμ œκ°€ λ”μš± λ‘λ“œλŸ¬μ‘ŒμŠ΅λ‹ˆλ‹€.

κ²€ν† ν•œ ν•΄κ²° λ°©μ•ˆ

λ°©μ•ˆμž₯점단점
λͺ¨λ“  데이터λ₯Ό API둜 μ „λ‹¬μΊμ‹œ μ˜μ‘΄μ„± 제거초기 λ‘œλ”© 속도 λŒ€ν­ ν•˜λ½, 검색/λ²ˆμ—­ λ“± κΈ°μ‘΄ μ˜€ν”„λΌμΈ κΈ°λŠ₯이 μ „λΆ€ API 호좜둜 μ „ν™˜ ν•„μš”
λ„€μ΄ν‹°λΈŒ μΊμ‹œ + Bridge 전달기쑴 캐싱 둜직 μœ μ§€ κ°€λŠ₯Bridge 전솑 μš©λŸ‰ μ œν•œμ— 걸릴 수 있음

μ–΄λŠ μͺ½μ΄λ“  λ„€μ΄ν‹°λΈŒ λŒ€λΉ„ μ‚¬μš©μž κ²½ν—˜μ˜ μ €ν•˜κ°€ λΆˆκ°€ν”Όν–ˆμŠ΅λ‹ˆλ‹€.


5. 슀크둀 κ°€μƒν™”μ˜ ν•œκ³„ β€” κ°€μž₯ 결정적인 이유

μ±„νŒ… μ„œλΉ„μŠ€μ˜ 핡심 UX 쀑 ν•˜λ‚˜λŠ” λŒ€λŸ‰μ˜ λ©”μ‹œμ§€ λͺ©λ‘μ„ μžμ—°μŠ€λŸ½κ²Œ μŠ€ν¬λ‘€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 수천, 수만 건의 λ©”μ‹œμ§€λ₯Ό λͺ¨λ‘ DOM에 올릴 수 μ—†μœΌλ―€λ‘œ 가상화(virtualization)λŠ” ν•„μˆ˜μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 그런데 이 가상화가 μ›Ή ν™˜κ²½μ—μ„œ μ±„νŒ… UX와 근본적으둜 μΆ©λŒν–ˆμŠ΅λ‹ˆλ‹€.

가상화 미적용 μ‹œ

λΉ λ₯΄κ²Œ μŠ€ν¬λ‘€ν•˜λ©΄ λ Œλ”λ§μ΄ 슀크둀 속도λ₯Ό λ”°λΌμž‘μ§€ λͺ»ν•΄ 빈 화면이 κ·ΈλŒ€λ‘œ λ…ΈμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

normal

가상화 미적용 β€” λΉ λ₯Έ 슀크둀 μ‹œ 빈 ν™”λ©΄ λ…ΈμΆœ

가상화 적용 β€” μ‹€μ‹œκ°„ 높이 계산

각 λ©”μ‹œμ§€ μ•„μ΄ν…œμ˜ 높이λ₯Ό 슀크둀 도쀑에 μ‹€μ‹œκ°„μœΌλ‘œ κ³„μ‚°ν•˜λ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 높이 μž¬κ³„μ‚°μ΄ 일어날 λ•Œλ§ˆλ‹€ 슀크둀 μœ„μΉ˜κ°€ λ³΄μ •λ˜λ©΄μ„œ, 슀크둀이 μ§€μ†μ μœΌλ‘œ λŠκΈ°λŠ” ν˜„μƒ(jank)이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

가상화 적용 β€” 슀크둀 μ’…λ£Œ μ‹œμ  높이 계산

슀크둀이 μ™„μ „νžˆ 멈좘 후에 높이λ₯Ό κ³„μ‚°ν•˜λ„λ‘ λ³€κ²½ν•˜μž 슀크둀 μžμ²΄λŠ” μžμ—°μŠ€λŸ¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 슀크둀 λ„μ€‘μ—λŠ” μΆ”μ •μΉ˜ 기반으둜 λ ˆμ΄μ•„μ›ƒμ΄ 작히기 λ•Œλ¬Έμ—, λ©”μ‹œμ§€κ°€ μ„œλ‘œ κ²ΉμΉ˜κ±°λ‚˜ λΉ„μ •μƒμ μœΌλ‘œ 큰 곡백이 λ°œμƒν•˜λŠ” ν˜„μƒμ΄ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

virtual

슀크둀 μ’…λ£Œ μ‹œμ  높이 계산 β€” λ©”μ‹œμ§€ κ²ΉμΉ¨ 및 곡백 ν˜„μƒ

μ™œ λ„€μ΄ν‹°λΈŒμ—μ„œλŠ” λ¬Έμ œκ°€ μ—†μ„κΉŒ

λ„€μ΄ν‹°λΈŒμ˜ LazyColumn(Android)μ΄λ‚˜ UICollectionView(iOS)λŠ” OS 레벨의 λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈκ³Ό κΈ΄λ°€ν•˜κ²Œ ν†΅ν•©λ˜μ–΄ μžˆμ–΄ 슀크둀 쀑에도 λ§€λ„λŸ¬μš΄ μ•„μ΄ν…œ μž¬ν™œμš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. μ›Ήμ˜ 가상 슀크둀 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ€ DOM μ‘°μž‘κ³Ό λΈŒλΌμš°μ € λ ˆμ΄μ•„μ›ƒ μ—”μ§„ μœ„μ—μ„œ 이λ₯Ό 흉내 λ‚΄λŠ” 것이기 λ•Œλ¬Έμ—, 특히 높이가 가변적인 μ±„νŒ… λ©”μ‹œμ§€μ—μ„œλŠ” λ„€μ΄ν‹°λΈŒ μˆ˜μ€€μ˜ 슀크둀 ν’ˆμ§ˆμ„ λ‹¬μ„±ν•˜κΈ° 극히 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” λ‹¨μˆœνžˆ β€œμ΅œμ ν™”λ₯Ό 더 ν•˜λ©΄ ν•΄κ²°λ˜λŠ”β€ μˆ˜μ€€μ΄ μ•„λ‹ˆλΌ, μ›Ή ν”Œλž«νΌμ˜ ꡬ쑰적 ν•œκ³„μ— κ°€κΉŒμ› μŠ΅λ‹ˆλ‹€.


κ²°λ‘ 

μ΄μŠˆν•΄κ²° κ°€λŠ₯μ„±λ„€μ΄ν‹°λΈŒ λŒ€λΉ„ UX ν’ˆμ§ˆ
λ°±κ·ΈλΌμš΄λ“œ λ©”μ‹œμ§€ 손싀볡ꡬ 둜직으둜 λŒ€μ‘ κ°€λŠ₯λ‹€μ†Œ λΆ€μ‘±
iOS ν‚€λ³΄λ“œ λ ˆμ΄μ•„μ›ƒBridge ν™œμš©μœΌλ‘œ λŒ€μ‘ κ°€λŠ₯동기화 이슈 μž”μ‘΄, μΆ”κ°€ κ²€ν†  ν•„μš”
쀑볡 λ‘œκ·ΈμΈλ°±μ—”λ“œ + ν΄λΌμ΄μ–ΈνŠΈ μΆ”κ°€ 개발 ν•„μš”μ„œλΉ„μŠ€ μ •μ±… μž¬μ„€κ³„ ν•„μš”
ν΄λΌμ΄μ–ΈνŠΈ μΊμ‹œλŒ€μ•ˆ μ‘΄μž¬ν•˜λ‚˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„ νΌν™•μ—°νžˆ λΆ€μ‘±
슀크둀 가상화ꡬ쑰적 ν•œκ³„κ²©μ°¨κ°€ 큼

κ°œλ³„ μ΄μŠˆλŠ” 각각 우회 방법이 μžˆμ—ˆμ§€λ§Œ, 이λ₯Ό λͺ¨λ‘ ν•©μ‚°ν–ˆμ„ λ•Œ λ„€μ΄ν‹°λΈŒ λŒ€λΉ„ μ‚¬μš©μž κ²½ν—˜μ˜ 격차가 ν—ˆμš© κ°€λŠ₯ν•œ μˆ˜μ€€μ„ λ„˜μ–΄μ„ λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. 특히 슀크둀 가상화 λ¬Έμ œλŠ” μ±„νŒ… μ„œλΉ„μŠ€μ˜ 핡심 κ²½ν—˜μ„ μ§μ ‘μ μœΌλ‘œ ν›Όμ†ν•˜λŠ” κ²ƒμ΄μ—ˆκΈ°μ—, 이λ₯Ό κ°μˆ˜ν•˜λ©΄μ„œκΉŒμ§€ μ›Ή μ „ν™˜μ„ μΆ”μ§„ν•  κ·Όκ±°κ°€ λΆ€μ‘±ν–ˆμŠ΅λ‹ˆλ‹€.

μ±„νŒ…μ²˜λŸΌ μ‹€μ‹œκ°„μ„±κ³Ό λŒ€λŸ‰ 데이터 λ Œλ”λ§μ΄ λ™μ‹œμ— μš”κ΅¬λ˜λŠ” μ„œλΉ„μŠ€μ—μ„œλŠ”, β€œν•˜λ‚˜μ˜ μ½”λ“œλ² μ΄μŠ€λ‘œ λͺ¨λ“  ν”Œλž«νΌμ„ μ»€λ²„ν•œλ‹€β€λŠ” 이상이 ν˜„μ‹€μ˜ 벽에 λΆ€λ”ͺ힐 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  μ›Ή κΈ°μˆ μ€ λΉ λ₯΄κ²Œ λ°œμ „ν•˜κ³  있고, λ―Έλž˜μ—λŠ” 이야기가 λ‹¬λΌμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ§€κΈˆ 이 μ‹œμ μ—μ„œ, 이 μ„œλΉ„μŠ€μ—λŠ” λ„€μ΄ν‹°λΈŒλ₯Ό μœ μ§€ν•˜λŠ” 것이 λ§žλ‹€λŠ” 결둠을 λ‚΄λ ΈμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ PoC 없이 λ³Έ κ°œλ°œμ— μ°©μˆ˜ν–ˆλ‹€λ©΄ μ–΄λ–»κ²Œ λ˜μ—ˆμ„κΉŒμš”. μ›Ήλ·° μ „ν™˜μ΄λΌλŠ” λ°©ν–₯을 ν™•μ •ν•˜κ³ , 섀계λ₯Ό 마치고, 상당 λΆ€λΆ„ κ΅¬ν˜„μ΄ μ§„ν–‰λœ 뒀에야 슀크둀 ν’ˆμ§ˆμ΄λ‚˜ λ°±κ·ΈλΌμš΄λ“œ λ©”μ‹œμ§€ 손싀 같은 문제λ₯Ό λ§ˆμ£Όν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. κ·Έ μ‹œμ μ—μ„œλŠ” 이미 νˆ¬μž…λœ λ¦¬μ†ŒμŠ€κ°€ 크기 λ•Œλ¬Έμ— β€œμ—¬κΈ°μ„œ λ©ˆμΆ”μžβ€λΌλŠ” νŒλ‹¨μ„ 내리기가 훨씬 μ–΄λ €μ›Œμ§‘λ‹ˆλ‹€. 문제λ₯Ό μ•Œλ©΄μ„œλ„ νƒ€ν˜‘ν•˜λ©° 끌고 κ°€κ±°λ‚˜, κ·Έλ™μ•ˆμ˜ μž‘μ—…μ„ μ „λΆ€ 폐기해야 ν•˜λŠ” 상황 β€” μ–΄λŠ μͺ½μ΄λ“  νŒ€μ—κ²ŒλŠ” 큰 뢀담이 λ©λ‹ˆλ‹€.

PoCλŠ” μ‹€νŒ¨κ°€ μ•„λ‹™λ‹ˆλ‹€. 적은 λΉ„μš©μœΌλ‘œ β€œν•˜μ§€ μ•Šμ•„μ•Ό ν•  것”을 ν™•μΈν•˜λŠ” 것, 그것 μžμ²΄κ°€ μ˜μ‚¬κ²°μ •μž…λ‹ˆλ‹€.


κ°μ‚¬μ˜ 말

이번 PoCλŠ” μ›Ή νŒ€ ν˜Όμžμ„œλŠ” μ§„ν–‰ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ°±κ·ΈλΌμš΄λ“œ λ™μž‘ ν…ŒμŠ€νŠΈ, ν‚€λ³΄λ“œ 이슈 μž¬ν˜„, Native Bridge 연동 κ²€ν†  λ“± 거의 λͺ¨λ“  κ³Όμ •μ—μ„œ Android와 iOS κ°œλ°œμžλΆ„λ“€μ΄ 적극적으둜 ν•¨κ»˜ν•΄ μ£Όμ…¨μŠ΅λ‹ˆλ‹€. λ„€μ΄ν‹°λΈŒ ν™˜κ²½μ˜ λ™μž‘ 원리λ₯Ό μ„€λͺ…ν•΄ μ£Όμ‹œκ³ , μ›Ήλ·° μœ„μ—μ„œ λ°œμƒν•˜λŠ” 이슈λ₯Ό 같이 λ””λ²„κΉ…ν•˜λ©°, λ•Œλ‘œλŠ” 직접 ν…ŒμŠ€νŠΈ λΉŒλ“œλ₯Ό λ§Œλ“€μ–΄ μ£Όμ‹œκΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€. 덕뢄에 짧은 κΈ°κ°„ μ•ˆμ— 의미 μžˆλŠ” 검증 κ²°κ³Όλ₯Ό 얻을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이 자리λ₯Ό 빌렀 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

← λͺ©λ‘μœΌλ‘œ λŒμ•„κ°€κΈ°

Art Changes Life

λ…Έλ¨ΈμŠ€μ™€ ν•¨κ»˜ μ—”ν„°ν…Œν¬ 산업을 ν˜μ‹ ν•΄λ‚˜κ°ˆ 멀버λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

μ±„μš© 쀑인 곡고 보기