Skip to content

Medi-Ready/medi-ready-frontend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๐Ÿ’Š MEDI READY

prescription

#Medicine #๋ณต์šฉ์ด๋ ฅ๊ด€๋ฆฌ #๊ณ ๊ฐ๊ด€๋ฆฌ #ํ‘ธ์‹œ์•Œ๋ฆผ

์•ฝ ๋จน์„ ์‹œ๊ฐ„์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” ์„œ๋น„์Šค, Medi Ready์ž…๋‹ˆ๋‹ค!

์•ฝ์„ ์–ธ์ œ ๋จน์—ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ๊ณ„์‹œ๋‚˜์š”? ์ด์ œ๋Š” Medi Ready๋ฅผ ํ†ตํ•ด ๋ณต์šฉ ์ด๋ ฅ์„ ์†์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•ด ๋ณด์„ธ์š”. Medi Ready๋Š” ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์ด ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”.


๐Ÿ“š Contents


๐Ÿ”— Links

RN ์•ฑ์€ ๋ฐฐํฌ๊ฐ€ ๋˜์ง€ ์•Š์•„, Expo๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

deploy

Github Repositories


๐Ÿ” Preview

checkin.mp4
  • ํ™˜์ž๊ฐ€ ์•ฝ๊ตญ์— ๊ฐ€์„œ ์ฒดํฌ์ธ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฝ์‚ฌ๊ฐ€ ํ™˜์ž์˜ ์•ฑ์— ๋ณต์•ฝ์ง€๋„์™€ ์ฒ˜๋ฐฉ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ™˜์ž์˜ ์•ฑ์— ์•Œ๋žŒ์ด ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
alarm.mp4
  • ์„ค์ •ํ•œ ์‹œ๊ฐ„์— ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ์šธ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
history.mp4
  • ๋ณต์šฉ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒ˜๋ฐฉ ๋‚ด์—ญ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•Œ๋žŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘จโ€โš•๏ธ Motivation

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

์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผ์„ ํ•˜์˜€๋Š”๋ฐ์š”. ์ตœ๊ทผ ์ฝ”๋กœ๋‚˜๋กœ ์ธํ•ด ๋ชจ๋“  ์žฅ์†Œ์—์„œ QR ์ฒดํฌ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—์„œ ์˜๊ฐ์„ ์–ป์–ด, ํ™˜์ž๊ฐ€ ์•ฝ๊ตญ์—์„œ QR ์ฒดํฌ์ธ์„ ํ•˜๋ฉด ์‹œ์Šคํ…œ์ƒ์— ๋“ฑ๋ก๋˜๋„๋ก ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์•ฝ๊ตญ ๊ณ„์ •์— ์ฒ˜๋ฐฉ ๋‚ด์—ญ์ด ์ถ•์ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ตญ ์ž…์žฅ์—์„œ๋Š” ๊ณ ๊ฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋™์‹œ์— ์•ฝ ๋จน์„ ์‹œ๊ฐ„์„ ์•Œ๋ ค์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”ฅ Features

์•ฝ์‚ฌ์šฉ CRM (์›น)

  • ํ™˜์ž๋Š” QR ์ฒดํฌ์ธ์„ ํ†ตํ•ด, ๋Œ€๊ธฐ ๋ช…๋‹จ์— ์ด๋ฆ„์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฝ์‚ฌ๋Š” ์ฒ˜๋ฐฉ์ „๊ณผ ๋ณต์•ฝ ์ง€๋„๋ฅผ ํ™˜์ž์˜ ์•ฑ์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ํ™˜์ž์˜ ์•ฑ์— ์•ฝ ์•Œ๋ฆผ์ด ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ex) 3์ผ๊ฐ„ ์•„์นจ, ์ ์‹ฌ, ์ €๋…
  • ๊ณผ๊ฑฐ ์ฒ˜๋ฐฉ ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜์ž์šฉ ์•ฑ

  • ๋‚ ์งœ๋ณ„/์‹œ๊ฐ„๋ณ„๋กœ ๋ณต์šฉ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค์ •ํ•œ ์‹œ๊ฐ„์— ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ์•Œ๋žŒ์„ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•Œ๋žŒ ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๋‚œ ์ฒ˜๋ฐฉ ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•ฝ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฌ Getting Started

Local ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Client (Web) .env ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
REACT_APP_API_KEY=<Firebase API Key>
REACT_APP_AUTH_DOMAIN=<Firebase Auth Domain>
REACT_APP_PROJECT_ID=<Firebase Project ID>
REACT_APP_APP_ID=<Firebase App ID>

REACT_APP_BASE_URL=<default = http://localhost:8080>
Client (React Native Mobile App) environment.js ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
import Constants from "expo-constants";

const ENV = {
  dev: {
    IOS_CLIENT_ID: <Google OAuth IOS client ID>,
    ANDROID_CLIENT_ID: <Google OAuth Android client ID>,
    API_SERVER_URL: <YOUR_IP_ADDRESS_WITH_PROT>,
  },
};

const getEnvVars = (env = Constants.manifest.releaseChannel) => {
  if (__DEV__) {
    return ENV.dev;
  }
};

export default getEnvVars;
Main Server .env ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
ORIGIN_URI_DEV=<origin uri: default = "http://localhost:3000">
PUSH_NOTIFICATION_URI=<origin uri: default = http://localhost:8081>

MYSQL_USERNAME=<mysql username: default = root>
MYSQL_PASSWORD=<mysql password>
MYSQL_DATABASE=mediready
MYSQL_HOST=<my sql host: default = "127.0.0.1">

JWT_SECRET_KEY=<jwt secret key>
COOKIE_SECRET_KEY=<cookie secret key>
Push Notification Server .env ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
EXPO_ACCESS_TOKEN=<Expo Access Token>

๐Ÿ–ฅ Tech Stacks

Client

  • React
  • React Native (Expo)
  • Styled-Component
  • Redux Toolkit
  • Redux Saga
  • React Query

Server

  • Node JS
  • Express
  • MySQL, Sequelize
  • AWS RDS
  • Node Schedule
  • Expo Server SDK

Testing

  • Jest
  • React Testing Library
  • Mocha, Chai

    Test Case Coverage Client 54%, React Native 46%, Server 73%

Deployment

  • Netlify
  • AWS Elastic Beanstalk

๐Ÿค ์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค

์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ ๋””์ž์ธ

ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํšจ์œจ์ ์ธ ํ˜‘์—… ๋ฐฉ์‹๊ณผ ๊ฐ์ž ๋งก์€ ๋ถ€๋ถ„์˜ ๋””์ž์ธ์  ํ†ต์ผ์„ฑ์„ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•œ ๋’ค ํ•ฉ์„ฑ(Composition)ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ , ํ•œ ๊ณณ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ผ๋„ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Proptypes๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ์ž‘์—… ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ณผ์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์ž˜ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ๋•๋ถ„์— ์ˆ˜์›”ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌ์•กํŠธ์ ์ธ ์‚ฌ๊ณ ๋ฐฉ์‹์˜ ์ค‘์š”์„ฑ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์˜ ์žฅ์ ์— ๋Œ€ํ•ด ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

React Native Life Cycle ์ดํ•ด

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” React์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰๋˜๋Š” React native๋Š” ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ component๊ฐ€ unmount ๋˜์ง€ ์•Š๊ณ  stack ๊ตฌ์กฐ๋กœ ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์— life cycle์„ ์ด์šฉํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React Navigation์˜ "focus" ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

navigation.addListener("focus", () => {
  dispatch(...);
});

Redux Saga์˜ ๋„์ž…

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ React Native๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์„ ๊ณ ๋ คํ•˜์—ฌ Expo๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ๋ฉด ์ข…์ข… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ํ•ธ๋“ค๋ง์ด ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„๋™๊ธฐ ๋ฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ด€๋ฆฌ์™€ ์—ญํ• ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ๋ถ„ํ• ์ด ์šฉ์ดํ•œ Redux-Saga๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Generator์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…๋“ค์„ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํžˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฃผ๋„์ ์œผ๋กœ ์•ก์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Redux-Saga์˜ ์žฅ์ ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, Toolkit๊ณผ Redux-Saga๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์•„์‰ฌ์›€์ด ๋‚จ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๋ฒˆ์—๋Š” Slice์™€ Redux-Saga๊ฐ€ ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” Ducks ํŒจํ„ด์„ ์ด์šฉํ•ด ๋”์šฑ ์ง๊ด€์ ์ธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ด ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ
// What I did

src/
  api
  component
  redux/
    reducers
    store
  sagas/
    handlers
    rootSaga.js

// What I should have done

src/
  api
  component
  feature/
      index.js
      slice.js
      saga.js

Push Notification

์ดˆ๊ธฐ์—๋Š” Firebase Cloud Messaging๊ณผ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๊ธฐํšํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๋ฐฉ์‹์€ ์•ˆ๋“œ๋กœ์ด๋“œ/IOS๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๊ณผ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์–ด Expo SDK ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์šฐํšŒ์ ์œผ๋กœ FCM์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, FCM ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์ง€ ์•Š๋Š” ํƒ“์— ์„ค์ •ํ•œ ์•Œ๋ฆผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ์ ์ด ์•„์‰ฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์•Œ๋ฆผ์„ ์œ„ํ•œ ๋ณ„๋„ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์ง€๋งŒ, DB์— ์•Œ๋ฆผ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•œ ๋’ค Node schedule๊ณผ Expo SDK ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์šฐํšŒ์ ์œผ๋กœ ์•Œ๋ฆผ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„์—๋Š” ์ด๋Ÿฌํ•œ ์ ์„ ๊ฐœ์„ ํ•˜์—ฌ ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์ž…๋‹ˆ๋‹ค.

Search Algorithms

search

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

MySQL

database

DB Modeling ๊ณผ์ •์—์„œ ๋ณต์žกํ•œ ๊ด€๊ณ„๊ฐ€ ์˜ˆ์ƒ๋˜์–ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ์œผ๋กœ ๋‹ค๋ฃจ์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. NoSQL์˜ Nested ํ˜•ํƒœ์— ์ต์ˆ™ํ•œ ํƒ“์—, ์‚ฌ๊ณ ๋ฅผ ์ „ํ™˜ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐ ์ง“๊ณ , Join๊ณผ Cascade๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ SQL์˜ ์žฅ์ ์„ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณต์žกํ•œ ๊ด€๊ณ„ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋•Œ๋งˆ๋‹ค ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ธํ•ด ์‰ฝ๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํƒ“์—, ์ฟผ๋ฆฌ๋ฌธ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜์ง€ ๋ชปํ–ˆ๋Š”๋ฐ, ์ถ”ํ›„์— ๊ผญ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published