서비스 구현을 위해 코드를 짜기 위해 어떻게 보면 가장 중요한 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'
'PROJECT_BE > 약올림_2020' 카테고리의 다른 글
[Sprint 3]Error Handling/DB transaction(Week6) (0) | 2021.01.15 |
---|---|
[Sprint 2]Data Caching / Schedules 관련 기능 구현(Week5) (0) | 2021.01.15 |
[Sprint 1]Social Login/Get Main API 구현(Week4) (2) | 2021.01.02 |
[Intro]프로젝트 시작하기(Week2-2)기능리스트업/마일스톤 짜기 (0) | 2020.11.15 |
[Intro]프로젝트 준비하기(week1-1)_스택선정/서비스 기능 구체화(페이지 beta) (0) | 2020.11.13 |