# [[Test Automation Pyramid]] ## πŸ“Œ Brief 마이크 μš”μ•½ Test Automation Pyramid(ν…ŒμŠ€νŠΈ μžλ™ν™” ν”ΌλΌλ―Έλ“œ)λŠ” μ†Œν”„νŠΈμ›¨μ–΄ ν…ŒμŠ€νŠΈλ₯Ό μž…λ„(Granularity)에 따라 μ—¬λŸ¬ κ³„μΈ΅μœΌλ‘œ κ·Έλ£Ήν™”ν•˜κ³ , 각 κ³„μΈ΅μ—μ„œ μ–Όλ§ˆλ‚˜ λ§Žμ€ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ‹œκ°μ μœΌλ‘œ λ‚˜νƒ€λ‚Έ λ©”νƒ€ν¬μž…λ‹ˆλ‹€ [1]. 이 원칙은 κ°€μž₯ λΉ λ₯΄κ³  독립적인 λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Tests)λ₯Ό ν”ΌλΌλ―Έλ“œμ˜ ν•˜λ‹¨μ— κ°€μž₯ 많이 λ°°μΉ˜ν•˜κ³ , μƒμœ„ μˆ˜μ€€μΈ 톡합 ν…ŒμŠ€νŠΈμ™€ μ—”λ“œ 투 μ—”λ“œ(E2E) ν…ŒμŠ€νŠΈλ‘œ 갈수둝 κ·Έ 수λ₯Ό 쀄일 것을 ꢌμž₯ν•©λ‹ˆλ‹€ [2, 3]. 이λ₯Ό 톡해 λ¦¬νŒ©ν† λ§κ³Ό 같은 μ½”λ“œ ꡬ쑰 λ³€κ²½ μ‹œ 즉각적이고 μ‹ λ’°ν•  수 μžˆλŠ” ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜λŠ” λΉ λ₯΄κ³  μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€ [3, 4]. ## πŸ“– Core Content * **κ°œλ…μ˜ 기원 및 κΈ°λ³Έ 원칙:** 마이크 콘(Mike Cohn)이 κ³ μ•ˆν•œ 이 κ°œλ…μ€ ν…ŒμŠ€νŠΈλ₯Ό λ‹€μ–‘ν•œ μž…λ„λ‘œ μž‘μ„±ν•˜λ˜, μƒμœ„ μˆ˜μ€€(High-level)으둜 갈수둝 ν…ŒμŠ€νŠΈμ˜ 수λ₯Ό 적게 μœ μ§€ν•˜λΌλŠ” 두 κ°€μ§€ 핡심 원칙을 μ œμ‹œν•©λ‹ˆλ‹€ [1, 3]. * **λ‹¨μœ„ ν…ŒμŠ€νŠΈ (Unit Tests - ν”ΌλΌλ―Έλ“œ ν•˜λ‹¨):** 전체 μžλ™ν™” ν…ŒμŠ€νŠΈμ˜ μ•½ 70%λ₯Ό μ°¨μ§€ν•΄μ•Ό ν•˜λŠ” 기반 κ³„μΈ΅μž…λ‹ˆλ‹€ [5]. λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ 맀우 λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜λ©°, κ°œλ³„ μ»΄ν¬λ„ŒνŠΈλ‚˜ ν•¨μˆ˜ μˆ˜μ€€μ˜ λ™μž‘μ„ κ²©λ¦¬ν•˜μ—¬ κ²€μ¦ν•©λ‹ˆλ‹€ [5]. λ¦¬νŒ©ν† λ§ 쀑 μ‹€μˆ˜κ°€ λ°œμƒν–ˆμ„ λ•Œ κ°€μž₯ λΉ λ₯΄κ³  μ •ν™•ν•œ ν”Όλ“œλ°± 루프λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€ [4, 6]. * **톡합 ν…ŒμŠ€νŠΈ (Integration Tests - ν”ΌλΌλ―Έλ“œ 쀑간):** μ•½ 20%λ₯Ό μ°¨μ§€ν•˜λ©°, λ‹¨μœ„ ν…ŒμŠ€νŠΈλ‘œλŠ” μž‘μ„ 수 μ—†λŠ” μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ μƒν˜Έμž‘μš©(λ°μ΄ν„°λ² μ΄μŠ€, μ™ΈλΆ€ API λ“±)의 결함을 μ°Ύμ•„λƒ…λ‹ˆλ‹€ [7-9]. * **μ—”λ“œ 투 μ—”λ“œ ν…ŒμŠ€νŠΈ (End-to-End Tests - ν”ΌλΌλ―Έλ“œ 상단):** 10% μ •λ„λ‘œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [10]. μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λΆ€ν„° λ°±μ—”λ“œ μ„œλΉ„μŠ€κΉŒμ§€ 전체 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‹€μ œ μ‚¬μš©μž 여정에 맞좰 κ²€μ¦ν•˜μ§€λ§Œ, ꡬ좕 λΉ„μš©μ΄ κ°€μž₯ λΉ„μ‹Έκ³ , μ‹€ν–‰ 속도가 맀우 느리며, μœ μ§€λ³΄μˆ˜κ°€ κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€(brittle) [4, 10]. * **ν…ŒμŠ€νŠΈ 쀑볡 μ œκ±°μ™€ ν•˜ν–₯ 이동 (Push Tests Down):** ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈμ˜ λΉ„λŒ€ν™”λ₯Ό 막기 μœ„ν•΄, μƒμœ„ μˆ˜μ€€ ν…ŒμŠ€νŠΈμ—μ„œ 였λ₯˜λ₯Ό λ°œκ²¬ν–ˆλŠ”λ° ν•˜μœ„ μˆ˜μ€€ ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ°˜λ“œμ‹œ ν•˜μœ„ μˆ˜μ€€(λ‹¨μœ„ ν…ŒμŠ€νŠΈ λ“±)에 ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [11]. κ°€λŠ₯ν•œ ν•œ λͺ¨λ“  ν…ŒμŠ€νŠΈλŠ” ν”ΌλΌλ―Έλ“œμ˜ κ°€μž₯ μ•„λž˜ κ³„μΈ΅μ—μ„œ κ²€μ¦ν•˜λ„λ‘ 내렀보내야 ν•©λ‹ˆλ‹€ [11]. ## βš–οΈ Trade-offs & Caveats * **μ—­ ν”ΌλΌλ―Έλ“œ 및 μ•„μ΄μŠ€ν¬λ¦Ό 콘 μ•ˆν‹° νŒ¨ν„΄ (Inverted Pyramid / Ice-Cream Cone):** UI 기반의 E2E ν…ŒμŠ€νŠΈ μœ„μ£Όλ‘œ ν•˜ν–₯식(Top-down) μžλ™ν™”λ₯Ό μ‹œλ„ν•˜λ©΄ 'μ—­ ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ'κ°€ ν˜•μ„±λ©λ‹ˆλ‹€ [3, 10]. 이 경우 ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ 싀행에 수 μ‹œκ°„μ΄ 걸리고 κ±°μ§“ μ‹€νŒ¨(False failures)κ°€ μž¦μ•„μ Έ, νŒ€μ΄ μžλ™ν™” ν…ŒμŠ€νŠΈλ₯Ό λΆˆμ‹ ν•˜κ³  κ²°κ³Όλ₯Ό λ¬΄μ‹œν•˜κ²Œ λ˜λŠ” λΆ€μž‘μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€ [10, 12]. * **계측 λͺ…μΉ­μ˜ λͺ¨ν˜Έμ„±κ³Ό μ‹œλŒ€μ  ν•œκ³„:** 원본 ν”ΌλΌλ―Έλ“œκ°€ μ œμ‹œν•œ 'Service Test'λ‚˜ 'UI Test'λΌλŠ” λͺ…칭은 ν˜„λŒ€ 개발 ν™˜κ²½(예: React, Angular λ“± SPA ν”„λ ˆμž„μ›Œν¬)μ—μ„œλŠ” μ˜€ν•΄λ₯Ό μ‚΄ 수 μžˆμŠ΅λ‹ˆλ‹€ [3]. SPA ν™˜κ²½μ—μ„œλŠ” UI μžμ²΄λ„ μ΅œμƒλ‹¨μ΄ μ•„λ‹Œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μˆ˜μ€€μ—μ„œ 검증할 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [3]. * **μ‹ λ’°μ„±κ³Ό μ‹€ν–‰ μ†λ„μ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„:** ν”ΌλΌλ―Έλ“œ μƒλ‹¨μœΌλ‘œ 갈수둝 μ‚¬μš©μžμ˜ μ‹€μ œ μ‚¬μš© ν™˜κ²½κ³Ό μœ μ‚¬ν•΄μ Έ λΉ„μ¦ˆλ‹ˆμŠ€μ  ν™•μ‹ (Confidence)은 λ†’μ•„μ§€μ§€λ§Œ, μ‹€ν–‰ μ‹œκ°„(Speed)κ³Ό μœ μ§€λ³΄μˆ˜(Maintainability) λΉ„μš©μ΄ κΈ‰μ¦ν•©λ‹ˆλ‹€ [10, 13]. λ”°λΌμ„œ 컀버리지, 속도, μ‹ λ’°μ„±μ˜ κ· ν˜•μ„ μ‹œμŠ€ν…œ 전체 κ΄€μ μ—μ„œ μ‘°μœ¨ν•΄μ•Ό ν•©λ‹ˆλ‹€ [14]. ## πŸ”— Knowledge Connections ### Related Concepts #### [κ΅¬ν˜„/ν…ŒμŠ€νŠΈ μ „λž΅] - [[λ‹¨μœ„ ν…ŒμŠ€νŠΈ (Unit Tests)]] - μ—°κ²° 이유: ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ˜ 근간을 이루며 전체 ν…ŒμŠ€νŠΈμ˜ λŒ€λ‹€μˆ˜λ₯Ό μ°¨μ§€ν•˜λŠ” 핡심 μš”μ†Œμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [5, 15]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ¦¬νŒ©ν† λ§ μ§„ν–‰ μ‹œ κΈ°μ‘΄ κΈ°λŠ₯이 κΉ¨μ§€μ§€ μ•Šμ•˜μŒμ„ λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ 확인해 μ£ΌλŠ” κ°€μž₯ κ°•λ ₯ν•œ 'μ•ˆμ „λ§'의 역할을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [4]. - [[ν…ŒμŠ€νŠΈ 주도 개발 (TDD)]] - μ—°κ²° 이유: ν”ΌλΌλ―Έλ“œ ν•˜λ‹¨μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” μ£Όμš” 기법(Red-Green-Refactor)으둜, λ¦¬νŒ©ν† λ§μ˜ ν•„μˆ˜ μ „μ œ 쑰건이기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [5, 16]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μž‘μ„±ν•˜μ—¬ μ†Œν”„νŠΈμ›¨μ–΄μ˜ λ™μž‘μ„ λ³΄ν˜Έν•˜κ³ , 이후 λ¦¬νŒ©ν† λ§μ„ 톡해 μ½”λ“œμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό μ•ˆμ „ν•˜κ²Œ κ°œμ„ ν•˜λŠ” 흐름을 배울 수 μžˆμŠ΅λ‹ˆλ‹€ [16, 17]. #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[지속적 톡합 (CI) 및 지속적 배포 (CD)]] - μ—°κ²° 이유: ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œκ°€ μ˜¬λ°”λ₯΄κ²Œ κ΅¬μΆ•λ˜μ–΄μ•Ό CI/CD νŒŒμ΄ν”„λΌμΈμ—μ„œ 병λͺ© 없이 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ§€μ†μ μœΌλ‘œ 배포할 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [2, 18, 19]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ¦¬νŒ©ν† λ§ ν›„ μ½”λ“œκ°€ 컀밋될 λ•Œλ§ˆλ‹€ λΉ λ₯Έ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜μ—¬, 지속 κ°€λŠ₯ν•œ μ• μžμΌ 개발과 DevOps λ¬Έν™”λ₯Ό μœ μ§€ν•˜λŠ” μ•„ν‚€ν…μ²˜μ  κΈ°λ°˜μ„ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [6, 19]. - [[λ ˆκ±°μ‹œ μ½”λ“œ (Legacy Code)]] - μ—°κ²° 이유: "ν…ŒμŠ€νŠΈκ°€ μ—†λŠ” μ½”λ“œ"둜 μ •μ˜λ˜λŠ” λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό μ•ˆμ „ν•˜κ²Œ λ¦¬νŒ©ν† λ§ν•˜λ €λ©΄, μ μ§„μ μœΌλ‘œ ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œλ₯Ό ꡬ좕해야 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ [20, 21]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ˜μ‘΄μ„±μ΄ κ°•ν•˜κ²Œ κ²°ν•©λœ μ½”λ“œμ—μ„œ '접점(Seams)'을 μ°Ύμ•„λ‚΄μ–΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜κ³ , λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•  수 μžˆλŠ” μƒνƒœλ‘œ λ§Œλ“œλŠ” 기법을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [22, 23]. ### Deeper Research Questions - ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈμ˜ κ²½κ³„λŠ” μ–΄λ–»κ²Œ μ •μ˜λ˜λ©°, ν…ŒμŠ€νŠΈ λŒ€μ—­(Mock, Stub)을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ •ν™•ν•œ κΈ°μ€€κ³Ό λ²”μœ„λŠ” 무엇인가? - UI 및 E2E ν…ŒμŠ€νŠΈμ— νŽΈμ€‘λœ 'μ—­ ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ(μ•„μ΄μŠ€ν¬λ¦Ό 콘)' ν˜•νƒœμ˜ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμ„ 정상적인 ν”ΌλΌλ―Έλ“œ ꡬ쑰둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜κΈ° μœ„ν•œ 점진적 μ „λž΅μ€ 무엇인가? - SPA(Single Page Application) 및 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜ ν™˜κ²½μ—μ„œ κΈ°μ‘΄ ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ˜ 계측(Service, UI) κ°œλ…μ€ μ–΄λ–»κ²Œ ν˜„λŒ€μ μœΌλ‘œ μž¬ν•΄μ„λ˜μ–΄μ•Ό ν•˜λŠ”κ°€? - λ¦¬νŒ©ν† λ§ μ‹œ μƒμœ„ μˆ˜μ€€(E2E) ν…ŒμŠ€νŠΈλŠ” ν†΅κ³Όν•˜μ§€λ§Œ ν•˜μœ„ μˆ˜μ€€(Unit) ν…ŒμŠ€νŠΈλ§Œ κΉ¨μ§€λŠ” 경우, 이λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜κ³  ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό μž¬κ΅¬μ„±ν•΄μ•Ό ν•˜λŠ”κ°€? - 계약 ν…ŒμŠ€νŠΈ(Consumer-Driven Contract Tests)λŠ” ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œμ˜ μ–΄λŠ 계측에 μœ„μΉ˜ν•˜λ©°, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„μ˜ 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ–΄λ–»κ²Œ 효율적으둜 λŒ€μ²΄ν•˜κ±°λ‚˜ λ³΄μ™„ν•˜λŠ”κ°€? ### Practical Application Contexts - **Implementation:** κ°œλ°œμžλŠ” μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•  λ•Œ, TDDλ₯Ό ν™œμš©ν•˜μ—¬ λΉ λ₯΄κ³  고립된 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ΅œμš°μ„ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€ [5]. - **System Design:** μ•„ν‚€ν…μ²˜ 섀계 μ‹œ 각 μ»΄ν¬λ„ŒνŠΈκ°€ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈλ  수 μžˆλ„λ‘ μ˜μ‘΄μ„± 뢄리(Decoupling)λ₯Ό κ³ λ €ν•˜μ—¬ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±μ΄ μš©μ΄ν•œ λͺ¨λ“ˆμ‹ ꡬ쑰λ₯Ό 섀계해야 ν•©λ‹ˆλ‹€ [24]. - **Operation / Maintenance:** CI νŒŒμ΄ν”„λΌμΈμ˜ μ‹€ν–‰ 속도λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“  E2E ν…ŒμŠ€νŠΈ 비쀑은 μ΅œμ†Œν™”ν•˜κ³ , λ‹¨μœ„ 및 톡합 ν…ŒμŠ€νŠΈ μ€‘μ‹¬μœΌλ‘œ νšŒκ·€ 버그λ₯Ό νƒμ§€ν•˜λŠ” 운영 ν”„λ‘œμ„ΈμŠ€λ₯Ό 확립해야 ν•©λ‹ˆλ‹€ [5, 10, 19]. - **Learning Path:** TDD 및 Mocking ν”„λ ˆμž„μ›Œν¬ ν•™μŠ΅ -> λ‹¨μœ„ 및 톡합 ν…ŒμŠ€νŠΈ ꡬ좕 방법 μŠ΅λ“ -> ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ 원리에 λ”°λ₯Έ ν…ŒμŠ€νŠΈ 포트폴리였 μ΅œμ ν™” -> CI νŒŒμ΄ν”„λΌμΈ 톡합 및 μ•ˆμ „ν•œ λ¦¬νŒ©ν† λ§ μ‹€μŠ΅ 순으둜 μ—­λŸ‰μ„ ν‚€μ›Œλ‚˜κ°‘λ‹ˆλ‹€. - **My Project Relevance:** ν˜„μž¬ μ§„ν–‰ 쀑인 ν”„λ‘œμ νŠΈκ°€ 느리고 κΉ¨μ§€κΈ° μ‰¬μš΄ E2E ν…ŒμŠ€νŠΈμ—λ§Œ μ˜μ‘΄ν•˜κ³  μžˆμ§€ μ•Šμ€μ§€ μ κ²€ν•˜κ³ , λ¦¬νŒ©ν† λ§μ„ 두렀움 없이 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•˜μœ„ μˆ˜μ€€μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό λ‘ν…κ²Œ ν™•λ³΄ν•˜λŠ” λ¦¬νŒ©ν† λ§ μ „λž΅μ˜ 핡심 근거둜 ν™œμš©λ©λ‹ˆλ‹€. ### Adjacent Topics - [[μ†ŒλΉ„μž 주도 계약 ν…ŒμŠ€νŠΈ (Consumer-Driven Contract Tests, CDC)]] - ν™•μž₯ λ°©ν–₯: λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν™˜κ²½μ—μ„œ 톡합 ν…ŒμŠ€νŠΈμ˜ λΉ„μš©μ„ 쀄이고, μ„œλΉ„μŠ€ κ°„ API μΈν„°νŽ˜μ΄μŠ€(계약)κ°€ κΉ¨μ§€μ§€ μ•Šμ•˜λŠ”μ§€ λ…λ¦½μ μœΌλ‘œ κ²€μ¦ν•˜λŠ” κΈ°λ²•μœΌλ‘œ ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ μ „λž΅μ„ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [25, 26]. --- *Last updated: 2026-05-03*