728x90

서비스 구현을 위해 코드를 짜기 위해 어떻게 보면 가장 중요한 DB스키마와, 기능플로우 그리고 API를 짜봤다.

페이지 수는 적지만 각 페이지간의 연계도 복잡하고, 그 페이지 내에서 서버와 DB간의 통신에 대해

구체적으로 고민해보니 생각할 것이 많아서 오래 걸렸다. ㅠㅠ

아직 코드 작성도 못하고 있는데 버전만 몇 개가 나오는건지...

DB와 API는 수정할 것이므로 해당 게시글은 히스토리 용으로만 보관...

 

 

DB 스키마

: 원래는 기능플로우를 짜고 구체화가 되면 DB를 짜려 했지만, DB가 생각보다 복잡하여 기능플로우가 진행이 되지 않아서,

DB부터 먼저 논의 했다.

 

 

>calendars DB : 해당 DB는 캘린더 구현을 위한 초기 DB이다.

> schedules DB : 개인의 알람/시간/일정구현유무/스케쥴이름 데이터를 저장하는 일정 DB이다.

유저정보는 users DB와 1:N 관계이며, 약정보 DB와는 N:N관계이다.

=> 이는 차후 기능 플로우 때 더 자세하게 등장할 예정인데, 같은 날짜/같은 주기/같은 시간에 여러 약을 동시게 복용해야 하는 경우,

각각 따로 등록할 경우, 푸쉬알람이 불필요하게 동시에 울리게 되는데, 이는 사용성을 고려하면 좋지 못하다고 판단했다.

따라서, 한 일정에 약이 여러개일수 있으며, 반대로 약 하나에도 일정이 여러개일 수도 있다.

약 하나에 일정이 여러개인 경우는, 하루에 한번만 약을 먹고 끝낼 수 있지만, 주기적으로 먹는 경우 이다.

> 스케쥴 DB가 두 개로 수정되었다. 각 날짜별로 모든 주기를 저장하는 DB와 진짜 통 스케쥴별로 저장하는 common DB로!

> 그리고 카메라로 인식한 약 DB와 usersDB가 N:N 관계일것이라는 이야기가 나와서 users_medi_cameras DB를 추가했다.

> users DB: user의 개인 정보가 저장 / mobile num을 받는 이유는, id 찾기에 활용 / login 칼럼은 소셜과 일반 로그인 구분을 위해

> medi_cameras DB: 카메라로 인식하여 Open API에서 데이터를 끌고올 약정보

> medi_writes DB: 카메라로 인식하지 못하여, 유저가 직접 메모처럼 입력한 약정보

 

기능플로우_V.01

>개인정보 수정에 대한 페이지가 하나 추가됨.
>일정삭제가 전체 일정삭제인지 해당 날짜만 삭제하는 지에 대한 분기 추가
>알람수정페이지 클릭 시에 GET메소드 구현은 실제로 경우의 수 잘 고려하기
>실제 경우의수를 고려하기 위해 초기 DB셋팅 이후에 초기 데이터 넣어두기

 

 

API Documents

 

POST ID find

가장 초기 메인 화면에서, 로그인 시도 시에, ID찾기 페이지로 이동해서, mobile과 가입한 이름 기준으로 ID찾음

http://localhost:4000/users/findid

📥 Request

fullname: fullname,
mobile: mobile,

📤 Response

  • 200:OK

    email: email
  • 400

    "해당하는 유저 정보가 없습니다. 회원가입 혹은 소셜로그인을 시도해보세요"
  • 500: Internal Server Error

    'err'

POST PW find

가장 초기 메인 화면에서, 로그인 시도 시에, PW찾기 페이지로 이동해서, email 기준으로 PW 찾음

http://localhost:4000/users/findpw

📥 Request

email: email,

📤 Response

  • 200:OK

    password: password
  • 400

    "해당하는 유저 정보가 없습니다."
  • 500: Internal Server Error

    'err'

POST signup

회원 가입 페이지

http://localhost:4000/users/signup

📥 Request

email: email,
fullname: fullname,
mobile: mobile,
password: password
login : basic

📤 Response

  • 200: OK

  • 401 :

    '해당 이메일로는 이미 가입되어 있습니다'.
  • 500: Internal Server Error

    'err'

GET social login page

client에서 href로 링크 이동하게 되면, get method로 소셜 로그인 실행

http://localhost:4000/auth/kakao

📥 Request

📤 Response

  • 200:OK

    const kakaoAuthUrl =
        'https://kakao.com/login/oauth/authorize?client_id=' +
        kakao.clientID +
        '&redirect_uri=' +
        kakao.redirectUri;
    
      res.redirect(kakaoAuthUrl)
  • 500: Internal Server Error

    'err'

GET social login / redirect page

유저가 소셜에 request token 요청하며 redirect page로 이동되며, 서버가 소셜에 token을 기반으로 인증을 요청하는 client화됨.

http://localhost:4000/auth/kakao/callback

📥 Request

try {
 axios.post => access token 받아옴
   try {
    axios.get => access token으로 소셜에서 유저 데이터 받아옴
   } catch 
}catch

📤 Response

  • 200:OK

    { fullname : ,
    email : ,
    password : ,
    login : 'social'
    }
  • 500: Internal Server Error

    'err'

POST Login

일반회원가입을 통한 고객

http://localhost:4000/users/login

📥 Request

email: email
password: password

📤 Response

  • 200: OK

    JWT 활용
  • 401: Unauthorized

    'unvalid user'
  • 500: Internal Server Error

    'err'

GET main_status

로그인 후, 메인 페이지의 현재 상태를 보여준다

http://localhost:4000/schedules/main

📥 Request

today: today
users_id: 인증방식으로 세션 유지되는 users_id 인증값

📤 Response

  • 200: OK

    일주일치 {일자, time(알람),check}
  • 401: Unauthorized

    'unvalid user'
  • 500: Internal Server Error

    'err'

GET schedules_calendar

달력 기준으로 유저의 복용 현황 보여주기

http://localhost:4000/schedules/month

📥 Request

month: this_month
users_id: 인증방식으로 세션 유지되는 users_id 인증값

📤 Response

  • 200: OK

    all {일자, 일정이름, time(알람),check}
  • 500: Internal Server Error

    'err'

POST medicine

날짜 클릭해서 알람 등록하기

http://localhost:4000/schedules /apply

📥 Request

schedule_title: schedule_title
start_date: start_date
end_date: end_date
medicine_name: medicine_name
카메라 인식 여부 체크해주는 props
cycle : cycle
time : time

📤 Response

  • 200: OK

    all {일정이름, 일자, time(알람)}
  • 500: Internal Server Error

    'err'

GET medicine_name

일정 수정 페이지에서, 기등록된 약이름 받아오기

http://localhost:4000/schedules/medicinename

📥 Request

schedule_title: schedule_title

📤 Response

  • 200: OK

    all {약이름}
  • 500: Internal Server Error

    'err'

PUT medicine

해당 일정 수정하기

http://localhost:4000/schedules/edit

📥 Request

before_schedule_title: before_schedule_title
schedule_title: schedule_title
start_date: start_date
end_date: end_date
medicine_name: medicine_name
cycle : cycle
time : time

📤 Response

  • 200: OK

    all {일정이름, 일자, time(알람)}
  • 500: Internal Server Error

    'err'

DELETE scheduleall

해당 일정 삭제하기

http://localhost:4000/schedules/deleteall

📥 Request

schedule_title: schedule_title

📤 Response

  • 200: OK

  • 500: Internal Server Error

    'err'

DELETE scheduledate

클릭한 날짜/해당 일정만 삭제하기

http://localhost:4000/schedules/deletedate

📥 Request

schedule_title: schedule_title
clickdate: clickdate

📤 Response

  • 200: OK

  • 500: Internal Server Error

    'err'

PUT check

해당 날짜/시간의 일정을 true로 check해주기

http://localhost:4000/schedules/check

📥 Request

schedule_title: schedule_title
clickdate: clickdate
userid: JWT로 인증된 현 유저 정보
time : time

📤 Response

  • 200: OK

    {check :  True}
  • 500: Internal Server Error

    'err'

PUT check_push

현재 push 온 일정을 true로 check해주기

http://localhost:4000/schedules/check/push

📥 Request

schedule_title: schedule_title
today: today
userid: JWT로 인증된 현 유저 정보
time : time

📤 Response

  • 200: OK

    {check :  True}
  • 500: Internal Server Error

    'err'

GET mymedicine_camera

내가 카메라로 등록한 약 현황 보기

http://localhost:4000/medicine/camera

📥 Request

users_id: 인증방식으로 세션 유지되는 users_id 인증값

📤 Response

  • 200: OK

    all {약이름}
  • 500: Internal Server Error

    'err'

GET mymedicine_write

내가 직접 등록한 약 현황 보기

http://localhost:4000/medicine/write

📥 Request

users_id: 인증방식으로 세션 유지되는 users_id 인증값

📤 Response

  • 200: OK

    all {약이름}
  • 500: Internal Server Error

    'err'

GET mymedicine_camera_info

내가 카메라로 등록한 약정보 자세하게 보기

http://localhost:4000/medicine/camera/info

📥 Request

users_id: 인증방식으로 세션 유지되는 users_id 인증값
medicine_name

📤 Response

  • 200: OK

    all {약정보}
    //open api에 요청 보내는 주체 정하기
  • 500: Internal Server Error

    'err'

GET mymedicine_write_info

내가 직접 등록한 약 현황 보기

http://localhost:4000/medicine/write/info

📥 Request

users_id: 인증방식으로 세션 유지되는 users_id 인증값
medicine_name : medicine_name

📤 Response

  • 200: OK

    all {약정보}
  • 500: Internal Server Error

    'err'

POST logout

로그아웃

http://localhost:4000/users/logout

📥 Request

redirect('/');

📤 Response

  • 200:OK

    email: email
  • 400

    'you are currently not logined'
  • 500: Internal Server Error

    'err'

DELETE userinfo

회원탈퇴

http://localhost:4000/users/deleteuserinfo

📥 Request

📤 Response

  • 200:OK

    session.destroy()
  • 500: Internal Server Error

    'err'

EDIT userinfo

회원정보수정

http://localhost:4000/users/edituserinfo

📥 Request

password: password,
mobile : mobile

📤 Response

  • 200:OK

    정보수정 완료
  • 400

    'you are currently not logined'
  • 500: Internal Server Error

    'err'
728x90

+ Recent posts