Skip to content

Jaehoo-dev/warren-buffett-test-server

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

90 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ˆ ์›Œ๋Ÿฐ๋ฒ„ํ•ํ…Œ์ŠคํŠธ500

  • ์ด์šฉ์ž ์ทจํ–ฅ์„ ๋ถ„์„ํ•ด ์ฃผ์‹ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ถ”์ฒœํ•ด ์ฃผ๋Š” ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿ—‚ ๊นƒํ—™ ์ €์žฅ์†Œ

๐ŸŽฌ ์‹œ์—ฐ ์˜์ƒ

preview

๐Ÿ“ข ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ์˜์ƒ

๐Ÿ”— ๋ฐฐํฌ ์ฃผ์†Œ

  • https://warrenbuffett-test500.site/
  • ๋ฌด๋ฃŒ API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. API ์š”์ฒญ ์ œํ•œ ํšŸ์ˆ˜๋ฅผ ๋„˜์œผ๋ฉด ์›น์‚ฌ์ดํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ผ๋ถ€ ๋‚ด์šฉ์ด undefined๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฎ ์‹คํ–‰ ๋ฐฉ๋ฒ•

  • ํ”„๋ก ํŠธ์—”๋“œ

    • Git์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ๋ฐ›์Šต๋‹ˆ๋‹ค.

      git clone https://github.com/WarrenBuffettTest500/Client.git
      cd Client
      npm install
    • root ๋””๋ ‰ํ† ๋ฆฌ์— .env ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      npm i -D dotenv
      REACT_APP_API_KEY=<firebase api key>
      REACT_APP_AUTH_DOMAIN=<firebase auth domain>
      REACT_APP_PROJECT_ID=<firebase project id>
      REACT_APP_STORAGE_BUCKET=<firebase storage bucket>
      REACT_APP_MESSAGING_SENDER_ID=<firebase sender id>
      REACT_APP_APP_ID=<firebase app id>
      REACT_APP_DB_URL=<firebase database url>
      REACT_APP_X_RAPIDAPI_KEY=<rapidapi key> // ์ฃผ์‹ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      REACT_APP_LOCALHOST=http://localhost:8080
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      npm start
  • ๋ฐฑ์—”๋“œ

    • Git์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ๋ฐ›์Šต๋‹ˆ๋‹ค.

      git clone https://github.com/WarrenBuffettTest500/Server.git
      cd Server
      npm install
    • root ๋””๋ ‰ํ† ๋ฆฌ์— .env ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      npm i -D dotenv
      PORT=8080
      JWT_SECRET_KEY=some_long_random_string_to_use_as_jwt_secret_key
      MYSQL_HOST=<mySQL url>
      MYSQL_USERNAME=<mySQL username>
      MYSQL_PASSWORD=<mySQL password>
      MYSQL_DATABASE=<mySQL database>
      X_RAPIDAPI_KEY=<rapidapi key> // ์ฃผ์‹ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      npm i -D nodemon
      npm run dev

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๋™๊ธฐ

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

๐Ÿ”Ž ํ”„๋กœ์ ํŠธ ์„ค๋ช…

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

  • ํ”„๋ก ํŠธ์—”๋“œ
    • ECMAScript2015+
    • ReactJS
    • Redux (Redux-Toolkit)
    • D3
    • Sass
  • ๋ฐฑ์—”๋“œ
    • Node.js
    • Express
    • MySQL (Google Cloud)
    • Sequelize
    • AWS (CodePipeline, Elastic Beanstalk)

๐Ÿ•น ๊ธฐ๋Šฅ (๊ฐ ์†Œ์ œ๋ชฉ ์˜† ๊ด„ํ˜ธ๋Š” ๊ด€๋ จ mySQL ๋ชจ๋ธ ์ด๋ฆ„)

  1. ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ (user)
    • Firebase๋ฅผ ์ด์šฉํ•ด ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„์—์„œ ์ด์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  JsonWebToken์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ํ† ํฐ์„ ๋ฐ›์•„ local storage์— ๋‹ด์Šต๋‹ˆ๋‹ค.
    • ์ดํ›„ local storage์— ํ† ํฐ์ด ์žˆ๋‹ค๋ฉด ๋ณ„๋„ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ํ† ํฐ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด ์ด์šฉ์ž ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
    • ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์•„๋„ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋‘˜๋Ÿฌ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ถ”์ฒœ๋ฐ›์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
    • ์ด์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ฉด users ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Firebase๋ฅผ ํ†ตํ•ด ๋ฐ›์€ uid๋ฅผ primary key๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  preferenceInfoId๋ฅผ foreign key๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์•„๋ž˜ preferenceInfo์™€ portfolioItem๋“ค๋„ cascade๋กœ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.
  2. ํˆฌ์ž์„ฑํ–ฅ ์„ค์ • (preferenceInfo)
    • ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ฉด ํˆฌ์ž์„ฑํ–ฅ์„ ๋“ฑ๋กํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.
    • ๊ด€์‹ฌ ์„นํ„ฐ์™€ ์œ„ํ—˜ ์„ ํ˜ธ๋„, ์ž์‚ฐ ์ค‘ ์ฃผ์‹ ๋น„์ค‘, ์„ ํ˜ธ ์ฃผ์‹ ์ข…๋ฅ˜, ์˜ˆ์ƒ ํˆฌ์ž ๊ธฐ๊ฐ„ ๋“ฑ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ถ”์ฒœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ํˆฌ์ž์„ฑํ–ฅ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•„๋„ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํˆฌ์ž์„ฑํ–ฅ์— ๊ธฐ๋ฐ˜ํ•œ ํฌํŠธํด๋ฆฌ์˜ค ์ถ”์ฒœ์€ ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ์— ํˆฌ์ž์„ฑํ–ฅ์„ ์„ค์ •ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ด ๋“ฑ๋ก์„ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
    • preferenceInfo๋“ค์€ ์ด์šฉ์ž uid๋ฅผ foreign key๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  3. ํฌํŠธํด๋ฆฌ์˜ค ๋“ฑ๋ก (portfolioItem)
    • ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ ํŽ˜์ด์ง€์—์„œ ๋ณด์œ  ์ฃผ์‹์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์—… ์‹ฌ๋ณผ๊ณผ ํ‰๊ท ๋‹จ๊ฐ€, ๋ณด์œ ๋Ÿ‰์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ž…๋ ฅํ•œ ์ •๋ณด๋Š” portfolioItems ํ…Œ์ด๋ธ”์— ํ–‰์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Foreign key๋กœ userUid๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    • ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๊ฐ ๊ธฐ์—…๋ณ„ ๋น„์ค‘์„ ์› ๊ทธ๋ž˜ํ”„๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. D3๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์› ๊ทธ๋ž˜ํ”„์—์„œ ๊ธฐ์—… ํŒŒ์ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๊ธฐ์—… ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ์™ธ๋ถ€ api๋ฅผ ์ด์šฉํ•ด ์‹ค์‹œ๊ฐ„ ์ฃผ์‹ ๊ฐ€๊ฒฉ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด ์ž์‚ฐ๊ณผ ์ „์ฒด ์ˆ˜์ต, ์ „์ฒด ์ˆ˜์ต๋ฅ , ๊ฐ ๊ธฐ์—…๋ณ„ ์†์ต๊ณผ ์ˆ˜์ต๋ฅ  ๋“ฑ์„ ๊ณ„์‚ฐํ•ด์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ˆซ์ž๋ฅผ ๋ถ€๋™ ์†Œ์ˆ˜์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๋Š” Decimal์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฉ”์ธํŽ˜์ด์ง€ ํฌํŠธํด๋ฆฌ์˜ค ์ถ”์ฒœ
    • ์ด์šฉ์ž๋Š” ํˆฌ์ž์„ฑํ–ฅ ๋˜๋Š” ๋ณด์œ ์ฃผ์‹์„ ๊ธฐ์ค€์œผ๋กœ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ถ”์ฒœ๋ฐ›๋„๋ก ๊ณ ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํˆฌ์ž์„ฑํ–ฅ ๊ธฐ์ค€ (content-based filtering)
      • ์ด์šฉ์ž๋“ค์ด ๋“ฑ๋กํ•œ ํˆฌ์ž์„ฑํ–ฅ์„ ์ˆ˜์น˜ํ™”ํ•ด ๊ฐ ์ด์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
      • ๋กœ๊ทธ์ธํ•œ ์ด์šฉ์ž์™€ ๋‚˜๋จธ์ง€ ์ด์šฉ์ž๋“ค ์‚ฌ์ด์˜ Euclidean distance๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ์ˆœ์„œ๋กœ ์ •๋ ฌํ•œ ๋’ค ๊ฐ ์ด์šฉ์ž์˜ ํฌํŠธํด๋ฆฌ์˜ค ์ •๋ณด๋ฅผ ๋ฌถ์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ๋ณด์œ ์ฃผ์‹ ๊ธฐ์ค€ (user-based collaborative filtering)
      • ๋ณด์œ ์ฃผ์‹์„ ๊ธฐ์ค€์œผ๋กœ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ถ”์ฒœํ•  ๋• ์ด์šฉ์ž๋“ค ์‚ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ ์žฌ๋Š” ๋ฐฉ๋ฒ•์ด ์ ์ ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ „ ์žฌ์‚ฐ์ด 100๋งŒ ์›์ด๋ฉด์„œ ์• ํ”Œ ์ฃผ์‹์„ 100๋งŒ ์› ๋ณด์œ ํ•œ ์‚ฌ๋žŒ๊ณผ ์ „ ์žฌ์‚ฐ์ด 1000์–ต ์›์ด๋ฉด์„œ ์• ํ”Œ ์ฃผ์‹์„ 1000์–ต ์› ๋ณด์œ ํ•œ ์‚ฌ๋žŒ์€ euclidean distance์ด ๋ฉ€์ง€๋งŒ ์ทจํ–ฅ์€ ๋งค์šฐ ๋น„์Šทํ•จ)
      • ๋”ฐ๋ผ์„œ ๋ณด์œ ์ฃผ์‹์„ ๊ธฐ์ค€์œผ๋กœ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ถ”์ฒœํ•  ๋• cosine similarity๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ธฐ์šธ๊ธฐ๋ฅผ ์ด์šฉํ•œ ์…ˆ์ž…๋‹ˆ๋‹ค.
      • ์ด์šฉ์ž๋“ค์˜ ๋ฒกํ„ฐ๊ฐ’์ด ๋ณด์œ  ์ฃผ์‹์„ ํ† ๋Œ€๋กœ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
      • ๋กœ๊ทธ์ธํ•œ ์ด์šฉ์ž์™€ ๋‚˜๋จธ์ง€ ์ด์šฉ์ž๋“ค ์‚ฌ์ด์˜ cosine similarity๋ฅผ ๊ณ„์‚ฐํ•ด ์ทจํ–ฅ์ด ๋น„์Šทํ•œ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ํˆฌ์ž์„ฑํ–ฅ ๊ธฐ์ค€ ์ถ”์ฒœ์ด ๋ณด์œ ์ฃผ์‹ ๊ธฐ์ค€ ์ถ”์ฒœ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ „์ž๋Š” ํˆฌ์ž์„ฑํ–ฅ์„ ์‚ฌ์šฉํ•ด ๊ฑฐ๋ฆฌ๋ฅผ ์žฌ๊ณ  ์ •๋ ฌ์„ ๋งˆ์นœ ๋’ค ํฌํŠธํด๋ฆฌ์˜ค ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด ํ›„์ž๋Š” ์ฒ˜์Œ์— ํฌํŠธํด๋ฆฌ์˜ค ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋’ค ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • Intersection Observer API๋ฅผ ์ด์šฉํ•ด ํ˜„์žฌ ๋ถˆ๋Ÿฌ์˜จ ํฌํŠธํด๋ฆฌ์˜ค ๊ฐ€์šด๋ฐ ๋งˆ์ง€๋ง‰ ํฌํŠธํด๋ฆฌ์˜ค๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด ๋‹ค์Œ ํฌํŠธํด๋ฆฌ์˜ค 15๊ฐœ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์šฉ์ž๋Š” ์ถ”์ฒœ๋ฐ›์€ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋ˆŒ๋Ÿฌ ํฌํŠธํด๋ฆฌ์˜ค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ณธ์ธ์˜ ํฌํŠธํด๋ฆฌ์˜ค ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ”์„ ๋•Œ์™€ ๋‹ฌ๋ฆฌ ์ž์‚ฐ ๊ทœ๋ชจ์™€ ์†์ต, ์ˆ˜์ต๋ฅ  ๋“ฑ์€ ๋ณด์ด์ง€ ์•Š๊ณ  ํฌํŠธํด๋ฆฌ์˜ค์— ๋“ค์–ด ์žˆ๋Š” ๊ธฐ์—…๋“ค๊ณผ ํ˜„์žฌ ๊ฐ€๊ฒฉ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹ (hit)
    • ์ด์šฉ์ž๊ฐ€ ํŠน์ • ๊ธฐ์—… ์ƒ์„ธํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด hits ํ…Œ์ด๋ธ”์— timestamp์™€ ํ•จ๊ป˜ ์กฐํšŒ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹ ๋ชฉ๋ก์„ ์กฐ์ž‘ํ•˜๋Š” ๋“ฑ ์˜ค๋‚จ์šฉ ์‹œ๋„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ์ด์šฉ์ž๊ฐ€ 30๋ถ„ ์•ˆ์— ๊ฐ™์€ ๊ธฐ์—…์„ ์กฐํšŒํ–ˆ์„ ๋•Œ๋Š” ์กฐํšŒ ์ •๋ณด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์šฉ์ž๋Š” cookie๋ฅผ ์ด์šฉํ•ด ํŒ๋ณ„ํ•˜๊ณ  ์‹œ๊ฐ„์€ updatedAt์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” 1๋ถ„์— ํ•œ ๋ฒˆ ์„œ๋ฒ„์— ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹ ์ •๋ณด๋ฅผ ์š”์ฒญํ•ด ํ™”๋ฉด์— ๋„์›๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„๋Š” ํ•œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ 30๋ถ„์ด ์ง€๋‚œ ์กฐํšŒ ์ •๋ณด๋“ค์„ ์ง€์›๋‹ˆ๋‹ค. Cronjob์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  6. ์ƒ์„ธํŽ˜์ด์ง€
    • ์ƒ์„ธํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด ํ•ด๋‹น ๊ธฐ์—…์˜ ์ฃผ๊ฐ€ ๊ทธ๋ž˜ํ”„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ณ„, ์ฃผ๋ณ„, ์›”๋ณ„๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. D3๋กœ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ๊ธฐ์—…๊ณผ ์„นํ„ฐ ๋ฐ ์‚ฐ์—…์ด ๊ฐ™๊ณ  ์‹œ๊ฐ€์ด์•ก์ด 0.5๋ฐฐ์—์„œ 1.5๋ฐฐ ์ด๋‚ด์ธ ๊ธฐ์—…๋“ค์„ ๋„์›Œ์ค๋‹ˆ๋‹ค.
    • ํŠน์ • ๊ธฐ์—…์˜ ์ƒ์„ธํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์ด์šฉ์ž๋“ค๋ผ๋ฆฌ ์ฑ„ํŒ…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Firebase Realtime Database๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“… ์ž‘์—… ํ๋ฆ„

  • 2020.11.30 ~ 2020.12.4 (1์ฃผ): ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ, ๊ธฐํš, ๋ชฉ์—… ๊ตฌ์ถ•
    • ์ถ”์ฒœ, ์‹œ๊ฐํ™”, ๋ฐฉ๋ฌธ์ž ์ถ”์ , ๋ฐ์ดํ„ฐ ๋“ฑ ํ•ต์‹ฌ์–ด๋ฅผ ๋“ค๊ณ  ์•„์ด๋””์–ด๋ฅผ ๊ตฌ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์†Œ์žฌ ํ›„๋ณด๋กœ ์ฃผ์‹, ์˜ํ™”, ์ฑ… ๋“ฑ์„ ๋†“๊ณ  ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์ ์„ ์ด์šฉํ•œ ์˜ํ™” ์ถ”์ฒœ์€ ์‹์ƒํ•˜๊ณ  ์ฑ…์€ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋„“๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ฒ”์œ„๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ•œ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์‹์„ ๊ณจ๋ž์Šต๋‹ˆ๋‹ค. ๋˜ ์ฃผ์‹์€ ์ถ”์ฒœ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์†Œ์žฌ๋กœ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ฒ˜์Œ์—” mobile-first ๋ฐ˜์‘ํ˜• ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ƒํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„ ๊ด€๊ณ„์ƒ ๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด์— ๊ตฌ์„ฑ์„ ๋งž์ท„์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธํŽ˜์ด์ง€๋งŒ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด ํฌ๊ธฐ์— ๋Œ€์‘ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. Figma๋ฅผ ์ด์šฉํ•ด ๋ชฉ์—…์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ์จ๋ด์„œ ํ•˜๋ฃจ๋ฅผ ๋“ค์—ฌ SQL์„ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์Šคํ‚ค๋งˆ ๋ชจ๋ธ๋ง์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ๋Š” sequelize๊ฐ€ mongoose์™€ ๋น„์Šทํ•œ ๋ฉด์ด ๋งŽ์•„ ๋‹คํ–‰ํžˆ ๊ฑธ๋ฆผ๋Œ์ด ํฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
    • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ณผ์ œ๋“ค์„ ์ตœ๋Œ€ํ•œ ์ž˜๊ฒŒ ๋‚˜๋ˆ  ํ…Œ์Šคํฌ์นด๋“œ๋“ค์„ ๋งŒ๋“ค๊ณ  ๊ฐœ๋ฐœ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์ œ ๋ฐ ์ผ์ •์€ ๋…ธ์…˜์œผ๋กœ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • 2020.12.07 ~ 2020.12.18 (2์ฃผ): ๊ฐœ๋ฐœ
    • Git, eslint, database, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ ์„ค์ •
    • ์ฃผ์‹ ์ •๋ณด api ํƒ์ƒ‰
    • S&P500 ๊ธฐ์—… ๊ธฐ๋ณธ ์ •๋ณด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•
    • ์ด์šฉ์ž ๋ฐ ํˆฌ์ž์„ฑํ–ฅ, ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
    • ์ด์šฉ์ž ์ธ์ฆ
    • ์ฃผ์‹ ์ •๋ณด ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ api ์ž‘์„ฑ
    • ๋ฉ”์ธํŽ˜์ด์ง€, ํฌํŠธํด๋ฆฌ์˜คํŽ˜์ด์ง€, ์ƒ์„ธํŽ˜์ด์ง€ UI ์ œ์ž‘
    • ์› ๊ทธ๋ž˜ํ”„ ๋ฐ ์บ”๋“ค์Šคํ‹ฑ ์ฐจํŠธ ์ œ์ž‘ (D3)
    • ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•™์Šต ๋ฐ ์ž‘์„ฑ
    • ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹ ๊ตฌํ˜„ (hits ํ…Œ์ด๋ธ” ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ)

๐Ÿงถ ์ง๋ฉด ๊ณผ์ œ (๋ฐ ํ•ด๊ฒฐ ๊ณผ์ •) + ๋Š๋‚€์ 

๐Ÿ“Š ์›Œ๋Ÿฐ๋ฒ„ํ•ํ…Œ์ŠคํŠธ'500' - S&P500 ๊ธฐ์—…์œผ๋กœ ํ•œ์ •

  • ์ฃผ์‹ ์ •๋ณด์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด ์™ธ๋ถ€ api์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ api๋งˆ๋‹ค ์ œ๊ณตํ•˜๋Š” ์ •๋ณด๊ฐ€ ๊ฐ๊ธฐ ํŒŒํŽธ์ ์ด๋ผ๋Š” ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ ์–ด๋–ค ์ƒ์žฅ์‚ฌ๋“ค์ด ์žˆ๋Š”์ง€ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” api๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ธฐ์—…์„ ์กฐํšŒํ•œ ์ด์šฉ์ž์—๊ฒŒ ๋น„์Šทํ•œ ๊ธฐ์—…๋“ค์„ ์ถ”์ฒœํ•˜๋ ค๋ฉด ์ƒ์žฅ์‚ฌ ์ „์ฒด ๋ชฉ๋ก์ด ๊ผญ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—…์„ S&P500์— ํฌํ•จ๋œ ๊ธฐ์—…์œผ๋กœ ํ•œ์ •ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • companyProfiles๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๊ฐ ๊ธฐ์—…์˜ ์„นํ„ฐ, ์‚ฐ์—…, ์‹œ๊ฐ€์ด์•ก ๋“ฑ์„ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ค์ œ ์„œ๋น„์Šค๋ผ๋ฉด ์‹œ๊ฐ€์ด์•ก์ฒ˜๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ์ •๋ณด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ด์œผ๋ฉด ์•ˆ ๋˜๊ฒ ์ง€๋งŒ api ์š”์ฒญ์„ ๋‚ด๋ณด๋‚ด๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋ ค ๊ณ ์œก์ฑ…์„ ์ผ์Šต๋‹ˆ๋‹ค.

๐Ÿ’พ MySQL

  • ์ด์ „๊นŒ์ง€ mongoDB๋งŒ ์“ฐ๋‹ค๊ฐ€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ์œผ๋กœ ๋‹ค๋ค„์„œ ์• ๋ฅผ ๋จน์—ˆ์Šต๋‹ˆ๋‹ค.
  • NoSQL์˜ sub-schema์— ์ต์ˆ™ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ nested array ๋˜๋Š” nested object๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์‚ฌ๊ณ ๋ฅผ ํ•˜๋Š” ํƒ“์— ๋ชจ๋ธ์„ ์งœ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์ƒ๊ฐ์„ ํ•˜๋ ค๋‹ˆ '๊ด€๊ณ„ํ˜•' ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ด€๊ณ„๊ฐ€ ๋Š๊ธฐ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ user ๋ชจ๋ธ์ด ์ด์šฉ์ž์˜ portfolio๋‚˜ portfolioItems๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ๊ฒฐ๊ตญ portfolioItems ๊ฐ๊ฐ์— userUid๋ฅผ foreign key๋กœ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ์ด์šฉ์ž์˜ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ฐพ๊ณ ์ž ํ•œ๋‹ค๋ฉด portfolioItems๋ฅผ ๋ชจ๋‘ ํ›‘์œผ๋ฉฐ where๋กœ ํ•ด๋‹น ์ด์šฉ์ž์—๊ฒŒ ์†Œ์†ํ•œ ํ–‰๋“ค๋งŒ ๋ฝ‘์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜๋„ ACID ์†์„ฑ ๋“ฑ SQL์˜ ๊ฐ•์ ์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›ํƒˆํ‡ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด cascade ๊ธฐ๋Šฅ์„ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.
  • ์ด์ „ ํ”„๋กœ์ ํŠธ(https://github.com/Goo-Git)์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ผ์œผ๋ฉด ์ข‹์•˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ „ ํ”„๋กœ์ ํŠธ '๊ตฌ๊นƒ'์€ ๋ฌธ์„œ ๋ฒ„์ „๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ˜‘์—… ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.
    • ๋‹น์‹œ mongoDB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“  ๋’ค ์ƒˆ ๋ฌธ์„œ๋ฅผ ๋‹ด๊ธฐ ์ „์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ๋“ฑ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์šฉ์ž๋“ค์ด ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ๋™์‹œ์— ์ž‘์—…ํ•œ ๋’ค ๊ฐ๊ฐ ์ €์žฅํ–ˆ์„ ๋• ๋ฌธ์„œ๋ฅผ ๋ธŒ๋žœ์น˜์— ์–ด๋–ป๊ฒŒ ๋ง๋ถ™์ผ์ง€๋„ ์ƒ๊ฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํŠนํžˆ ์‚ญ์ œ ์ž‘์—…์„ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์—ฌ์ง€๊ฐ€ ๋งŽ๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•  ๋ธŒ๋žœ์น˜๋ฅผ ๋จผ์ € ์ง€์šธ์ง€, ๋ฌธ์„œ๋“ค์„ ํ›‘์œผ๋ฉฐ ๋จผ์ € ์ง€์šธ์ง€, ๋ธŒ๋žœ์น˜๋ฅผ ๊ณต์œ ํ•œ ์ด์šฉ์ž๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋จผ์ € ๋Š์–ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋กค๋ฐฑํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ๋„ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋Ÿด ๋•Œ '๊ด€๊ณ„ํ˜•' ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํž˜์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์ ์…˜ ๋‹จ์œ„๋กœ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ๋กค๋ฐฑํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • Join ๋“ฑ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์ง•์ด ๋‘๋“œ๋Ÿฌ์ง€๋Š” ๋ฌธ๋ฒ• ์ž์ฒด๋Š” ๊ณต๋ถ€ํ–ˆ์œผ๋‚˜ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„์ง ๊ฐ์„ ์žก์ง€ ๋ชปํ•ด ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ์‹ค์‚ฌ์šฉํ•˜์ง€ ๋ชป ํ•œ ์ ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์ถ”ํ›„์— ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์ž‘์—…๋„ ์‹œ๋„ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽจ D3

  • ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ธ ๋•Œ ์ข…์ข… ์–ด๋ ค์›€์„ ๊ฒช์Šต๋‹ˆ๋‹ค. ๋’ค์—์„œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”์ง€ ํ™•์‹คํžˆ ๋ชจ๋ฅด๋Š” ์ฑ„ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ๋ณด๋‹ค๋Š” ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ํŽธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • D3๋Š” ํŠนํžˆ๋‚˜ ๋ฆฌ์•กํŠธ์™€ ํ•จ๊ป˜ ์“ฐ๋ฉด์„œ ์ดˆ๋ฐ˜์— ์• ๋ฅผ ๋จน์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด ํฌํŠธํด๋ฆฌ์˜คํŽ˜์ด์ง€์—์„œ ํฌํŠธํด๋ฆฌ์˜ค์— ๊ธฐ์—…์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ฃผ์‹ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์Šคํ…Œ์ดํŠธ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋ฐ ๋งž์ถฐ ์› ๊ทธ๋ž˜ํ”„๋„ ๋‹ค์‹œ ๊ทธ๋ ค์ ธ์•ผ ํ–ˆ๋Š”๋ฐ ํŒŒ์ด ํฌ๊ธฐ๋Š” ๋ณ€ํ•˜์ง€๋งŒ ๊ธฐ์กด ํ…์ŠคํŠธ์™€ ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ๊ฐ€ ๊ฒน์ณ์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ DOM์— ๊ธฐ์กด ํ…์ŠคํŠธ๊ฐ€ ๋‚จ์•„ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์› ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ง์ „์— svg์—์„œ ์ด์ „ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—ƒ Item-based Collaborative Filtering

  • ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋Œ€ํ‘œ์ ์œผ๋กœ content-based filtering๊ณผ collaborative filtering์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  collaborative filtering์€ ๋‹ค์‹œ user-based collaborative filtering๊ณผ item-based collaborative filtering์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  • Content-based์™€ user-based๋Š” ๊ตฌํ˜„์„ ํ–ˆ์ง€๋งŒ item-based๋Š” ์‹œ๊ฐ„์ด ๋ชจ์ž๋ผ๊ณ  ๋ณต์žกํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งœ์ง€ ๋ชป ํ•œ ์ ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
  • Item-based collaborative filtering์€ ์•„๋งˆ์กด์ด ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. User-based๊ฐ€ ์ด์šฉ์ž๋“ค์„ ๊ฐ๊ฐ ๋น„๊ตํ•ด ์ถ”์ฒœ์„ ํ•œ๋‹ค๋ฉด item-based๋Š” item ๊ฐ๊ฐ, ์›Œ๋Ÿฐ๋ฒ„ํ•ํ…Œ์ŠคํŠธ500์— ์ ์šฉํ•œ๋‹ค๋ฉด ์ฃผ์‹ ๊ฐ๊ฐ์„ ๋น„๊ตํ•ด์„œ ์ถ”์ฒœ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ์ด User โ†’ item์ด ์•„๋‹ˆ๋ผ item โ†’ user๋กœ ๋ฐ˜๋Œ€์ธ ์…ˆ์ž…๋‹ˆ๋‹ค.

๐Ÿฅ‡ ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹

  • ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹ ๊ธฐ๋Šฅ์„ ๋งˆ์ง€๋ง‰์— ๋„ฃ๊ณ  ๋ณด๋‹ˆ ์ด์ „ ์ธ๊ธฐ ์ฃผ์‹ ๋ชฉ๋ก๊ณผ ๋น„๊ตํ•ด์„œ ์ˆœ์œ„ ๋“ฑ๋ฝ์„ ํ‘œ์‹œํ•ด ์ฃผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ๊ฐ๋ณด๋‹ค ์ž‘์—…์ด ํด ๊ฒƒ ๊ฐ™์•„์„œ ์‹คํ–‰ํ•˜์ง„ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ์„  ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ์ฃผ์‹์„ ์ด์ „ ์ˆœ์œ„์™€ ๋น„๊ตํ•˜๋ ค๋ฉด ๋‹น์—ฐํžˆ ์ด์ „ ์ •๋ณด๋ฅผ ๋“ค๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” 1๋ถ„ ๋งˆ๋‹ค ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ด ์Šคํ…Œ์ดํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ˆœ์œ„ ์ •๋ณด๋ฅผ ์ˆœ์ „ํžˆ ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ ์Šคํ…Œ์ดํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์•ˆ ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์šฉ์ž๊ฐ€ ์ตœ์ดˆ๋กœ ์ ‘์†ํ–ˆ์„ ๋• ์ด์ „ ์ˆœ์œ„ ์ •๋ณด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๋“ฑ๋ฝ์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์„ ๋• ๊ทธ๋•Œ๊ทธ๋•Œ ์ •๋ณด๋งŒ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด์šฉ์ž๋“ค ์‚ฌ์ด์— ์ˆœ์œ„๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋œจ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ˆœ์œ„ ๋“ฑ๋ฝ์„ ๋ณด์—ฌ์ฃผ๋ ค๋‹ˆ ์ด์šฉ์ž๋“ค ์‚ฌ์ด(ํŠนํžˆ ๋ฐฉ๊ธˆ ์ ‘์†ํ•œ ์ด์šฉ์ž)์— ๋“ฑ๋ฝ์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— trendingStocks์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  previous์™€ current ํ–‰์„ ๊ณ„์†ํ•ด์„œ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์ „ ๊ธฐํš์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์€ ์‚ฌ๋ก€ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%