Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

102 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“Œ Thanks for traveling

์—ฌํ–‰ํŒจํ‚ค์ง€ ์‡ผํ•‘๋ชฐ


1. ์ œ์ž‘ ๊ธฐ๊ฐ„

  • 2021๋…„ 3์›” ~ 2021๋…„ 5์›”
  • ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ

2. ์‚ฌ์šฉ ๊ธฐ์ˆ 

Front-end

  • React / Hooks
  • Redux
  • Styled-components
  • Javascript ES6+
  • Third-party-library (axios, react-hook-form ๋“ฑ)

Back-end

  • Node.js
  • Express
  • MongoDB
  • Mongoose
  • Heroku
  • Third-party-library (jwt, bcrypt ๋“ฑ)

3. ERD ์„ค๊ณ„

t4t_erd


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

์บ๋Ÿฌ์…€ ์Šฌ๋ผ์ด๋”, ํŽ˜์ด์ง€๋„ค์ด์…˜, ๊ฒ€์ƒ‰๊ธฐ๋Šฅ, ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ์„ ํ•˜์˜€์œผ๋ฉฐ
์˜ต์…˜์— ๋”ฐ๋ฅธ ์ƒํ’ˆ์ถœ๋ ฅ, ์ƒํ’ˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธฐ, ์ฃผ๋ฌธ ๋ฐ ๊ตฌ๋งคํ™•์ •, ํ‰์  ๋ฐ ๋ฆฌ๋ทฐ์ž‘์„ฑ, Q&A, ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฐ ์ƒํ’ˆ ์ƒ์„ฑ์ž…๋‹ˆ๋‹ค.

๐ŸŽž์ฃผ์š” ๊ธฐ๋Šฅ ์˜์ƒ ํŽผ์น˜๊ธฐ

4.1 ์˜ต์…˜ ๋ฐ ๊ฒ€์ƒ‰์— ๋”ฐ๋ฅธ ์ƒํ’ˆ ์ถœ๋ ฅ

4.2 ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ

4.3 ์ฃผ๋ฌธ ๋ฐ ๊ตฌ๋งค ํ™•์ •

4.4 ํ‰์  ๋ฐ ๋ฆฌ๋ทฐ ์ž‘์„ฑ

4.5 Q&A

4.6 ์ƒํ’ˆ ์—…๋กœ๋“œ


5. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

5.1 ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋ฆฌ๋•์Šค store์˜ state ์ดˆ๊ธฐํ™”

  • historyPage, CartPage ์ปดํฌ๋„ŒํŠธ์—์„œ useEffect hooks๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด ๋•Œ, post ์š”์ฒญ ๋ฐ์ดํ„ฐ๋กœ ๋ฆฌ๋•์Šค store์˜ user state๋ฅผ ์ด์šฉํ•ด ์ด์šฉ์ž์˜ ์ฃผ๋ฌธ์ •๋ณด์™€, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๊ณ 
    ์„ฑ๊ณต์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•  ๊ฒฝ์šฐ ๋ฆฌ๋•์Šค store์˜ state๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—,
    user state๋ฅผ ์ด์šฉํ•œ DB ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋•Œ๋ฌธ์— redux state ์ดˆ๊ธฐํ™”์— ๋Œ€ํ•ด ๊ตฌ๊ธ€๋ง ํ•˜์˜€์œผ๋ฉฐ, ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ redux-persist ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • redux-persist๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ redux state๋ฅผ ์›น ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ , ์ƒˆ๋กœ๊ณ ์นจ ์‹œ์—๋„ ์ €์žฅ๊ณต๊ฐ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ redux์— ๋ถˆ๋Ÿฌ์™€
    state๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

5.2 MongoDB ๋ฐฐ์—ด ํ•„๋“œ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

  • ์ƒํ’ˆ ์ฃผ๋ฌธ ํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์ฃผ๋ฌธ์ด ๋ฆฌ์ŠคํŠธ ๋งจ ์œ„์— ์˜ฌ๋ผ์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • MongoDB์—์„œ select ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋‚˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ•  ๊ฒฝ์šฐ sort() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
    ๋ฐฐ์—ด ํ•„๋“œ์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉํ•˜๋ฉด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ sort()๋Š” document๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ํƒ€์ž… ํ•„๋“œ์—์„œ์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ์œ„ํ•ด ๊ตฌ๊ธ€๋ง์„ ํ•˜์˜€๊ณ , aggregate() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

    ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ
    const history = await Payment.aggregate([
    {
      $match: { user: ObjectId(userId) },
    }
    { $unwind: "$products" },
    { $sort: { "products.createdAt": -1 } },
    {
      $lookup: {
        from: "products",
        localField: "products.productDetail",
        foreignField: "_id",
        as: "products.productDetail",
      },
    },
    { $unwind: "$products.productDetail" },
    {
      $group: {
        products: { $push: "$products" },
        _id: "$_id",
        user: { $first: "$user" },
        createdMonth: { $first: "$createdMonth" },
      },
    },
    ]).sort({ createdMonth: -1 });
  • $sort๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ, aggregate() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Mongoose์˜ populate() ๋ฉ”์†Œ๋“œ๋กœ
    products ์ปฌ๋ ‰์…˜ document๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์–ด $lookup์„ ์‚ฌ์šฉํ•ด payments ์ปฌ๋ ‰์…˜ ํ•„๋“œ์— products ์ปฌ๋ ‰์…˜ ํ•„๋“œ๋ฅผ ์กฐ์ธ,
    $group์œผ๋กœ ํŠน์ • ํ•„๋“œ ๊ทธ๋ฃนํ•‘์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

    aggregate ๊ฒฐ๊ณผ

    aggregate


6. ๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ์œผ๋กœ ๋ฆฌ์•กํŠธ๋ฅผ ๋„์ž…ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ƒ์†Œํ•œ ๊ฐœ๋…๋“ค์ธ state, props, DOM ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง, ๊ทธ๋ฆฌ๊ณ  Redux๋ฅผ ์ด์šฉํ•œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ตฌ๊ธ€๋ง, ์ฑ…, ๊ทธ๋ฆฌ๊ณ  ์˜จ๋ผ์ธ ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ ๊พธ์ค€ํ•œ ๋…ธ๋ ฅ ๋์— ๋ฆฌ์•กํŠธ๋ฅผ ์ ์  ์ต์ˆ™ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ˆ™๋ จ๋„๊ฐ€ ๋†’์•„์ ธ, ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์ด ์กฐ๊ธˆ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋А๊ปด์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” 1์ฐจ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€๋Š”๋ฐ, ์บ๋Ÿฌ์…€ ์Šฌ๋ผ์ด๋”, ํŽ˜์ด์ง€๋„ค์ด์…˜, ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜์‘ํ˜• ํŽ˜์ด์ง€ ๋“ฑ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜๊ณ ์ž ํ–ˆ์œผ๋‚˜ ํ˜ผ์ž ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ ์‹œ๊ฐ„ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์š”ํ–ˆ๊ธฐ์—, ๋žœ๋”ฉ ํŽ˜์ด์ง€๋ฅผ ์ค‘์ ์œผ๋กœ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

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

About

Thanks for Traveling๐Ÿ›ซ

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages