INFLUENCER
κ°λ¨ν μ¬μ©μ μΈν°λμ μ ν΅ν μν μΆμ² λ° μ μ κ°λ° (a.k.a μΌνμ μ )
πμ°λ¦¬ μ‘°λ 3μ£Όλμ...
600μ¬κ°μ commitκ³Ό 40μ¬κ°μ branch 50μ¬κ°μ issue κ° μμμ΄μ!
π Flow chart
- μ μ κ° μ νΈνλ μΈν°λ μ & μ° μΆκ° & ν΄λ¦λ‘κ·Έλ₯Ό μμ§
- λ°μ΄ν°μ λ§κ² μ νΈνλ μνμ λν κ°μ€μΉ μ μλ₯Ό λΆμ¬
- μ·¨ν₯μ΄ λΉμ·ν μ μ λ₯Ό κ²μ ν λ§μΆ€ν μν μΆμ² (collaborative filtering algorithm)
- Kafkaλ‘ log λ°μ΄ν° μ μ‘
- Spring Boot Server (Kafka Consumer)μμ λ°μ΄ν°λ₯Ό λ‘λν΄μ Elasticsearchμ Insert
π Using Technology
-
Common: Typescript
-
Front-End: React.js, Next.js, Redux, Styled-components
-
Big-Data: Kafka, Elasticsearch
π» νμ
λ©ν | λ©ν° |
---|---|
π¨βπ»λ°°κ·Όλ°° | π©βπ»μκ·Έλ¦Ό |
π©βπ»μ λ€μ | |
π©βπ»μ‘°λ―Όμ§ | |
π¨βπ»μ μ€μ¬ | |
π¨βπ»λ°λ―Όμ |
βοΈ Dependencies
Front-end
"dependencies": {
"@egjs/react-infinitegrid": "3.0.4",
"@material-ui/core": "^4.9.13",
"@types/react-redux": "^7.1.8",
"axios": "^0.19.2",
"clsx": "^1.1.0",
"dotenv": "^8.2.0",
"immer": "^6.0.5",
"lodash": "^4.17.15",
"next": "^9.3.6",
"next-redux-wrapper": "^6.0.0",
"node-fetch": "^2.6.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-gesture-responder": "^2.1.0",
"react-grid-dnd": "^2.1.2",
"react-hammerjs": "^1.0.1",
"react-redux": "^7.2.0",
"redux": "^4.0.5",
"redux-devtools-extension": "^2.13.8",
"redux-saga": "^1.1.3",
"styled-components": "^5.1.0",
"typesafe-actions": "^5.1.0",
"webpack": "^4.43.0"
},
"devDependencies": {
"@types/dotenv": "^8.2.0",
"@types/jest": "^24.0.0",
"@types/material-ui": "^0.21.7",
"@types/next": "^9.0.0",
"@types/node": "^13.13.5",
"@types/react": "^16.9.34",
"@types/react-dom": "^16.9.0",
"@types/styled-components": "^5.1.0",
"@typescript-eslint/eslint-plugin": "^2.24.0",
"@typescript-eslint/parser": "^2.31.0",
"eslint": "^6.8.0",
"eslint-config-airbnb-typescript": "^7.2.1",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.19.0",
"eslint-plugin-react-hooks": "^2.5.0",
"typescript": "^3.8.3"
}
Back-end
"dependencies": {
"celebrate": "12.1.1",
"content-based-recommender": "^1.4.0",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"mongoose": "5.9.13",
"nodemon": "^2.0.3",
"pm2": "^4.4.0",
"swagger-ui-express": "4.1.4",
"typedi": "^0.8.0",
"winston": "3.2.1"
},
"devDependencies": {
"@types/chai": "4.2.11",
"@types/cors": "2.8.6",
"@types/express": "4.17.6",
"@types/mocha": "7.0.2",
"@types/mongoose": "5.7.16",
"@types/node": "13.13.5",
"@types/sinon": "9.0.0",
"@types/supertest": "2.0.9",
"@types/swagger-ui-express": "4.1.2",
"@types/winston": "2.4.4",
"chai": "4.2.0",
"mocha": "7.1.2",
"sinon": "9.0.2",
"supertest": "4.0.2",
"ts-node": "8.10.1",
"typescript": "3.8.3"
}