๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Application/Web Application

[Spring + React] 1. ์„ค์น˜ ๋ฐ ์„ธํŒ…

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”น 1. ์ „ํ†ต์ ์ธ ์ „์ฒด ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๋ฐฉ์‹

์š”์ฒญ โ†’ View(HTML) โ†’ ์ „์ฒด ํŽ˜์ด์ง€ ๋ Œ๋”๋ง

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ„.
  2. ์„œ๋ฒ„(๋ฐฑ์—”๋“œ)๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , HTML์„ ํฌํ•จํ•œ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ„.
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฐ›์€ HTML์„ ํ•ด์„ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, ๊ธฐ์กด ํŽ˜์ด์ง€๋Š” ์ƒˆ ํŽ˜์ด์ง€๋กœ ์™„์ „ํžˆ ๋Œ€์ฒด๋จ.

โœ… ํŠน์ง•

  • ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋จ.
  • ์„œ๋ฒ„์—์„œ HTML์„ ๋ Œ๋”๋งํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์ด ํ•„์š” ์—†์Œ.
  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์ด ๋‹ค์†Œ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ(์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๊นœ๋นก์ž„ ํ˜„์ƒ ๋ฐœ์ƒ).
  • ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹: SSR(Server-Side Rendering)

๐Ÿ”น 2. Ajax๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์š”์ฒญ & ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹

View โ†’ ์š”์ฒญ(JS) โ†’ Ajax(๋น„๋™๊ธฐ ์š”์ฒญ) โ†’ ์‘๋‹ต(JSON) โ†’ JS(๋ Œ๋”๋ง)

  1. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋™์ž‘(๋ฒ„ํŠผ ํด๋ฆญ, ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•˜๋ฉด JavaScript์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€.
  2. JavaScript์—์„œ Ajax ์š”์ฒญ(์ฃผ๋กœ XMLHttpRequest ๋˜๋Š” fetch API, Axios ๋“ฑ์„ ์ด์šฉ)์„ ์„œ๋ฒ„๋กœ ์ „์†ก.
  3. ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„, JSON ๋ฐ์ดํ„ฐ(HTML์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ)๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ„.
  4. ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ๋ฐ›์€ JSON ๋ฐ์ดํ„ฐ๋ฅผ JavaScript๊ฐ€ ๊ฐ€๊ณตํ•˜์—ฌ ํŠน์ • ๋ถ€๋ถ„์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ™”๋ฉด์— ๋ฐ˜์˜ํ•จ.

โœ… ํŠน์ง•

  • ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐฑ์‹  ๊ฐ€๋Šฅ โ†’ ๋น ๋ฅธ UX ์ œ๊ณต.
  • ์„œ๋ฒ„์—์„œ JSON์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  UI๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•จ.
  • ์ฃผ๋กœ SPA(Single Page Application) ๋˜๋Š” ๋™์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ.

โœ… ์˜ˆ์ œ: Ajax๋ฅผ ํ™œ์šฉํ•œ ๋Œ“๊ธ€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ

fetch('/api/comments', { 
    method: 'POST',
    body: JSON.stringify({ text: '๋Œ“๊ธ€ ๋‚ด์šฉ' }),
    headers: { 'Content-Type': 'application/json' }
})
.then(response => response.json())  // ์„œ๋ฒ„ ์‘๋‹ต์„ JSON์œผ๋กœ ๋ณ€ํ™˜
.then(data => {
    const commentList = document.getElementById('comment-list');
    const newComment = document.createElement('li');
    newComment.textContent = data.text;
    commentList.appendChild(newComment);  // ๋Œ“๊ธ€ ๋ชฉ๋ก์— ์ถ”๊ฐ€
});

 

๐Ÿ”น ์ตœ์ข… ์ •๋ฆฌ

โœ… 1. ์ „์ฒด ํŽ˜์ด์ง€ ๋ Œ๋”๋ง (SSR)

์‚ฌ์šฉ์ž ์š”์ฒญ โ†’ ์„œ๋ฒ„์—์„œ HTML ์ƒ์„ฑ โ†’ ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ๋ฐ ๋ Œ๋”๋ง
  • ์ „ํ†ต์ ์ธ ๋ฐฉ์‹, ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ์ฒ˜๋ฆฌ.
  • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๊นœ๋นก์ž„ ๋ฐœ์ƒ.

โœ… 2. Ajax๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์š”์ฒญ (SPA & ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ)

์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ(JS) โ†’ Ajax ์š”์ฒญ โ†’ ์„œ๋ฒ„์—์„œ JSON ์‘๋‹ต โ†’ JS๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋ฐ UI ์—…๋ฐ์ดํŠธ
  • ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์™€ ์—…๋ฐ์ดํŠธ.
  • ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ™”๋ฉด์„ ์ง์ ‘ ๋ณ€๊ฒฝ(JavaScript ์ด์šฉ).

โœ… 3. ๊ฒฐ๋ก 

Ajax ์š”์ฒญ๋งŒ์œผ๋กœ ๋ณต์žกํ•œ ํ™”๋ฉด์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฉด์„œ, React ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅํ•จ.

 

โœ” Ajax๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ ์ธ UI ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ.
โœ” React๋Š” ๊ฐ€์ƒ DOM, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ, ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋“ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.
โœ” ํ˜„์žฌ๋Š” React๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Vue.js, Svelte, Solid.js ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ๋“ฑ์žฅํ•˜์—ฌ,
๋”์šฑ ํšจ์œจ์ ์ธ UI ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์ง.

๐Ÿ”ฅ ์ฆ‰, Ajax๊ฐ€ ๋ณต์žกํ•œ UI ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋ฉด์„œ React๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.


โœ… Ajax vs. ๊ธฐ์กด JavaScript vs. React ๋น„๊ต ํ‘œ

๊ตฌ๋ถ„ ๊ธฐ์กด JS (DOM ์กฐ์ž‘) Ajax (๋น„๋™๊ธฐ ํ†ต์‹ ) React (ํ”„๋ ˆ์ž„์›Œํฌ)
UI ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ ์ง์ ‘ DOM์„ ์กฐ์ž‘ (innerHTML, getElementById) ํŠน์ • ๋ถ€๋ถ„๋งŒ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์™€ ๋ณ€๊ฒฝ ๊ฐ€์ƒ DOM(Virtual DOM) ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ณ€๊ฒฝ
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์—†์Œ (๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ ์‹คํ–‰) Ajax๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์š”์ฒญ ๊ฐ€๋Šฅ useEffect, React Query ๋“ฑ์œผ๋กœ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ
DOM ์กฐ์ž‘ ๋น„์šฉ ๋†’์Œ (์ˆ˜๋™ ์กฐ์ž‘, ๋ณ€๊ฒฝ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ ์ €ํ•˜) ํŠน์ • ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ง์ ‘ ์กฐ์ž‘ ํ•„์š” ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”
์ƒํƒœ ๊ด€๋ฆฌ ์ง์ ‘ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ (์ „์—ญ ๋ณ€์ˆ˜, localStorage) ๋น„๋™๊ธฐ ์š”์ฒญ ํ›„ DOM์„ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•จ useState, useReducer, Redux ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ์ œ๊ณต
์ฝ”๋“œ ๊ตฌ์กฐ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ (HTML, CSS, JS ๋ถ„๋ฆฌ) JS๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ + Ajax ์š”์ฒญ ์ถ”๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ (UI๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ)
์œ ์ง€๋ณด์ˆ˜์„ฑ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง (์ฝœ๋ฐฑ ์ง€์˜ฅ ๋ฐœ์ƒ) Ajax ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์›€
์‚ฌ์šฉ ์‚ฌ๋ก€ ์ •์ ์ธ ์›น ํŽ˜์ด์ง€, ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ, ๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋“ฑ ์ผ๋ถ€ ๋™์  ์š”์†Œ ๋Œ€๊ทœ๋ชจ SPA(Single Page Application), ๋ณต์žกํ•œ UI

โœ… ์ •๋ฆฌ:

  • ๊ธฐ์กด JavaScript๋Š” ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•ด์•ผ ํ•ด์„œ ๋น„ํšจ์œจ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€
  • Ajax๋Š” ๋น„๋™๊ธฐ ์š”์ฒญ์„ ํ†ตํ•ด ์ผ๋ถ€ UI๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ˆ˜๋™์ ์ธ DOM ์กฐ์ž‘์ด ํ•„์š”
  • React๋Š” ๊ฐ€์ƒ DOM๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™” + ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž„

๐Ÿ”ฅ ์ฆ‰, Ajax๋กœ ๋ณต์žกํ•œ UI๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด์„œ React ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅํ•œ ๊ฒƒ!


โœ… React์˜ Ajax ์š”์ฒญ ํ›„ UI ์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ์„ค๋ช…

React์—์„œ Ajax ์š”์ฒญ์„ ๋ฐ›์•„ UI๋ฅผ ์ž๋™ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€ํ‘œ์ ์œผ๋กœ Observer ํŒจํ„ด, MVVM ํŒจํ„ด, ํ›… ํŒจํ„ด(Hooks Pattern) ๋“ฑ


๐Ÿ”น 1. Observer ํŒจํ„ด (๊ด€์ฐฐ์ž ํŒจํ„ด) - ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ์ง€ & UI ์—…๋ฐ์ดํŠธ

"React๋Š” ์ƒํƒœ(State)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ, Observer ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•จ."

โœ… Observer ํŒจํ„ด ๊ฐœ๋…

  • ์ฃผ์ฒด(Subject): ์ƒํƒœ(State)
  • ๊ด€์ฐฐ์ž(Observer): React ์ปดํฌ๋„ŒํŠธ (UI)
  • ๋ณ€๊ฒฝ ๊ฐ์ง€ (Subscription): ์ƒํƒœ(State)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ž๋™์œผ๋กœ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ

โœ… React์—์„œ Observer ํŒจํ„ด ์ ์šฉ ์˜ˆ์ œ

import { useState, useEffect } from "react";

function ObserverPatternExample() {
  const [data, setData] = useState([]); // ์ƒํƒœ(Subject)

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((res) => res.json())
      .then((json) => setData(json)); // ์ƒํƒœ ๋ณ€๊ฒฝ โ†’ UI ์ž๋™ ์—…๋ฐ์ดํŠธ (Observer ํŒจํ„ด)
  }, []);

  return (
    <ul>
      {data.map((item) => (
        <li key={item.id}>{item.title}</li>
      ))}
    </ul>
  );
}

โœ… Observer ํŒจํ„ด ์ ์šฉ ๋ฐฉ์‹

  1. useState๋กœ ์ฃผ์ฒด(Subject) ์—ญํ• ์„ ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ƒ์„ฑ
  2. useEffect์—์„œ Ajax ์š”์ฒญ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ
  3. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , UI(Observer)๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

๐Ÿ”น 2. MVVM ํŒจํ„ด - UI(View)์™€ ์ƒํƒœ(Model) ๋ถ„๋ฆฌ

React์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์€ MVVM(Model-View-ViewModel) ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•จ.

โœ… MVVM ํŒจํ„ด ๊ฐœ๋…

  • Model (๋ฐ์ดํ„ฐ): Ajax ์š”์ฒญ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ
  • ViewModel (์ƒํƒœ ๊ด€๋ฆฌ & ๋กœ์ง): useState์™€ useEffect๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • View (UI): ์ƒํƒœ(ViewModel)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ™”๋ฉด์„ ๋ Œ๋”๋ง

โœ… React์—์„œ MVVM ํŒจํ„ด ์ ์šฉ ์˜ˆ์ œ

function PostViewModel() {
  const [data, setData] = useState([]);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/posts")
      .then((res) => res.json())
      .then((json) => setData(json));
  }, []);

  return { data }; // ViewModel ์—ญํ• 
}

function MVVMExample() {
  const { data } = PostViewModel(); // ViewModel์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

  return (
    <ul>
      {data.map((item) => (
        <li key={item.id}>{item.title}</li>
      ))}
    </ul>
  );
}

โœ… MVVM ์ ์šฉ ๋ฐฉ์‹

  • PostViewModel์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฅผ UI ์ปดํฌ๋„ŒํŠธ(MVVMExample)์—์„œ ๊ฐ€์ ธ์™€ ๋ Œ๋”๋งํ•จ.
  • ๋ฐ์ดํ„ฐ ๋กœ์ง๊ณผ UI๊ฐ€ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋จ.

๐Ÿ”น 3. ํ›… ํŒจํ„ด (Hooks Pattern) - ๋ฐ์ดํ„ฐ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ถ„๋ฆฌ

React์˜ useState, useEffect๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด

โœ… Hooks ํŒจํ„ด ๊ฐœ๋…

  • Custom Hook์„ ๋งŒ๋“ค์–ด์„œ Ajax ์š”์ฒญ ๋กœ์ง์„ ๋ถ„๋ฆฌ
  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœ… React์—์„œ ํ›… ํŒจํ„ด ์ ์šฉ ์˜ˆ์ œ

function useFetchData(url) {
  const [data, setData] = useState([]);
  useEffect(() => {
    fetch(url)
      .then((res) => res.json())
      .then((json) => setData(json));
  }, [url]); // URL์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰
  return data;
}

function HooksPatternExample() {
  const data = useFetchData("https://jsonplaceholder.typicode.com/posts");

  return (
    <ul>
      {data.map((item) => (
        <li key={item.id}>{item.title}</li>
      ))}
    </ul>
  );
}

โœ… Hooks ํŒจํ„ด ์ ์šฉ ๋ฐฉ์‹

  • useFetchData(url) ํ›…์„ ๋งŒ๋“ค์–ด์„œ Ajax ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  • UI ์ปดํฌ๋„ŒํŠธ(HooksPatternExample)์—์„œ useFetchData()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ Œ๋”๋ง

๐Ÿ”น ์žฅ์ :

  • ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง
  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๋กœ์ง์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ

โœ… 4. ๋””์ž์ธ ํŒจํ„ด๋ณ„ ๋น„๊ต ์ •๋ฆฌ

ํŒจํ„ด ๊ฐœ๋… React์—์„œ์˜ ์ ์šฉ ๋ฐฉ์‹ ํŠน์ง•
Observer ํŒจํ„ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ UI ์ž๋™ ์—…๋ฐ์ดํŠธ useState๋กœ ์ƒํƒœ ๊ด€๋ฆฌ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ React๊ฐ€ ์ž๋™ ๋ Œ๋”๋ง React์˜ ๊ธฐ๋ณธ ๋™์ž‘๊ณผ ์œ ์‚ฌ
MVVM ํŒจํ„ด Model๊ณผ View๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ViewModel๋กœ ๋ถ„๋ฆฌ (useState, useEffect) ๋กœ์ง๊ณผ UI๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
ํ›… ํŒจํ„ด ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ๊ด€๋ฆฌ useFetchData() ๊ฐ™์€ Custom Hook ํ™œ์šฉ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅ

๐Ÿ”ฅ ๊ฒฐ๋ก 

  1. React์˜ ์ƒํƒœ(State)์™€ UI๋Š” Observer ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ.
  2. MVVM ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง๊ณผ UI๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง.
  3. Hooks ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋ฉด Ajax ์š”์ฒญ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

๐Ÿ“Œ ์ฆ‰, React๋Š” Observer ํŒจํ„ด์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋ฉด์„œ MVVM๊ณผ Hooks ํŒจํ„ด์„ ์กฐํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง! ๐Ÿš€


์ฐธ๊ณ 

npm vs npx

๋”๋ณด๊ธฐ

โœ… npm๊ณผ npx์˜ ์ฐจ์ด: ์˜์กด์„ฑ ๋„๊ตฌ ๋ฐ ์‹คํ–‰๊ธฐ

npm๊ณผ npx๋Š” ๋ชจ๋‘ Node.js ์ƒํƒœ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋ชฉ์ ๊ณผ ๋™์ž‘ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ.
์•„๋ž˜ ํ‘œ๋ฅผ ํ†ตํ•ด ์ด ๋‘ ๋„๊ตฌ์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ.


๐Ÿ”น 1. npm (Node Package Manager)


๊ธฐ๋Šฅ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜, ๊ด€๋ฆฌ
์„ค์น˜ npm install <ํŒจํ‚ค์ง€> ๋ช…๋ น์–ด๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜, node_modules ํด๋”์— ์ €์žฅ
๊ธ€๋กœ๋ฒŒ ์„ค์น˜ npm install -g <ํŒจํ‚ค์ง€>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ์ ์œผ๋กœ ์„ค์น˜ ๊ฐ€๋Šฅ
๋นŒ๋“œ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ
์บ์‹ฑ ํ•œ ๋ฒˆ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋Š” ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ๋‹ค์Œ ์„ค์น˜ ์‹œ ์žฌ์‚ฌ์šฉ
์˜ˆ์‹œ ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Œ (npm install react@17)

โœ… 2. npx (Node Package Executor)

๊ธฐ๋Šฅ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ
์‚ฌ์šฉ๋ฒ• npx <ํŒจํ‚ค์ง€> ๋ช…๋ น์–ด๋กœ ์ผํšŒ์„ฑ ํŒจํ‚ค์ง€ ์‹คํ–‰
์„ค์น˜ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰, ๋กœ์ปฌ์— ์„ค์น˜ํ•˜์ง€ ์•Š์Œ
์žฌ์‚ฌ์šฉ ์ด๋ฏธ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์žฌ์‚ฌ์šฉ, ์—†์œผ๋ฉด ์ƒˆ๋กœ ๋‹ค์šด๋กœ๋“œ
์‹คํ–‰ ํ›„ ์‚ญ์ œ ํŒจํ‚ค์ง€๋ฅผ ์‹คํ–‰ ํ›„ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋ฏ€๋กœ ์‹œ์Šคํ…œ์— ์ž”์—ฌ ํŒŒ์ผ์ด ๋‚จ์ง€ ์•Š์Œ
์˜ˆ์‹œ npx create-react-app my-app์œผ๋กœ React ์•ฑ ์ƒ์„ฑ ํ›„ ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ

๐Ÿ”น 3. npm๊ณผ npx์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

โœ… (1) npm ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ์„ค์น˜:
# ํ”„๋กœ์ ํŠธ1
npm install react

# ํ”„๋กœ์ ํŠธ2
npm install react

# ํ”„๋กœ์ ํŠธ3
npm install react
  • ๊ฐ ํ”„๋กœ์ ํŠธ์˜ node_modules์— React๊ฐ€ ๋ณ„๋„๋กœ ์„ค์น˜๋จ.

โœ… (2) npx ์‚ฌ์šฉ ์˜ˆ์‹œ

  • npx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํŒจํ‚ค์ง€๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰:
    npx create-react-app my-app-1
    npx create-react-app my-app-2
    npx create-react-app my-app-3
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๊ณ , ์ดํ›„ ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ์บ์‹œ์—์„œ ์‚ญ์ œ๋จ.

๐Ÿ”ฅ ๊ฒฐ๋ก 

  1. npm์€ ์ฃผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ๋กœ, ๊ฐ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด,
  2. npx๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ๋กœ, ์ด๋ฏธ ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ผํšŒ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•จ.
  3. npx๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์˜ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ๋”์šฑ ์šฉ์ดํ•ด์ง.

๐Ÿ“Œ ๋”ฐ๋ผ์„œ, ํ•„์š”์— ๋”ฐ๋ผ ๋‘ ๋„๊ตฌ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”! ๐Ÿš€

 


โœ… ๋ฆฌ์•กํŠธ ์ดˆ๊ธฐ ์„ค์ •๋ฒ•์˜ ์—ญ์‚ฌ

๋ฆฌ์•กํŠธ ์ดˆ๊ธฐ ์„ค์ •๋ฒ•์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•ด์™”์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ๋ฐฉ๋ฒ•์ด ๋“ฑ์žฅํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณด๋‹ค ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 1. ์ดˆ๊ธฐ ์„ค์ • (2013-2015)

โœ… (1) ์ง์ ‘ ์„ค์ •ํ•˜๊ธฐ

  • ์„ค๋ช…: ์ดˆ๊ธฐ์—๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Babel, Webpack ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : ๋ณต์žกํ•œ ์„ค์ • ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ๊ณ , ์ดˆ๋ณด์ž์—๊ฒŒ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋†’์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ”น 2. Create React App์˜ ๋“ฑ์žฅ (2016)

โœ… (1) Create React App

  • ์„ค๋ช…: Facebook์—์„œ ์ œ๊ณตํ•˜๋Š” create-react-app ๋ช…๋ น์–ด๋กœ ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•: ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์ด ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด, ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : ๋ฒˆ๋“ค๋Ÿฌ, Babel, ESLint ๋“ฑ์˜ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ ธ, ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น 3. Vite์™€์˜ ํ†ตํ•ฉ (2020 ์ดํ›„)

โœ… (1) Vite์˜ ๋“ฑ์žฅ

  • ์„ค๋ช…: Vite๋Š” ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ ํšจ์œจ์ ์ธ ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•: ES ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•œ ๋น ๋ฅธ Hot Module Replacement(HMR)๋กœ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

โœ… (2) Create Vite App

  • ์„ค๋ช…: npm create vite@latest ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : Vite๋ฅผ ํ™œ์šฉํ•œ ์„ค์ •์€ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 4. ํ˜„๋Œ€์ ์ธ ๋„๊ตฌ์™€ ์ ‘๊ทผ ๋ฐฉ์‹ (ํ˜„์žฌ)

โœ… (1) ๋ชจ๋˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ†ตํ•ฉ

  • ์„ค๋ช…: Next.js, Remix์™€ ๊ฐ™์€ ํ˜„๋Œ€์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฆฌ์•กํŠธ ์ƒํƒœ๊ณ„์— ํ†ตํ•ฉ๋˜์–ด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•: ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG) ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด SEO์™€ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

โœ… (2) TypeScript์™€์˜ ๊ฒฐํ•ฉ

  • ์„ค๋ช…: TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•œ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ์žฅ์ : ๋ฆฌ์•กํŠธ์™€ TypeScript๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ณ , ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ ๊ฒฐ๋ก 

  • ๋ฆฌ์•กํŠธ ์ดˆ๊ธฐ ์„ค์ •๋ฒ•์€ ๋ณต์žกํ•œ ์ˆ˜๋™ ์„ค์ •์—์„œ create-react-app, Vite์™€ ๊ฐ™์€ ๊ฐ„ํŽธํ•œ ๋„๊ตฌ๋กœ ๋ฐœ์ „ํ•ด์™”์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ๋Š” Next.js์™€ TypeScript์™€ ๊ฐ™์€ ์ตœ์‹  ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋”์šฑ ํšจ์œจ์ ์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

โœ… VSCode ํ™•์žฅ: ESLint, Prettier, Reactjs Code Snippets

์ด ์„ธ ๊ฐ€์ง€ VSCode ํ™•์žฅ์€ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์„ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 1. ESLint

โœ… (1) ํŠน์ง•

  • ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ: JavaScript ๋ฐ JSX ์ฝ”๋“œ์—์„œ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž ๋งž์ถค ์„ค์ •: ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€ ๋‚ด ๊ทœ์น™์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… (2) ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•

  1. ํ™•์žฅ ์„ค์น˜: VSCode์—์„œ 'ESLint'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ”„๋กœ์ ํŠธ ์„ค์ •:
    • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .eslintrc.js ๋˜๋Š” .eslintrc.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์›ํ•˜๋Š” ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      {
        "extends": "eslint:recommended",
        "env": {
          "browser": true,
          "es2021": true
        },
        "rules": {
          "no-unused-vars": "warn"
        }
      }
  3. ์ž๋™ ๊ฒ€์‚ฌ: ์ฝ”๋“œ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ESLint๊ฐ€ ์ž‘๋™ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 2. Prettier

โœ… (1) ํŠน์ง•

  • ์ฝ”๋“œ ํฌ๋งทํŒ…: ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜์—ฌ, ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ์Šคํƒ€์ผ ๋…ผ์Ÿ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›: JavaScript, TypeScript, HTML, CSS ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โœ… (2) ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•

  1. ํ™•์žฅ ์„ค์น˜: VSCode์—์„œ 'Prettier - Code formatter'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ”„๋กœ์ ํŠธ ์„ค์ •:
    • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .prettierrc ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์›ํ•˜๋Š” ํฌ๋งทํŒ… ๊ทœ์น™์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      {
          "semi": true,                     // ๋ฌธ์žฅ์˜ ๋์— ์„ธ๋ฏธ์ฝœ๋ก  ์ถ”๊ฐ€
          "singleQuote": true,              // ๋ฌธ์ž์—ด์— ์‹ฑ๊ธ€ ์ฟผํŠธ ์‚ฌ์šฉ
          "tabWidth": 2,                    // ํƒญ ํญ ์„ค์ •
          "useTabs": false,                 // ํƒญ ๋Œ€์‹  ๊ณต๋ฐฑ ์‚ฌ์šฉ
          "printWidth": 80,                 // ์ค„ ๋„ˆ๋น„ ์„ค์ •
          "trailingComma": "all",           // ์œ ํšจํ•œ ๊ฐ์ฒด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์— ์‰ผํ‘œ ์ถ”๊ฐ€
          "bracketSpacing": true,           // ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๊ณต๋ฐฑ ์ถ”๊ฐ€
          "jsxBracketSameLine": false,      // JSX์—์„œ ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋‹ค์Œ ์ค„๋กœ ์ด๋™
          "arrowParens": "always"           // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ๊ด„ํ˜ธ ํ•ญ์ƒ ์‚ฌ์šฉ
      }
  3. ์ž๋™ ํฌ๋งทํŒ…: ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ Prettier๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํฌ๋งทํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” Shift + Alt + F๋กœ ์ˆ˜๋™ ํฌ๋งทํŒ…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 3. Reactjs Code Snippets

โœ… (1) ํŠน์ง•

  • ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ์ œ๊ณต: ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ์‹œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ํ…œํ”Œ๋ฆฟ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ: ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…, ํ•จ์ˆ˜ ๋“ฑ์„ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… (2) ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•

  1. ํ™•์žฅ ์„ค์น˜: VSCode์—์„œ 'ES7+ React/Redux/React-Native snippets'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ์‚ฌ์šฉ: ์›ํ•˜๋Š” ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ž…๋ ฅํ•˜๊ณ  Tab ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ํ•ด๋‹น ์Šค๋‹ˆํŽซ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:
      • rafce๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Tab์„ ๋ˆ„๋ฅด๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์Šค๋‹ˆํŽซ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
      • rcc๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Tab์„ ๋ˆ„๋ฅด๋ฉด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์Šค๋‹ˆํŽซ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ฅ ๊ฒฐ๋ก 

  • ESLint๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ , Prettier๋Š” ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ๋‹ด๋‹นํ•˜๋ฉฐ, Reactjs Code Snippets๋Š” ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์„ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
  • ์ด ์„ธ ๊ฐ€์ง€ ํ™•์žฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

 

728x90
๋ฐ˜์‘ํ˜•