Skip to content

CodingOnTeamBook/Rebook_React_Node

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

Re:book

๋„์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๋‹ค๋ฅธ ์œ ์ €์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ

0. Tools & Stack

1. Landing Page

Header

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๋กœ๊ณ  ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” '๋ฆฌ๋ทฐํƒญ'๊ณผ ๋ฆฌ๋ทฐ์–ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” '๋ฆฌ๋ทฐ์–ดํƒญ'
  • ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋ฐ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ํ—ค๋”, ๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„

Carousel

  • react-material์˜ carousel ui๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ

SearchForm

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๋„์„œ ๋˜๋Š” ์œ ์ € ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ฐ›๊ณ  onSubmit์‹œ search reducer๋กœ dispatch ๋ฐ SearchPage๋กœ ์ด๋™
  • SearchForm์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰์–ด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„
  • onReset btn์œผ๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ฐ”๋กœ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ์œ ์ € ํŽธ์˜ ๋„๋ชจ
  • useInput ์ปค์Šคํ…€ํ›… ์‚ฌ์šฉ์„ ํ†ตํ•ด ๊ฒ€์ƒ‰์–ด state ๊ด€๋ฆฌ

BestSeller

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ์ธํ„ฐํŒŒํฌ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ api๋ฅผ ํ†ตํ•ด ๊ตญ๋‚ด๋„์„œ ์ค‘ ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ top 5 ์ถœ๋ ฅ
  • ๋„์„œ ํด๋ฆญ์‹œ ํ•ด๋‹น ๋„์„œ์˜ bookDetail page๋กœ ์ด๋™

PopularReview

  • '์ข‹์•„์š”' ๋ฅผ ๋งŽ์ด ๋ฐ›์€ ์ˆœ์œผ๋กœ ๋ฆฌ๋ทฐ 6๊ฐœ ์ถœ๋ ฅ
  • ํ•ด๋‹น ๋ฆฌ๋ทฐ์˜ '๋”๋ณด๊ธฐ' ํด๋ฆญ์‹œ ReviewDetail Page๋กœ ์ด๋™
  • '๋”๋ณด๊ธฐ' ํด๋ฆญ์‹œ Review Page๋กœ ์ด๋™

2. SignUp Page

KakaoLogin

  • ์นด์นด์˜ค oauth ๋กœ๊ทธ์ธ
  • react-kakao-login ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ›„ jwt ๋กœ๊ทธ์ธ ๊ตฌํ˜„
  • ๊ฐ€์ž…๋œ ์œ ์ €๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ /signupํŽ˜์ด์ง€๋กœ ์ด๋™

GenreSelect

  • ์ตœ์†Œ 1๊ฐœ์—์„œ 3๊ฐœ genre ์„ ํƒ ๊ฐ€๋Šฅ
  • useCheck๋กœ ์„ ํƒํ•œ value ๊ฐ’ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ด

NicknameCheck

  • DB์— ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์ฒดํฌ
  • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹‰๋„ค์ž„์ผ ๊ฒฝ์šฐ Input disabled ์ฒ˜๋ฆฌ
  • useInput ์ปค์Šคํ…€ ํ›…์œผ๋กœ value ๊ฐ’ ๊ด€๋ฆฌ

SignupForm

  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ์—์„œ useHistory๋กœ state ๊ฐ’์„ ์ „์†ก
  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ์—์„œ ๋„˜์–ด์˜จ ๊ฐ’์€ useLocation์„ ํ†ตํ•ด ์ €์žฅ
  • GenreSelect์™€ NicknameCheck๋Š” useRef, forwardRef๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ „๋‹ฌ ํ›„ validation
  • signup API๋กœ ์ „์†ก

3. BookDetail Page

BookDetail

  • ์•Œ๋ผ๋”˜ ๋„์„œ ๊ฒ€์ƒ‰ api๋ฅผ ์ด์šฉํ•˜์—ฌ ๋„์„œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์™€ ์ถœ๋ ฅ

BookReview

  • ํ•ด๋‹น ์ฑ…์˜ isbn์„ params์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ์ฑ…์—๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์ตœ์‹ ์ˆœ ๋ฐ ์ธ๊ธฐ์ˆœ์œผ๋กœ 5๊ฐœ์”ฉ ์ถœ๋ ฅ
  • '๋”๋ณด๊ธฐ' ํด๋ฆญ์‹œ ํ•ด๋‹น ๋ฆฌ๋ทฐ์˜ review detail page๋กœ ์ด๋™

ReviewWriteBtn

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ์œ ์ €์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•œ ๋’ค, ๋กœ๊ทธ์ธ ์ƒํƒœ์ผ์‹œ wirteReview Page๋กœ ์ด๋™

4. WriteReview Page

WriteEditor

  • react-quill editor ์‚ฌ์šฉ์œผ๋กœ ์œ ์ € ํŽธ์˜ ๋„๋ชจ

TagsInput

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๋„์„œ์— ๋Œ€ํ•œ ์ž„์˜์˜ ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Œ
  • ์—”ํ„ฐ ํ›„ ํƒœ๊ทธ ์Šคํƒ€์ผ๋ง์„ ํ†ตํ•ด UI ํ–ฅ์ƒ

StarRate

  • ๋„์„œ์— ๋Œ€ํ•œ ์ž„์˜์˜ ๋ณ„์ ์„ ๋งค๊ธธ ์ˆ˜ ์žˆ์Œ

ToggleBtn

  • ํ•ด๋‹น ๋ฆฌ๋ทฐ๋ฅผ ๊ณต๊ฐœ๊ธ€ ๋˜๋Š” ๋น„๊ณต๊ฐœ๊ธ€๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

5. Search Page

โœ” ๋„์„œ ๊ฒ€์ƒ‰๊ณผ ์œ ์ € ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์ง€

โœ” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ redux๋กœ ๊ด€๋ฆฌ

SearchForm

  • ๋žœ๋”ฉํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ
  • react sticky library๋ฅผ ํ†ตํ•ด sticky ํšจ๊ณผ

bookInfo

  • ์•Œ๋ผ๋”˜ api๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ Grid item์œผ๋กœ ์ถœ๋ ฅ
  • ํ•ด๋‹น ์ฑ…์„ ํด๋ฆญํ•˜๋ฉด bookDetail page๋กœ ์ด๋™

Person

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๊ฐ€์ž…ํ•œ ์œ ์ €์˜ ๋‹‰๋„ค์ž„์œผ๋กœ ๊ฒ€์ƒ‰
  • ํ•ด๋‹น ์œ ์ €๋ฅผ ํด๋ฆญํ•˜๋ฉด peopleDetail page๋กœ ์ด๋™

6. MyPage

MyInfo

  • ๋‚ด ์ •๋ณด ๋ณด์—ฌ์ฃผ๊ธฐ
  • ํ”„๋กœํ•„ ์‚ฌ์ง„ ์—…๋กœ๋“œ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ €์žฅ ํ›„ filepath, ์„ ํ˜ธ ์žฅ๋ฅด, ์ž๊ธฐ์†Œ๊ฐœ์™€ ํ•จ๊ป˜ ๋‚ด ์ •๋ณด ์—…๋กœ๋“œ

MyReview

  • ๊ณต๊ฐœ๋œ ๋ฆฌ๋ทฐ / ๋น„๊ณต๊ฐœ ๋ฆฌ๋ทฐ
  • 1ํŽ˜์ด์ง€์— ๋ฆฌ๋ทฐ 4๊ฐœ์”ฉ ์ƒˆ๋กœ ๋ฐ›์•„์˜ค๋„๋ก ๊ตฌํ˜„
  • ๋ฌดํ•œ ์Šคํฌ๋กค ํŽ˜์ด์ง€๋„ค์ด์…˜ : 'react-intersection-observer'์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งˆ์ง€๋ง‰ item์— ref๋ฅผ ์ฐธ์กฐํ•˜์—ฌ page๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋” ์ด์ƒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ’์ด ์—†์„ ๋•Œ fetchReview๋ฅผ ์ค‘์ง€์‹œํ‚ด

LikeReview

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„์š” ํ‘œ์‹œํ•œ ๋ฆฌ๋ทฐ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ
  • useCheck ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ฒดํฌ ํ‘œ์‹œ์˜ value๊ฐ’์ด ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ๋ฅผ useEffect๋กœ ํƒ์ง€ํ•˜์—ฌ UnLike API๋ฅผ ํ˜ธ์ถœ

7. Review Page

  • ๋ฌดํ•œ ์Šคํฌ๋กค ํŽ˜์ด์ง€๋„ค์ด์…˜ react-infinite-scroll-component ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํฌ๋กค ์‹œ page๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์ถœ๋ ฅ.
  • ์ตœ์‹ ์ˆœ / ์ธ๊ธฐ์ˆœ์œผ๋กœ isSelected state ๋ณ€๊ฒฝ ์‹œ fetchReviews ํ˜ธ์ถœ ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์ถœ๋ ฅ

ReviewItem

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๋„์„œ image, ๋„์„œ๋ช…, ๋ฆฌ๋ทฐ ๋ณ„์ , ๋ฆฌ๋ทฐ ๋‚ด์šฉ(summary), ๋ฆฌ๋ทฐ์–ด ๋‹‰๋„ค์ž„ ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ ํด๋ฆฌ ์‹œ ํ•ด๋‹น ๋„์„œ์˜ Review Detail Page๋กœ ์ด๋™

8. Review Detail Page

BookInfo

  • ๋„์„œ image, ๋„์„œ ์ •๋ณด ์ถœ๋ ฅ
  • ๋„์„œ image, ๋„์„œ ์ œ๋ชฉ ํด๋ฆญ ์‹œ ํ•ด๋‹น ๋„์„œ์˜ Book Detail Page๋กœ ์ด๋™

UserReview

๐Ÿ‘€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
- ๋น„๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž - ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž
  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ์ž ํ”„๋กœํ•„ image, ๋‹‰๋„ค์ž„, ๋ฆฌ๋ทฐ ๋ณ„์ , ๋ฆฌ๋ทฐ ํƒœ๊ทธ, ๋ฆฌ๋ทฐ ๋‚ด์šฉ(html ์ถœ๋ ฅ), ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์‹œ๊ฐ„ ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ ์ข‹์•„์š” ๊ธฐ๋Šฅ
    • ๋น„๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž
      • '๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์„ธ์š”'๋ผ๋Š” ๊ฒฝ๊ณ ์ฐฝ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค
    • ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž

9. People Page

๐Ÿ‘€ ์ƒ์„ธ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
- 1๊ฐœ ๋ฏธ๋งŒ ์„ ํƒ - 1๊ฐœ ์ด์ƒ 3๊ฐœ ์ดํ•˜ ์„ ํƒ - 3๊ฐœ ์ดˆ๊ณผ ์„ ํƒ
  • ๋ฌดํ•œ ์Šคํฌ๋กค ํŽ˜์ด์ง€๋„ค์ด์…˜ react-infinite-scroll-component ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํฌ๋กค ์‹œ page๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์ถœ๋ ฅ.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์žฅ๋ฅด ๋ฒˆํ˜ธ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด isSelected์— ์ €์žฅ ํ›„ ์žฅ๋ฅด ๋ฒˆํ˜ธ ์ˆœ์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ state ๋ณ€๊ฒฝ ์‹œ fetchPerson ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๋ฆฌ๋ทฐ์–ด ์ถœ๋ ฅ
    • 1๊ฐœ ๋ฏธ๋งŒ ์„ ํƒ
      • 1๊ฐœ ๋ฏธ๋งŒ์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ 0๋ฒˆ์งธ ์ˆœ์„œ์ธ ์†Œ์„ค ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ setIsSelected([0]);
    • 1๊ฐœ ์ด์ƒ 3๊ฐœ ์ดํ•˜ ์„ ํƒ
      • isSelected.sort();๋กœ ์žฅ๋ฅด ๋ฒˆํ˜ธ ์ˆœ์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
    • 3๊ฐœ ์ดˆ๊ณผ ์„ ํƒ
      • 4๊ฐœ์งธ ์„ ํƒํ•˜๋Š” ์žฅ๋ฅด ๋ฒˆํ˜ธ pop ํ›„, ๊ธฐ์กด์— ์ถœ๋ ฅ๋œ ๋ฆฌ๋ทฐ์–ด ๋ฐ์ดํ„ฐ ์œ ์ง€ isSelected.pop();

Person

๐Ÿ‘€ ์ƒ์„ธ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ
  • ๋ฆฌ๋ทฐ์–ด ํ”„๋กœํ•„ image, ๋‹‰๋„ค์ž„, ์žฅ๋ฅด, ์ž๊ธฐ์†Œ๊ฐœ(summary) , ์ž‘์„ฑ ๋ฆฌ๋ทฐ ์ˆ˜ ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ์–ด ํ”„๋กœํ•„ image ์ƒ‰์ƒ์— ๋”ฐ๋ผ ํ”„๋กœํ•„ background ์ƒ‰์ƒ ๋ณ€๊ฒฝ
  • ๋ฆฌ๋ทฐ์–ด ํด๋ฆฌ ์‹œ People Detail page๋กœ ์ด๋™

10. People Detail Page

Person(์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ)

  • ๋ฆฌ๋ทฐ์–ด profile image, ๋‹‰๋„ค์ž„, ์žฅ๋ฅด, ์ž๊ธฐ์†Œ๊ฐœ(summary) , ์ž‘์„ฑ ๋ฆฌ๋ทฐ ์ˆ˜ ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ์–ด profile image ์ƒ‰์ƒ์— ๋”ฐ๋ผ ํ”„๋กœํ•„ background ์ƒ‰์ƒ ๋ณ€๊ฒฝ

ReviewItem(์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ)

  • ํ•ด๋‹น ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ ์ถœ๋ ฅ
  • ๋„์„œ image, ๋„์„œ๋ช…, ๋ฆฌ๋ทฐ ๋ณ„์ , ๋ฆฌ๋ทฐ ๋‚ด์šฉ(summary), ๋ฆฌ๋ทฐ์–ด ๋‹‰๋„ค์ž„ ์ถœ๋ ฅ
  • ๋ฆฌ๋ทฐ ํด๋ฆญ ์‹œ Review Detail Page๋กœ ์ด๋™

Server

Rebook

https://www.rebook-project.site/

API Documentation

๐Ÿ“Œ Notion

Execute Command

npm run dev

Technologies

  • Javascript(Nodejs)
  • Nestjs
  • JWT
  • MySQL, AWS(EC2, PM2, multer-S3)
  • CORS

Library

  • dotenv
  • jsonwebtoken
  • helmet
  • winston

Model

แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„†แ…ฉแ„ƒแ…ฆแ†ฏแ„…แ…ตแ†ผ

System Structure

แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ฎแ„Œแ…ฉ


Team

Frond-End Back-End
์ฐจ์œ ์ง„ ์ฃผํ˜œ๋ฏธ
์ด์Šน๋ฏผ ์ตœ์ธ์ง€
๋งˆ์ฃผ์€ ์ด์˜ˆ์•ˆ

About

๐Ÿ“– Book Review Web Application

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages