Skip to content

DesignSystemLab/challenge-flow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

ChallengeFlow๋Š” ๊ทธ๋ฃน์„ ๊ตฌ์„ฑํ•˜์—ฌ ์›ํ•˜๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ์„œ๋กœ ํ•™์Šต์„ ๋„๋ชจํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

GitHub ๋กœ๊ทธ์ธ ์ฑŒ๋ฆฐ์ง€ ์ƒ์„ฑ
02-user-login new-challenge
์ฑŒ๋ฆฐ์ง€ ์ƒ์„ธ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก
04-view-challenge 06-workspace-infinite-scroll
์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ธ ์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ
07-workspace-view 08-email-login

์„ ์–ธ์ ์ธ ์ฝ”๋“œ

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ์–ธ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋กœ, React 18 ๋ฒ„์ „์—์„œ ์ œ๊ณตํ•˜๋Š” Suspense์™€ ErrorBoundary๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ์ƒํƒœ์™€ ์˜ค๋ฅ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ตฌ์„ฑํ–ˆ์œผ๋ฉฐ, ๋กœ๋”ฉ๊ณผ ์˜ค๋ฅ˜ UI์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€๋กœ ์œ„์ž„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

<section>
  <WorkspaceSearchFilter handleChangeOpenType={setOpenType} />
  <CompositionBoundaryReactQuery error={(errorProps) => <WorkspaceError {...errorProps} />} suspense={<Loader />}>
    <WorkspaceList openType={openType} />
  </CompositionBoundaryReactQuery>
</section>

์ง€์—ญ์„ฑ์„ ๊ณ ๋ คํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

๐Ÿ“ฆroot/src
โ”œโ”€โ”€ ๐Ÿ“‚ auth
โ”œโ”€โ”€ ๐Ÿ“‚ challenge
โ”œโ”€โ”€ ๐Ÿ“‚ layout
โ”œโ”€โ”€ ๐Ÿ“‚ pages
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ api
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ challenge
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ profile
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ workspace
โ”œโ”€โ”€ ๐Ÿ“‚ reaction
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ comment
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ emoji
โ”œโ”€โ”€ ๐Ÿ“‚ shared
โ””โ”€โ”€ ๐Ÿ“‚ workspace

์ง€์—ญ์„ฑ์„ ๊ณ ๋ คํ•œ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ž€, ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ผ๋ฆฌ ๊ฐ™์€ ํด๋” ๋‚ด์— ์œ„์น˜์‹œํ‚ค๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•จ์œผ๋กœ์จ ๋‘๊ฐ€์ง€ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

2. ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„
์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ„์˜ ์˜์กด์„ ์ตœ์†Œํ™”ํ•จ์œผ๋กœ์จ, ํ•œ ํด๋” ๋‚ด์—์„œ์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํด๋”์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ „์ฒด์ ์ธ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” auth,challenge,reaction,workspace๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ๊ฐ ๋„๋ฉ”์ธ๋ณ„๋กœ ์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฐ ๋„๋ฉ”์ธ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

๋””์ž์ธ์‹œ์Šคํ…œ ํ™œ์šฉ

ํŒ€ ์ž์ฒด์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ๋””์ž์ธ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ์„ค๊ณ„๋œ UI ์ปดํฌ๋„ŒํŠธ ๋ฐ ์Šคํƒ€์ผ ํ—ฌํผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ ํƒ

ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋œ ๊ธฐ์ˆ ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ReactQuery

React Query๋Š” API์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๋ฉฐ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์บ์‹œํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ํŽ˜์ด์ง€ ์ด๋™์‹œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React Query๋Š” React์™€ ํ†ตํ•ฉ์ด ์ž˜ ๋˜์–ด ์žˆ๊ณ  ContextAPI์™€ Suspense๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

IntersectionObserver API

๋ฌดํ•œ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด react-intersection-observer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ ์–ธ์ ์ธ hook์„ ์ œ๊ณตํ•˜๊ณ , IntersectionObserver API๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

NextAuth

NextAuth๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Firebase๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, NextAuth์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ ๊ณต๊ธ‰์ž(Provider)์™€ ์—ฐ๋™ํ•˜์—ฌ ํšŒ์› ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  API ํ†ต์‹  ์‹œ ์„œ๋ฒ„ ๋‚ด์—์„œ ์„ธ์…˜์„ ํ™œ์šฉํ•œ ์ธ์ฆ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Firebase

Challenge Flow๋Š” Firebase๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜๊ณ  ์œ ์ง€๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ฐœ๋ฐœ์— ๋”์šฑ ์ง‘์ค‘ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ๋ฒ„์ „์„ ์‹ ์†ํ•˜๊ฒŒ ๋ฆด๋ฆฌ์ฆˆํ•˜๋Š”๋ฐ ์ดˆ์ ์„ ๋งž์ถœ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ๋ฒ„์ „์—์„œ๋Š” ์‹ ์†ํ•œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด Firebase๋ฅผ ํ™œ์šฉํ–ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด์„œ ๋” ๋ณต์žกํ•˜๊ณ  ํƒ„ํƒ„ํ•œ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ Firebase๋ฅผ Node.js์™€ RDBS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์œผ๋กœ ์ „ํ™˜ํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

XState

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

Releases

No releases published

Packages

No packages published