- ์ด์ฉ์ ์ทจํฅ์ ๋ถ์ํด ์ฃผ์ ํฌํธํด๋ฆฌ์ค๋ฅผ ์ถ์ฒํด ์ฃผ๋ ์น์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
- https://github.com/WarrenBuffettTest500/Client (ํ๋ก ํธ์๋)
- https://github.com/WarrenBuffettTest500/Server (๋ฐฑ์๋)
- https://youtu.be/jMw5MIxLY3o?t=3443 (57๋ถ 24์ด๋ถํฐ)
- 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)
- ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ (user)
- Firebase๋ฅผ ์ด์ฉํด ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ์ ํฉ๋๋ค.
- ์๋ฒ์์ ์ด์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ JsonWebToken์ ๋ฐ๊ธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํ ํฐ์ ๋ฐ์ local storage์ ๋ด์ต๋๋ค.
- ์ดํ local storage์ ํ ํฐ์ด ์๋ค๋ฉด ๋ณ๋ ๋ก๊ทธ์ธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ํ ํฐ์ ์๋ฒ์ ๋ณด๋ด ์ด์ฉ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
- ๋ก๊ทธ์ธ์ ํ์ง ์์๋ ์น์ฌ์ดํธ๋ฅผ ๋๋ฌ๋ณผ ์ ์์ง๋ง ํฌํธํด๋ฆฌ์ค๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ์ถ์ฒ๋ฐ์ ์๋ ์์ต๋๋ค.
- ์ด์ฉ์๊ฐ ํ์๊ฐ์ ์ ํ๋ฉด users ํ ์ด๋ธ์ ์ถ๊ฐํฉ๋๋ค. Firebase๋ฅผ ํตํด ๋ฐ์ uid๋ฅผ primary key๋ก ๊ด๋ฆฌํฉ๋๋ค. ์๋์์ ์ค๋ช ํ preferenceInfoId๋ฅผ foreign key๋ก ์ค์ ํ์ต๋๋ค.
- ์ด์ฉ์๋ฅผ ์ญ์ ํ๋ฉด ์๋ preferenceInfo์ portfolioItem๋ค๋ cascade๋ก ์ง์์ง๋๋ค.
- ํฌ์์ฑํฅ ์ค์ (preferenceInfo)
- ํ์๊ฐ์ ์ ํ๋ฉด ํฌ์์ฑํฅ์ ๋ฑ๋กํ๋ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.
- ๊ด์ฌ ์นํฐ์ ์ํ ์ ํธ๋, ์์ฐ ์ค ์ฃผ์ ๋น์ค, ์ ํธ ์ฃผ์ ์ข ๋ฅ, ์์ ํฌ์ ๊ธฐ๊ฐ ๋ฑ์ ๋ฐ์ต๋๋ค. ์ด ์ ๋ณด๋ ํฌํธํด๋ฆฌ์ค๋ฅผ ์ถ์ฒํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
- ํฌ์์ฑํฅ์ ๋ฑ๋กํ์ง ์์๋ ์น์ฌ์ดํธ๋ฅผ ์ด์ฉํ ์ ์์ง๋ง ํฌ์์ฑํฅ์ ๊ธฐ๋ฐํ ํฌํธํด๋ฆฌ์ค ์ถ์ฒ์ ๋ฐ์ ์ ์์ต๋๋ค. ๋ํ ๋ก๊ทธ์ธํ ๋๋ง๋ค ์ฒ์์ ํฌ์์ฑํฅ์ ์ค์ ํ๋ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํด ๋ฑ๋ก์ ์ ๋ํฉ๋๋ค.
- preferenceInfo๋ค์ ์ด์ฉ์ uid๋ฅผ foreign key๋ก ์ฐธ์กฐํฉ๋๋ค.
- ํฌํธํด๋ฆฌ์ค ๋ฑ๋ก (portfolioItem)
- ํฌํธํด๋ฆฌ์ค ๊ด๋ฆฌ ํ์ด์ง์์ ๋ณด์ ์ฃผ์์ ๋ฑ๋กํ ์ ์์ต๋๋ค. ๊ธฐ์ ์ฌ๋ณผ๊ณผ ํ๊ท ๋จ๊ฐ, ๋ณด์ ๋์ ์ ๋ ฅํฉ๋๋ค.
- ์ ๋ ฅํ ์ ๋ณด๋ portfolioItems ํ ์ด๋ธ์ ํ์ผ๋ก ์ถ๊ฐํฉ๋๋ค. Foreign key๋ก userUid๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ํฌํธํด๋ฆฌ์ค๋ฅผ ๋ฑ๋กํ๋ฉด ๊ฐ ๊ธฐ์ ๋ณ ๋น์ค์ ์ ๊ทธ๋ํ๋ก ๋ณด์ฌ์ค๋๋ค. D3๋ฅผ ์ด์ฉํ์ต๋๋ค. ์ ๊ทธ๋ํ์์ ๊ธฐ์ ํ์ด๋ฅผ ๋๋ฅด๋ฉด ํด๋น ๊ธฐ์ ์์ธํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ์ธ๋ถ api๋ฅผ ์ด์ฉํด ์ค์๊ฐ ์ฃผ์ ๊ฐ๊ฒฉ์ ๋ถ๋ฌ์ต๋๋ค. ์ค์๊ฐ ์ ๋ณด๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ์์ ์ด ์์ฐ๊ณผ ์ ์ฒด ์์ต, ์ ์ฒด ์์ต๋ฅ , ๊ฐ ๊ธฐ์ ๋ณ ์์ต๊ณผ ์์ต๋ฅ ๋ฑ์ ๊ณ์ฐํด์ ๋ณด์ฌ์ค๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ซ์๋ฅผ ๋ถ๋ ์์์ ์ผ๋ก ๊ด๋ฆฌํด ๋ํ๋๋ ๋ฌธ์ ๋ Decimal์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ํด๊ฒฐํ์ต๋๋ค.
- ๋ฉ์ธํ์ด์ง ํฌํธํด๋ฆฌ์ค ์ถ์ฒ
- ์ด์ฉ์๋ ํฌ์์ฑํฅ ๋๋ ๋ณด์ ์ฃผ์์ ๊ธฐ์ค์ผ๋ก ํฌํธํด๋ฆฌ์ค๋ฅผ ์ถ์ฒ๋ฐ๋๋ก ๊ณ ๋ฅผ ์ ์์ต๋๋ค.
- ํฌ์์ฑํฅ ๊ธฐ์ค (content-based filtering)
- ์ด์ฉ์๋ค์ด ๋ฑ๋กํ ํฌ์์ฑํฅ์ ์์นํํด ๊ฐ ์ด์ฉ์์ ์์น๋ฅผ ๊ตฌํฉ๋๋ค.
- ๋ก๊ทธ์ธํ ์ด์ฉ์์ ๋๋จธ์ง ์ด์ฉ์๋ค ์ฌ์ด์ Euclidean distance๋ฅผ ๊ฐ๊ฐ ๊ตฌํฉ๋๋ค.
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ์์๋ก ์ ๋ ฌํ ๋ค ๊ฐ ์ด์ฉ์์ ํฌํธํด๋ฆฌ์ค ์ ๋ณด๋ฅผ ๋ฌถ์ด ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ ๋๋ค.
- ๋ณด์ ์ฃผ์ ๊ธฐ์ค (user-based collaborative filtering)
- ๋ณด์ ์ฃผ์์ ๊ธฐ์ค์ผ๋ก ํฌํธํด๋ฆฌ์ค๋ฅผ ์ถ์ฒํ ๋ ์ด์ฉ์๋ค ์ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ๋ ๋ฐฉ๋ฒ์ด ์ ์ ํ์ง ์์์ต๋๋ค. (์ ์ฌ์ฐ์ด 100๋ง ์์ด๋ฉด์ ์ ํ ์ฃผ์์ 100๋ง ์ ๋ณด์ ํ ์ฌ๋๊ณผ ์ ์ฌ์ฐ์ด 1000์ต ์์ด๋ฉด์ ์ ํ ์ฃผ์์ 1000์ต ์ ๋ณด์ ํ ์ฌ๋์ euclidean distance์ด ๋ฉ์ง๋ง ์ทจํฅ์ ๋งค์ฐ ๋น์ทํจ)
- ๋ฐ๋ผ์ ๋ณด์ ์ฃผ์์ ๊ธฐ์ค์ผ๋ก ํฌํธํด๋ฆฌ์ค๋ฅผ ์ถ์ฒํ ๋ cosine similarity๋ฅผ ์ด์ฉํ์ต๋๋ค. ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ด์ฉํ ์ ์ ๋๋ค.
- ์ด์ฉ์๋ค์ ๋ฒกํฐ๊ฐ์ด ๋ณด์ ์ฃผ์์ ํ ๋๋ก ๊ตฌํฉ๋๋ค.
- ๋ก๊ทธ์ธํ ์ด์ฉ์์ ๋๋จธ์ง ์ด์ฉ์๋ค ์ฌ์ด์ cosine similarity๋ฅผ ๊ณ์ฐํด ์ทจํฅ์ด ๋น์ทํ ์์๋ก ์ ๋ ฌํ๊ณ ํด๋ผ์ด์ธํธ์ ๋ณด๋ ๋๋ค.
- ํฌ์์ฑํฅ ๊ธฐ์ค ์ถ์ฒ์ด ๋ณด์ ์ฃผ์ ๊ธฐ์ค ์ถ์ฒ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ์ ์๋ ํฌ์์ฑํฅ์ ์ฌ์ฉํด ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ๊ณ ์ ๋ ฌ์ ๋ง์น ๋ค ํฌํธํด๋ฆฌ์ค ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ๋ถ๋ฌ์์ผ ํ๋ ๋ฐ๋ฉด ํ์๋ ์ฒ์์ ํฌํธํด๋ฆฌ์ค ์ ๋ณด๋ฅผ ๋ถ๋ฌ์จ ๋ค ๋ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- Intersection Observer API๋ฅผ ์ด์ฉํด ํ์ฌ ๋ถ๋ฌ์จ ํฌํธํด๋ฆฌ์ค ๊ฐ์ด๋ฐ ๋ง์ง๋ง ํฌํธํด๋ฆฌ์ค๊ฐ ํ๋ฉด์ ๋ํ๋๋ฉด ๋ค์ ํฌํธํด๋ฆฌ์ค 15๊ฐ๋ฅผ ๋ถ๋ฌ์ค๋๋ก ์ค์ ํ์ต๋๋ค.
- ์ด์ฉ์๋ ์ถ์ฒ๋ฐ์ ํฌํธํด๋ฆฌ์ค๋ฅผ ๋๋ฌ ํฌํธํด๋ฆฌ์ค ํ์ด์ง๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๋ค๋ง ๋ณธ์ธ์ ํฌํธํด๋ฆฌ์ค ํ์ด์ง์ ๋ค์ด๊ฐ์ ๋์ ๋ฌ๋ฆฌ ์์ฐ ๊ท๋ชจ์ ์์ต, ์์ต๋ฅ ๋ฑ์ ๋ณด์ด์ง ์๊ณ ํฌํธํด๋ฆฌ์ค์ ๋ค์ด ์๋ ๊ธฐ์ ๋ค๊ณผ ํ์ฌ ๊ฐ๊ฒฉ๋ง ํ์ธํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ธ๊ธฐ ์ฃผ์ (hit)
- ์ด์ฉ์๊ฐ ํน์ ๊ธฐ์ ์์ธํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด hits ํ ์ด๋ธ์ timestamp์ ํจ๊ป ์กฐํ ์ ๋ณด๋ฅผ ์์ฑํฉ๋๋ค.
- ์ค์๊ฐ ์ธ๊ธฐ ์ฃผ์ ๋ชฉ๋ก์ ์กฐ์ํ๋ ๋ฑ ์ค๋จ์ฉ ์๋๋ฅผ ๋ง๊ธฐ ์ํด ๊ฐ์ ์ด์ฉ์๊ฐ 30๋ถ ์์ ๊ฐ์ ๊ธฐ์ ์ ์กฐํํ์ ๋๋ ์กฐํ ์ ๋ณด๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ์ด์ฉ์๋ cookie๋ฅผ ์ด์ฉํด ํ๋ณํ๊ณ ์๊ฐ์ updatedAt์ผ๋ก ํ์ธํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ 1๋ถ์ ํ ๋ฒ ์๋ฒ์ ์ค์๊ฐ ์ธ๊ธฐ ์ฃผ์ ์ ๋ณด๋ฅผ ์์ฒญํด ํ๋ฉด์ ๋์๋๋ค.
- ์๋ฒ๋ ํ ์๊ฐ์ ํ ๋ฒ 30๋ถ์ด ์ง๋ ์กฐํ ์ ๋ณด๋ค์ ์ง์๋๋ค. Cronjob์ ์ฌ์ฉํ์ต๋๋ค.
- ์์ธํ์ด์ง
- ์์ธํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ํด๋น ๊ธฐ์ ์ ์ฃผ๊ฐ ๊ทธ๋ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ผ๋ณ, ์ฃผ๋ณ, ์๋ณ๋ก ์ ๊ณตํฉ๋๋ค. 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 ํ ์ด๋ธ ์ถ๊ฐ๋ก ์์ฑ)
- ์ฃผ์ ์ ๋ณด์ ์ง์ ์ ๊ทผํ ์ ์์ด ์ธ๋ถ api์ ์์กดํด์ผ ํ๋ ์ํฉ์์ api๋ง๋ค ์ ๊ณตํ๋ ์ ๋ณด๊ฐ ๊ฐ๊ธฐ ํํธ์ ์ด๋ผ๋ ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค.
- ํนํ ์ด๋ค ์์ฅ์ฌ๋ค์ด ์๋์ง ํ ๋ฒ์ ์กฐํํ ์ ์๋ api๋ฅผ ์ฐพ๊ธฐ๊ฐ ํ๋ค์์ต๋๋ค. ํน์ ๊ธฐ์ ์ ์กฐํํ ์ด์ฉ์์๊ฒ ๋น์ทํ ๊ธฐ์ ๋ค์ ์ถ์ฒํ๋ ค๋ฉด ์์ฅ์ฌ ์ ์ฒด ๋ชฉ๋ก์ด ๊ผญ ํ์ํ์ต๋๋ค.
- ๊ทธ๋์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ ์ S&P500์ ํฌํจ๋ ๊ธฐ์ ์ผ๋ก ํ์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ๊ตฌ์ถํ์ต๋๋ค.
- companyProfiles๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค์ด ๊ฐ ๊ธฐ์ ์ ์นํฐ, ์ฐ์ , ์๊ฐ์ด์ก ๋ฑ์ ์ ์ฅํ์ต๋๋ค.
- ์ค์ ์๋น์ค๋ผ๋ฉด ์๊ฐ์ด์ก์ฒ๋ผ ์ค์๊ฐ์ผ๋ก ๋ณํํ๋ ์ ๋ณด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด์ผ๋ฉด ์ ๋๊ฒ ์ง๋ง api ์์ฒญ์ ๋ด๋ณด๋ด๋ ํ์๋ฅผ ์ค์ด๋ ค ๊ณ ์ก์ฑ ์ ์ผ์ต๋๋ค.
- ์ด์ ๊น์ง 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๋ ํนํ๋ ๋ฆฌ์กํธ์ ํจ๊ป ์ฐ๋ฉด์ ์ด๋ฐ์ ์ ๋ฅผ ๋จน์์ต๋๋ค.
- ์๋ฅผ ๋ค๋ฉด ํฌํธํด๋ฆฌ์คํ์ด์ง์์ ํฌํธํด๋ฆฌ์ค์ ๊ธฐ์ ์ ์ถ๊ฐํ๊ฑฐ๋ ์ฃผ์ ์ ๋ณด๋ฅผ ์์ ํ๋ฉด ์คํ ์ดํธ๊ฐ ๋ฐ๋๋ ๋ฐ ๋ง์ถฐ ์ ๊ทธ๋ํ๋ ๋ค์ ๊ทธ๋ ค์ ธ์ผ ํ๋๋ฐ ํ์ด ํฌ๊ธฐ๋ ๋ณํ์ง๋ง ๊ธฐ์กด ํ ์คํธ์ ์๋ก์ด ํ ์คํธ๊ฐ ๊ฒน์ณ์ ๋ํ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ค์ DOM์ ๊ธฐ์กด ํ ์คํธ๊ฐ ๋จ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ง์ ์ svg์์ ์ด์ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ญ์ ํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
- ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ผ๋ก 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 ํ์ ๊ณ์ํด์ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ์ฌ์ ๊ธฐํ์ ์ค์์ฑ์ ๊นจ๋ฌ์ ์ฌ๋ก ๊ฐ์ด๋ฐ ํ๋์ ๋๋ค.