React

React ํด๋”๊ตฌ์กฐ FSD ๊ธฐ๋Šฅ ๋ถ„ํ™œ ์„ค๊ณ„ ์•„ํ‚คํ…์ฒ˜

martinooo 2024. 5. 2. 16:00

 

๐Ÿคท‍โ™‚๏ธ ๋ณธ๋ก ์— ์•ž์„œ


ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ํด๋” ๊ตฌ์กฐ, ์„ค๊ณ„์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— React FSD ํด๋”๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ์˜ˆ์ •์ด๋ผ์„œ FSD ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๐Ÿคท‍โ™‚๏ธ FSD ์•„ํ‚คํ…์ฒ˜๋ž€?


FSD๋Š” Feature Sliced Desing ์˜๋ฏธ์ด๋ฉฐ ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋‚˜ ์ ์ง„์ ์œผ๋กœ ๊ทœ๋ชจ๊ฐ€ ํ™•์žฅ๋  ํ•„์š”๊ฐ€ ์—†๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋ชจ๋†€๋ฆฌ์Šค ํ˜•์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ๋˜์ง€๋งŒ ์ ์ง„์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ํ™•์žฅํ•ด ๋‚˜๊ฐˆ ์˜ˆ์ •์ด๋ผ๋ฉด FSD๋ฅผ ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐœ๋… ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ๊ธ€์„ ๋ณด์‹œ๋ฉด ๋” ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค^^

๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(Boilerplate code)๋ž€? - ๊ฐœ๋…, ํ•„์š”ํ•œ ์ด์œ 

https://cometruedream.tistory.com/216

 

๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(Boilerplate code)๋ž€? - ๊ฐœ๋…, ํ•„์š”ํ•œ ์ด์œ 

๐Ÿ‘‹ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ž€? ์ฝ”๋”ฉ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์˜๋ฏธ ์—†๋Š” ์ฝ”๋”ฉ์„ ํ•  ๋•Œ๋„ ์žˆ๊ณ  ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์— ๋•Œ๋ฌธ์— ์—…๋ฌด ์ƒ์‚ฐ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋กœ ๊ธฐ๋ณธ์ ์ธ

cometruedream.tistory.com

 

FSD ๊ตฌ์„ฑ์š”์†Œ?

๋ ˆ์ด์–ด(layer), ์Šฌ๋ผ์ด์Šค(slice), ์„ธ๊ทธ๋จผํŠธ(segment)์˜ ์„ธ ๊ฐ€์ง€ ๊ฐœ๋…์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

FSD ํด๋”๊ตฌ์กฐ๋Š” ์ตœ๋Œ€ 3๋‹จ๊ณ„๋กœ ์ด๋ค„์ ธ ์žˆ์œผ๋ฉฐ ์ƒํ™ฉ๋งˆ๋‹ค 1depth ์ •๋„ ๋” ์ƒ๊ฒจ๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๋ ˆ์ด์–ด

๋ ˆ์ด์–ด๋Š” ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ„ํ•ด์˜ ์ตœ์ƒ์˜ root ์ž…๋‹ˆ๋‹ค.

FSD ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ ˆ์ด์–ด์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ 7๋‹จ๊ณ„๋กœ ์ œํ•œ๋˜๋ฉฐ ํ•„์š”ํ•œ ๋ ˆ์ด์–ด์— ๋งž์ถฐ์„œ ํด๋”๊ตฌ์กฐ๋ฅผ ๋งž์ถ”๋ฉด๋œ๋‹ค.

์ฐธ๊ณ ๋กœ processes ๋ ˆ์ด์–ด๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์„œ ์‚ดํŽด๋ณด์ง€ ์•Š๊ณ  ๋‚˜๋จธ์ง€ 6๊ฐœ์˜ ๋ ˆ์ด์–ด๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํŠน์ง•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ค.

 

 

 

FSD 6๊ฐœ์˜ ๋ ˆ์ด์–ด

  • app: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋ฐ”์ด๋”, ๋ผ์šฐํ„ฐ, ์ „์—ญ ์Šคํƒ€์ผ, ์ „์—ญ ํƒ€์ž… ์„ ์–ธ ๋“ฑ์ด ์—ฌ๊ธฐ์—์„œ ์ •์˜ ๋œ๋‹ค.
  • pages: ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŽ˜์ด์ง€๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • widgets: ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” ์‚ฌ์šฉ๋˜๋Š” ๋…๋ฆฝ์ ์ธ UI ์ปดํฌ๋„ŒํŠธ
  • features: ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” UI์— ๊ธฐ๋Šฅ์ ์ธ ๋ถ€๋ถ„์„ ํฌํ•จํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹คํฌ๋ชจ๋“œ, ์ข‹์•„์š” ๋“ฑ์ด ์žˆ๋‹ค.
  • shared: ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” ๋น„์ฆˆ๋‹ˆ์ฆˆ ๋กœ์ง€์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด components, hooks ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.
  • entities: ํ•ด๋‹น ๋ ˆ์ด์–ด๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋“ค์„ ํฌํ•จํ•œ๋‹ค.

6๊ฐœ์˜ ๋ ˆ์ด์–ด๋“ค์€ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์กฐ์งํ™”, ๋ชจ๋“ˆํ™”๋˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

*๋Ÿฐ๋‹์ปค๋ธŒ๊ฐ€ ์žˆ์–ด์„œ ์ง„์ž…์žฅ๋ฒฝ์ด ์–ด๋ ต๋‹ค.

 

 

์Šฌ๋ผ์ด์Šค(slices)

6~7๊ฐœ์˜ ์ตœ์ƒ์˜ ๋ ˆ์ด์–ด๋ฅผ ๋ถ„ํ•ด์˜ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€์ธ ์Šฌ๋ผ์ด์Šค๋ผ๋Š” ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋‹ค. ์Šฌ๋ผ์ด์Šค์— ๋ชฉํ‘œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์ฝ”๋“œ ๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด์Šค ๋‚ด๋ถ€์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์™€ ์—ฐ๊ด€๋œ ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ app๊ณผ shared๋ ˆ์ด์–ด์—์„œ ๊ฐ๊ฐ ์•ฑ์˜ ์ „์ฒด์ ์ธ ๋ถ€๋ถ„๊ณผ ์—ฐ๊ด€๋œ ์ฝ”๋“œ๋ฅผ shared ๋ ˆ์ด์–ด์—์„œ๋Š” ๊นŠ์€ ์ถ”์ƒํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋น„์ฆˆ๋‹ˆ์ฆˆ ๋กœ์ง์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— slice๋ฅผ ๋‘์ง€ ์•Š๋Š”๋‹ค. 

 

์„ธ๊ทธ๋จผํŠธ(segments)

์„ธ๊ทธ๋จผํŠธ๋Š” FSD์˜ ๋งˆ์ง€๋ง‰ ๊ณ„์ธต์— ์žˆ๋Š” ์š”์†Œ๋กœ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜์— ๋„์›€์ด ๋œ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์„ธ๊ทธ๋จผํŠธ ์ข…๋ฅ˜

api - ํ•„์š”ํ•œ ์„œ๋ฒ„ ์š”์ฒญ.

UI - ์Šฌ๋ผ์ด์Šค์˜ UI ์ปดํฌ๋„ŒํŠธ.

model - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ฆ‰ ์ƒํƒœ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ. actions ๋ฐ selectors๊ฐ€ ์ด์— ํ•ด๋‹น

lib - ์Šฌ๋ผ์ด์Šค ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณด์กฐ ๊ธฐ๋Šฅ.

config - ์Šฌ๋ผ์ด์Šค์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ๊ฐ’์ด์ง€๋งŒ ๊ตฌ์„ฑ ์„ธ๊ทธ๋จผํŠธ๋Š” ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Œ.

consts - ํ•„์š”ํ•œ ์ƒ์ˆ˜.

 

๊ณต๊ฐœ API

์„ธ๊ทธ๋จผํŠธ๋Š” FSD์˜ ๋งˆ์ง€๋ง‰ ๊ณ„์ธต์— ์žˆ๋Š” ์š”์†Œ๋กœ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜์— ๋„์›€์ด ๋œ๋‹ค.FSD ์•„ํ‚คํ…์ฒ˜์˜ ๊ทœ์น™์œผ๋กœ ๊ฐ ์Šฌ๋ผ์ด์Šค์™€ ์„ธํฌ๋จผํŠธ์—๋Š” ๊ณต๊ฐœ API๊ฐ€ ์žˆ์œผ๋ฉฐ index.js, index.txํŒŒ์ผ์ด๋ฉฐ index ํŒŒ์ผ์„ ํ†ตํ•ด ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ์„ธ๊ทธ๋จผํŠธ์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์™ธ๋ถ€๋กœ exportํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๐Ÿคท‍โ™‚๏ธ ์ •๋ฆฌํ•˜์ž๋ฉด…


React ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•ญ์ƒ ํด๋” ๊ตฌ์กฐ & ์•„ํ‚คํ…์ณ์— ๋Œ€ํ•ด์„œ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ๋œ๋‹ค.

๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋œ์ˆ˜ ์žˆ๋Š” FSD ์•„ํ‚คํ…์ณ๋Š” ํ”„๋ก ํŠธ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•˜๊ณ  ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ํฅ๋ฏธ๋กœ์šด ๊ธฐ์ˆ ์ด๋‹ค.

ํŒ€์›๋ผ๋ฆฌ ํ˜‘์—… & ๊ทœ์น™ & ๊ฐœ๋ฐœ๋ฌธํ™”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ  ํ™•์žฅ์„ฑ๊ณผ ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„ํ‚คํ…์ณ์˜ ๋Ÿฐ๋‹์ปค๋ธŒ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์›๊ณผ ์ธ์‹, ๊ฐœ๋…, ํŒ€ ๋ฌธํ™”๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 


 

์žฌ๋ฐŒ๋Š” ์˜ค๋Š˜์˜ ๋ ๋ณ„ ์šด์„ธ ๋ณด๊ณ ๊ฐ€์„ธ์š”!