SPA Alternative

Carson Gross

졜근 Tom MacWright은 μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(SPA)κ³Ό 그에 λ”°λ₯Έ 뢈만 사항듀에 λŒ€ν•΄ λͺ‡ 가지 글을 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€:

μ›Ή 개발의 μƒˆλ‘œμš΄ ν‘œμ€€μ€ React μ‹±κΈ€ νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜κ³  μ„œλ²„ λ Œλ”λ§μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ•„ν‚€ν…μ²˜μ˜ 두 가지 핡심 μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. μ£Όμš” UIλŠ” Reactλ‚˜ μœ μ‚¬ν•œ 것을 μ‚¬μš©ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ ꡬ좕 및 μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.
  2. λ°±μ—”λ“œλŠ” ν•΄λ‹Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μš”μ²­ν•˜λŠ” APIμž…λ‹ˆλ‹€.

이 μ•„μ΄λ””μ–΄λŠ” μ •λ§λ‘œ 인터넷을 νœ©μ“Έμ—ˆμŠ΅λ‹ˆλ‹€. λͺ‡λͺ‡ μ£Όμš” 인기 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ μ‹œμž‘λ˜μ–΄ λ§ˆμΌ€νŒ… μ‚¬μ΄νŠΈμ™€ λΈ”λ‘œκ·Έ 같은 κ³³κΉŒμ§€ μŠ€λ©°λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이 두 κΈ°μ‚¬μ—μ„œ Tom은 React/SPA μ „λ°©μœ„μ  사고방식과 κ΄€λ ¨λœ 문제λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. μš”μ•½ν•˜μžλ©΄, SPA ν”„λ ˆμž„μ›Œν¬λŠ” λ³΅μž‘ν•œ κ²½ν–₯이 있으며, λ§Žμ€ 경우 κ·Έ λ³΅μž‘μ„±μ— λΉ„ν•΄ μ–»λŠ” 이점이 크지 μ•Šλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

#λŒ€μ•ˆ

Tom은 두 번째 κΈ°μ‚¬μ—μ„œ SPA μ ‘κ·Ό 방식에 λŒ€ν•œ λͺ‡ 가지 λŒ€μ•ˆμ„ μ œμ‹œν•˜λ©°, κΈ°μ˜κ²Œλ„ htmxλ₯Ό μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ·ΈλŠ” htmx(그리고 Stimulus와 Alpine.js)λ₯Ό β€œμ μ§„μ  ν–₯상” 라이브러리둜 λΆ„λ₯˜ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 쒋은 μ„€λͺ…μ΄μ§€λ§Œ, 적어도 htmx의 경우, 이 μŠ€νƒ€μΌμ˜ 라이브러리λ₯Ό μ„€λͺ…ν•˜λŠ” 데 더 μ ν•©ν•œ μš©μ–΄κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€: HTML 쀑심 (λ˜λŠ”, ν•˜μ΄νΌν…μŠ€νŠΈ 쀑심)

#HTML 쀑심 개발

HTML 쀑심 κ°œλ°œμ—μ„œλŠ” HTML이 λ‹¨μˆœν•œ ν›„μˆœμœ„ μš”μ†Œκ°€ μ•„λ‹Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발의 μ£Όμš” 맀체둜 λ°›μ•„λ“€μ—¬μ§‘λ‹ˆλ‹€. μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ λͺ¨λΈκ³Ό 이λ₯Ό μ‘°μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 쀑심이 λ˜λŠ” λŒ€λΆ€λΆ„μ˜ SPA ν”„λ ˆμž„μ›Œν¬μ™€ λŒ€μ‘°λ©λ‹ˆλ‹€.

HTML 쀑심 κ°œλ°œμ€ μ›Ή μ•„ν‚€ν…μ²˜λ₯Ό μ„€λͺ…ν•œ Roy Fielding의 박사 ν•™μœ„ 논문에 κΈ°λ°˜μ„ 두고 μžˆμŠ΅λ‹ˆλ‹€. 특히, HTML을 ν•˜μ΄νΌν…μŠ€νŠΈλ‘œ μˆ˜μš©ν•¨μœΌλ‘œμ¨ REST와 HATEOAS의 이점을 얻을 수 있으며, 이 두 μ£Όμ œμ— λŒ€ν•΄ μ „λ¬Έκ°€κ°€ 될 ν•„μš”λ„ μ—†μŠ΅λ‹ˆλ‹€.

(참고둜, RoyλŠ” μ›Ή μ•„ν‚€ν…μ²˜λ₯Ό μ„€λͺ…ν•œ κ²ƒμ΄λ―€λ‘œ, μ›λž˜μ˜ 웹은 μ›λž˜ μ°Έμ—¬μžλ“€μ΄ νŠΉλ³„ν•œ λ…Έλ ₯을 κΈ°μšΈμ΄μ§€ μ•Šμ•˜μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  λŒ€μ²΄λ‘œ REST-ful ν–ˆμŠ΅λ‹ˆλ‹€)

HTML 쀑심 κ°œλ°œμ„ μ„ νƒν•˜λ©΄ λ§Žμ€ 이점을 μ–»κ²Œ λ©λ‹ˆλ‹€:

#HTML: 문제점

HTML 쀑심 λͺ¨λΈμ΄ μ œκ³΅ν•˜λŠ” λͺ¨λ“  이점에도 λΆˆκ΅¬ν•˜κ³ , λ§Žμ€ μ›Ή κ°œλ°œμžλ“€μ΄ μ™œ 이 λͺ¨λΈμ„ 버리고 μ’…μ’… μ‘°λ‘±ν•˜λŠ”μ§€ κΆκΈˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 이유λ₯Ό κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄:

HTML 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— λΉ„ν•΄ μ—­μ‚¬μ μœΌλ‘œ μ œν•œλœ μƒν˜Έμž‘μš©μ„ μ œκ³΅ν•΄μ™”μŠ΅λ‹ˆλ‹€.

이것은 HTML이 μ œν•œλœ ν•˜μ΄νΌν…μŠ€νŠΈμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 특히:

λ¬Όλ‘ , μ΄λŸ¬ν•œ μ œμ•½μ€ ν•˜μ΄νΌν…μŠ€νŠΈλΌλŠ” κ°œλ… μžμ²΄μ— λ‚΄μž¬λœ 것이 μ•„λ‹ˆλ©°, htmx의 λͺ©ν‘œλŠ” 이듀 μ œμ•½μ„ μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ œμ•½μ„ μ œκ±°ν•˜κ³  HTML을 μ™„μ „ν•˜κ³  κ°•λ ₯ν•œ ν•˜μ΄νΌν…μŠ€νŠΈλ‘œ μ™„μ„±ν•¨μœΌλ‘œμ¨, HTML 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ§Žμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ„λ©”μΈμ—μ„œ SPA와 κ²½μŸν•  수 있으며, λ™μ‹œμ— μ•žμ„œ μ–ΈκΈ‰ν•œ 기술적 이점과 λ³΅μž‘μ„± κ°μ†Œμ˜ 이점을 λˆ„λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

#기술적으둜 μš©κ°ν•΄μ§€κΈ°

Tom은 그의 첫 번째 글을 λ‹€μŒκ³Ό 같이 λ§ˆλ¬΄λ¦¬ν•©λ‹ˆλ‹€:

λͺ¨λ“  μ‚¬λžŒμ΄ ν‹€λ Έλ‹€λ©΄ μ–΄λ–¨κΉŒμš”? μš°λ¦¬λŠ” 이전에도 ν‹€λ Έμ—ˆμŠ΅λ‹ˆλ‹€.

μ›Ή κ°œλ°œμ€ μ—¬λŸ¬ 번 막닀λ₯Έ 길둜 λ“€μ–΄μ„°μŠ΅λ‹ˆλ‹€: GWT, Java Server Faces, Angular 1, FlatUI λ“±. μ΄λŸ¬ν•œ κΈ°μˆ λ“€μ— λŒ€ν•œ ν•˜μ΄ν”„ μ‚¬μ΄ν΄μ˜ μ ˆμ •κΈ°μ—λŠ” λŒ€μ„Έλ₯Ό 거슀λ₯΄κΈ°κ°€ 맀우 μ–΄λ €μ› μŠ΅λ‹ˆλ‹€. 특히 기술 μ„Έκ³„μ—μ„œλŠ” 기술적으둜 λ’€μ²˜μ§€λŠ” 것이 μžμ‘΄μ‹¬λΏλ§Œ μ•„λ‹ˆλΌ κ³ μš©μ— λŒ€ν•œ μœ„ν˜‘μ΄ 될 수 있기 λ•Œλ¬Έμ— λ”μš± μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

β€œReactλ₯Ό μ‚¬μš©ν•΄μ„œ ν•΄κ³ λœ μ‚¬λžŒμ€ 없닀”

λΌλŠ” 말은 μ˜€λŠ˜λ‚ μ˜

β€œIBM을 μ„ νƒν•΄μ„œ ν•΄κ³ λœ μ‚¬λžŒμ€ 없닀”

와도 κ°™μŠ΅λ‹ˆλ‹€.

React와 같은 기술이 μ˜€λŠ˜λ‚  개발되고 μžˆλŠ” λ§Žμ€ (λ˜λŠ” λŒ€λΆ€λΆ„μ˜) μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ ν•©ν•˜μ§€ μ•Šλ‹€κ³  λŠλ‚€λ‹€ ν•˜λ”λΌλ„, 이것은 μš°λ¦¬κ°€ λ°›μ•„λ“€μ—¬μ•Ό ν•  ν˜„μ‹€μž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ SPA μ ‘κ·Ό 방식에 λŒ€ν•œ μž¬κ³ κ°€ μ‹œμž‘λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•½κ°„μ˜ 기술적 μš©κΈ°μ™€ λŒ€μ„Έμ— λ§žμ„œλŠ” μ˜μ§€κ°€ μžˆλ‹€λ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 훨씬 덜 λ³΅μž‘ν•˜κ²Œ λ§Œλ“€κ³  개발 λ…Έλ ₯을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€κ°€ μ•„λ‹ˆλΌ 무엇을 ν•˜λŠ”μ§€μ— 집쀑할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

htmx 개발자 μŠ€νƒ€ν„° ν‚€νŠΈ:

What if?

</>