Node.js(Express.js) VS. Spring

μš©κ°€λ¦¬πŸ‰Β·2024λ…„ 1μ›” 12일
0

기타

λͺ©λ‘ 보기
2/5
post-thumbnail

πŸ“£ 듀어가기에 μ•žμ„œ, Node.jsλŠ” Runtime ν™˜κ²½μ΄κ³ , Springκ³Ό Spring bootλŠ” Frameworkμ΄λ―€λ‘œ λ‘˜μ„ λΉ„κ΅ν•˜λŠ” 것은 λ§žμ§€ μ•Šμ„ 수 μžˆμœΌλ‚˜, ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©° 생긴 μˆœμˆ˜ν•œ ꢁ금증으둜 λ‘˜μ„ λΉ„κ΅ν•΄λ³΄κ³ μž ν•œλ‹€.

(만일 μ˜³μ§€ μ•Šμ€ 정보가 μžˆκ±°λ‚˜ 더 μ•Œλ €μ£Όκ³  싢은 정보가 μžˆμœΌμ‹œλ‹€λ©΄ λŒ“κΈ€ λ‹¬μ•„μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ™‡β€β™€οΈ)

인용처리 λ˜μ–΄μžˆλŠ” 글듀은 μ„€λͺ… 쀑에 λ‚˜μ˜€λŠ” κ°œλ…λ“€μ„ 정리해둔 κ²ƒμž…λ‹ˆλ‹€.

Runtime ν™˜κ²½

  • Runtime: ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”ν•œ μ‹œμŠ€ν…œ μžμ›(RAM, μ‹œμŠ€ν…œ λ³€μˆ˜, ν™˜κ²½λ³€μˆ˜ λ“±)을 ν• λ‹Ήλ°›κ³  μ‹€μ œλ‘œ μ‹œμŠ€ν…œ μžμ›μ„ μ‚¬μš©ν•΄μ„œ μ–΄λ– ν•œ 처리λ₯Ό ν•˜κ³  μžˆλŠ” μƒνƒœ
  • Runtime ν™˜κ²½: Runtime이 μΌμ–΄λ‚˜κΈ° μœ„ν•΄(ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ μ‹œμŠ€ν…œ μžμ›μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄) μ‹œμŠ€ν…œ μžμ›μ— μ—‘μ„ΈμŠ€ ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μ‹€ν–‰ ν™˜κ²½
    • 운영체제 μžμ²΄μ— μ†ν•˜λŠ” κ²½μš°λ„ 있고, μš΄μ˜μ²΄μ œμ—μ„œ μž‘λ™ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λœ»ν•  μˆ˜λ„ 있음

β†’ Runtime ν™˜κ²½μ€ μ½”λ“œκ°€ λ™μž‘ν•˜λŠ” ν™˜κ²½μ„ κ°–μΆ˜ 것, FrameworkλŠ” μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μˆ˜μ •ν•˜κ³  μž‘μ„±ν• μ§€μ— λŒ€ν•œ 일련의 κ·œμΉ™κ³Ό ꡬ쑰

μ—„μ—°νžˆ λ‘˜μ„ μ œλŒ€λ‘œ(?) λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” Node.js의 μ‚¬μ‹€μƒμ˜ ν‘œμ€€ μ„œλ²„ ν”„λ ˆμž„μ›Œν¬λ‘œ λΆˆλ¦¬λŠ” Express.js둜 μ λŠ” 것이 μ˜³λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ, λŒ€λ‹€μˆ˜μ˜ μžλ£Œμ—μ„œ λ‘˜μ„ ν˜Όμž¬ν•˜μ—¬ (Node.js + Express.js) μ‚¬μš©ν•˜λ―€λ‘œ 본인은 νŽΈμ˜μ„±μ„ μœ„ν•΄ Node.js둜 ν†΅μΌν•˜μ—¬ μ‚¬μš©

Thread의 차이

μœ„μ™€ 같은 Node.js의 νŠΉμ§•μ€ λ‹¨μ μ΄μž μž₯점이 될 수 μžˆλ‹€. (일단, λͺ…ν™•νžˆ 짚고 λ„˜μ–΄κ°ˆ 것은 μ €λŸ¬ν•œ Node.js의 ν™˜κ²½μ€ Spring Thread에 λΉ„ν•΄ μž‘κ³  λŠλ¦¬λ‹€λŠ” 것)

  • Node.js의 νŠΉμ§•μœΌλ‘œ 써놓은 'Single Thread 이벀트 루프 λͺ¨λΈμ„ 기반'을 κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄, Single Thread 'μ„œλ²„μ²˜λŸΌ' μž‘λ™ν•œλ‹€λŠ” 것이닀.
  • 즉, λͺ¨λ“  μš”μ²­μ„ ν•˜λ‚˜μ˜ Thread둜 μ²˜λ¦¬ν•œλ‹€λŠ” 의미이고, μ΄λŠ” μ—¬λŸ¬ 개의 μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” (Http μš”μ²­μ„ λ³„λ„μ˜ Threadμ—μ„œ μ²˜λ¦¬ν•¨) Springκ³Ό λΉ„κ΅ν•˜μ—¬ μ„œλ²„μ˜ 응닡성이 λ–¨μ–΄μ§„λ‹€λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€.
    • ex) νŠΉμ • μš”μ²­μ— λŒ€ν•œ μ²˜λ¦¬κ°€ 5초라면, Spring μ„œλ²„λŠ” μƒˆλ‘œμš΄ Threadλ₯Ό λ§Œλ“€μ–΄ λ°”λ‘œ λ‹€λ₯Έ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆμ§€λ§Œ, Node.js μ„œλ²„λŠ” μƒˆλ‘œμš΄ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ°κΉŒμ§€ 5초λ₯Ό κΈ°λ‹€λ €μ•Ό ν•œλ‹€.
  • μœ μ‚¬ Single Thread ꡬ쑰λ₯Ό 가진 Node.jsλŠ” CPU μ½”μ–΄ μˆ˜κ°€ 아무리 λ§Žμ•„λ„ 이벀트 루프가 Single Threadμ΄λ―€λ‘œ κ°•λ ₯ν•œ μ„œλ²„μ— μ„€μΉ˜λ˜μ—ˆλ”λΌλ„ μ„œλ²„μ˜ μ„±λŠ₯을 100% ν™œμš©ν•  수 μ—†λ‹€.
    • 동일 처리 μ‹œ, μˆ˜ν–‰ μ‹œκ°„μ„ λΉ„κ΅ν•œ κ·Έλž˜ν”„. CPU 연산이 λ§Žμ„μˆ˜λ‘ Node.js의 처리 μˆ˜ν–‰ μ‹œκ°„μ΄ κΈ‰κ²©νžˆ μ¦κ°€ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

Thread

  • ν”„λ‘œμ„ΈμŠ€(μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨. λ””μŠ€ν¬λ‘œλΆ€ν„° λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄ CPU의 할당을 받을 수 μžˆλŠ” 것)의 μ‹€ν–‰ λ‹¨μœ„
  • ν•œ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ™μž‘λ˜λŠ” μ—¬λŸ¬ μ‹€ν–‰μ˜ 흐름
    • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ½”λ“œ, 데이터, 파일과 같은 운영체제 μžμ› 곡유 κ°€λŠ₯
  • κ΅¬μ„±μš”μ†Œ : Thread ID, register set(PC 포함), μŠ€νƒ
    • PC(Program Counter) : Threadκ°€ λͺ…λ Ήμ–΄μ˜ μ–΄λ””κΉŒμ§€ μˆ˜ν–‰ν•˜μ˜€λŠ”μ§€ λ‚˜νƒ€λƒ„. ThreadλŠ” CPUλ₯Ό ν• λ‹Ή λ°›μ•˜λ‹€κ°€ μŠ€μΌ€μ€„λŸ¬μ— μ˜ν•΄ λ‹€μ‹œ μ„ μ λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— λͺ…λ Ήμ–΄κ°€ μ—°μ†μ μœΌλ‘œ μˆ˜ν–‰λ˜μ§€ λͺ»ν•˜κ³ , μ–΄λŠ λΆ€λΆ„κΉŒμ§€ μˆ˜ν–‰ν–ˆλŠ”μ§€ κΈ°μ–΅ν•΄μ•Όν•  ν•„μš”κ°€ 있음.
    • μŠ€νƒ : ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” 인자, λ˜λŒμ•„κ°ˆ μ£Όμ†Œκ°’ 및 ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•˜λŠ” λ³€μˆ˜ 등을 μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간
      • μŠ€νƒ λ©”λͺ¨λ¦¬ 곡간이 λ…λ¦½μ μ΄λΌλŠ” 것은 독립적인 ν•¨μˆ˜ 호좜이 κ°€λŠ₯ν•˜λ‹€λŠ” 것 β†’ 독립적인 μ‹€ν–‰ 흐름 β†’ Thread의 μ •μ˜μ— 따라 독립적인 μ‹€ν–‰ 흐름을 μΆ”κ°€ν•˜κΈ° μœ„ν•œ μ΅œμ†Œ 쑰건으둜 λ…λ¦½λœ μŠ€νƒμ„ 할당함.

CPU ν• λ‹Ή

  • ν”„λ‘œμ νŠΈμ— μ§€μ •λ˜λŠ” μ‹œμŠ€ν…œμ˜ CPU λ¦¬μ†ŒμŠ€ 양을 μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ¨.
  • λ‹€λ₯Έ μž‘μ—… λΆ€ν•˜μ— λŒ€ν•œ ν•΄λ‹Ή μž‘μ—… λΆ€ν•˜μ˜ μƒλŒ€μ  μ€‘μš”μ„±μ„ μ •μ˜ν•˜λŠ”λ° μ‚¬μš©λ¨.

μ΄λŸ¬ν•œ 점만 보면 κ½€λ‚˜ 규λͺ¨ μžˆλŠ” μž‘μ—…μ—μ„œλŠ” Spring을 μ“°λŠ”κ²Œ λ‹Ήμ—°νžˆ 느껴질 수 μžˆμ§€λ§Œ, 였히렀 Single Thread μ„œλ²„μ²˜λŸΌ λ™μž‘ν•˜λŠ” 것이 MSA(Micro Service Architecture), kubernetes와 같이 μ΅œκ·Όλ“€μ–΄ 읡히 λ³Ό 수 μžˆλŠ” μ‹œμŠ€ν…œλ“€κ³Ό κ·Έ 합이 맀우 μ’‹λ‹€.

MSA & kubernetes

  • MSA(Micro Service Architecture) : μž‘μ€ μ„œλΉ„μŠ€ μ—¬λŸ¬ κ°œκ°€ λͺ¨μ—¬μ„œ ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ„ μ œκ³΅ν•˜λŠ” 아킀텍쳐
    • μ„œλΉ„μŠ€κ°€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•˜μ—¬ ν΄λΌμš°λ“œμ™€ μ»¨ν…Œμ΄λ„ˆμ— 잘 μ–΄μšΈλ¦Ό
  • kubernetes(k8s) : μ»¨ν…Œμ΄λ„ˆν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 배포, 관리, ν™•μž₯ν•  λ•Œ μˆ˜λ°˜λ˜λŠ” λ‹€μˆ˜μ˜ μˆ˜λ™ ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™ν™”ν•˜λŠ” μ˜€ν”ˆμ†ŒμŠ€ μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ ν”Œλž«νΌ (μ»¨ν…Œμ΄λ„ˆλž€?)
  • Spring은 JVM μœ„μ—μ„œ λ™μž‘ν•˜λ―€λ‘œ 일반적으둜 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λ†’λ‹€. 반면, Node.jsλŠ” JavaScript의 Runtime ν™˜κ²½μ΄λ―€λ‘œ μƒλŒ€μ μœΌλ‘œ 더 κ°€λ²Όμš΄ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 가진닀.
    • MSAλŠ” νŠΈλž˜ν”½λ„ 각 μ„œλΉ„μŠ€μ— 따라 λ‚˜λ‰˜κ²Œ λ˜λ―€λ‘œ νŠΈλž˜ν”½μ΄ 많이 λͺ°λ¦΄ λ•Œμ—λŠ” Node.jsκ°€ μ ν•©ν•œ κ²ƒμœΌλ‘œ 보인닀.
      • λ‚˜λˆ„λŠ” μ„œλΉ„μŠ€κ°€ λ§Žμ„ 경우, λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 쀄일 수 μžˆλ‹€. (양면적인 이야기)
    • kubernetesλŠ” μžλ™ν™”λœ 관리λ₯Ό 톡해 νŠΈλž˜ν”½μ„ μœ λ™μ μœΌλ‘œ μ‘°μ ˆν•˜λ―€λ‘œ MSA와 같은 이유둜 Node.js와 적합성을 보인닀.
  • 일반적으둜 Node.js의 μ„œλ²„ 가동 μ‹œκ°„μ΄ Spring보닀 μ§§λ‹€λŠ” κ²ƒμ—μ„œ λ©”λͺ¨λ¦¬μ™€ λΉ„μŠ·ν•œ 양상을 λ³΄μΈλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
    • 가동 μ‹œκ°„μ΄ μ§§λ‹€λŠ” 것은 κ°‘μž‘μŠ€λŸ¬μš΄ νŠΈλž˜ν”½μ— 즉각적인 λ°˜μ‘μ΄ κ°€λŠ₯ν•˜λ‹€κ³  생각할 수 μžˆλ‹€.

즉, μ„œλ²„ 수 μžμ²΄λ„ 늘고, μ„œλ²„ μˆ˜κ°€ νŠΈλž˜ν”½μ— 맞좰 μœ λ™μ μœΌλ‘œ λ°”λ€ŒλŠ” 상황이 λ§Žμ•„μ§„ μ΅œκ·Όμ—λŠ” 크고 κ°•λ ₯ν•œ ν•œ λŒ€μ˜ μ„œλ²„λ³΄λ‹€λŠ” λΉ λ₯΄κ³  κ°€λ²Όμš΄ μ„œλ²„κ°€ μ—¬λŸ¬ λŒ€ μžˆλŠ” 것이 μœ λ¦¬ν•˜κ²Œ μž‘μš©λ  수 μžˆλ‹€.

JavaScript의 언어적 ν•œκ³„

Java와 달리 μžλ£Œν˜•μ„ λͺ…ν™•νžˆ κ·œμ •μ§“μ§€ μ•ŠλŠ” JavaSciptλŠ” μ΄λŸ¬ν•œ 이유둜 μž₯점과 단점이 κ½€λ‚˜ λͺ…ν™•ν•˜κ²Œ κ°ˆλ¦¬λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€. μžλ£Œν˜•μ˜ 이점으둜 μ½”λ“œ μž‘μ„±μ΄ μš©μ΄ν•  수 μžˆμœΌλ‚˜, μ—°μ‚°λŸ‰μ΄ λ§Žμ€ μž‘μ—…μ—μ„œλŠ” 속도가 느릴 수 μžˆμŠ΅λ‹ˆλ‹€.

(ν•˜μ§€λ§Œ, TypeScript λ“±μœΌλ‘œ μ΄λŸ¬ν•œ 단점도 극볡되고 μžˆλŠ” 쀑..!)

κ²°λ‘ 

였랜 κΈ°κ°„ ν˜„μ—…μ—μ„œ ν™œμš©λ˜λ©° μ•ˆμ •μ„±μ„ μΆ©λΆ„νžˆ 검증받은 Spring μ„œλΉ„μŠ€λ“€μ„ λͺ¨λ‘ Node.js둜 λŒ€μ²΄ν•˜κΈ°μ—λŠ” ν˜„μ‹€ 쑰건상 λ‹€μ†Œ 무리가 μžˆμ§€λ§Œ, 개발자(ν˜Ήμ€ 쀀비생..?)듀은 변화에 μœ μ—°ν•˜κ²Œ λŒ€μ²˜ν•΄μ•Όλ―€λ‘œ 적절히 λ°œμ„ λ‹΄κ·Έκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

ν•΄λ‹Ή 글을 μ μœΌλ©΄μ„œ 컴퓨터 ꡬ쑰, μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž˜λ°μ˜ κ³Όλͺ©μ—μ„œ λ°°μ› λ˜ λͺ‡λͺ‡ 단어듀을 μ ‘ν•  수 μžˆμ—ˆλ‹€. κ·Έλ ‡μ§€λ§Œ μ—­μ‹œλ‚˜ λ‚˜λŠ” μ‹œν—˜μ΄ λλ‚˜κ³  λ¨Έλ¦Ώμ†μ—μ„œ λͺ¨λ‘ μ§€μ›Œλ²„λ Έλ‚˜ 보닀... 기둝의 μ€‘μš”μ„±μ„ λ‹€μ‹œ ν•œ 번 절절히 λŠλΌλ©΄μ„œ μ•„μž μ•„μž ν™”μ΄νŒ…!

참고 및 좜처

β€˜Node.js’ VS β€˜Java Spring’ by 넀이버 νŒŒμ΄λ‚Έμ…œ κΉ€νƒœμš°(twkim913)

profile
μžμ•„λ₯Ό μ°Ύμ•„ λ– λ‚˜λŠ” 쀑,,,

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보