진료 예약을 위한 의사 검색 및 진료요청을 할 수 있는 REST API
- Back-End : Python, Django, Django REST Framework, Crontab
- Database : SQLite
- ETC : Git, Github,
-
데이터의 추적성 및 관리를 위하여
created_at
,updated_at
을 가지고 있는core
앱에 TimeStampModel을 모듈화 -
무결성을 위해 모델의 필드는 str 형식의 chocie로 처리
-
요구사항을 토대로
User
,Speciality
,Doctor
,DoctorSchedule
,Clinic
,NonInsuredMedicalCategory
,ClinicAppointment
모델 설계 -
각 모델의 관계
-
Doctor
모델과Speciality
모델 간의 다대다 (Many-to-Many) 관계:- 의사(
Doctor
)는 여러 진료 과목(Speciality
)에 속할 수 있고, 진료 과목 역시 여러 의사와 연관될 수 있습니다. - 이 관계는
specialities
필드를 통해 정의되어 있습니다.
- 의사(
-
Doctor
모델과Clinic
모델 간의 일대다 (Many-to-One) 관계:- 여러 의사(
Doctor
)는 하나의 병원(Clinic
)에 근무할 수 있으며, 하나의 병원은 여러 의사를 포함할 수 있습니다. - 이 관계는
clinic
필드를 통해 정의되어 있습니다.
- 여러 의사(
-
Doctor
모델과DoctorSchedule
모델 간의 일대다 (One-to-Many) 관계:- 각 의사(
Doctor
)는 여러 개의 진료 스케줄(DoctorSchedule
)을 가질 수 있습니다. - 이 관계는
schedules
필드를 통해 정의되어 있으며,doctor
필드를 통해 의사와 진료 스케줄이 연결됩니다.
- 각 의사(
-
Clinic
모델과Doctor
모델 간의 역참조 (Reverse Relationship): -
Doctor
모델에서clinic
필드를 통해 병원에 접근할 수 있고,Clinic
모델에서는doctors
역참조를 통해 해당 병원에 속한 의사들에 접근할 수 있습니다. -
Doctor
모델과ClinicAppointment
모델 간의 일대다 (One-to-Many) 관계:- 각 의사(
Doctor
)는 여러 개의 진료 요청(ClinicAppointment
)을 받을 수 있습니다. - 이 관계는
clinic_appointments
역참조를 통해 의사와 진료 요청이 연결됩니다.
- 각 의사(
-
accounts.User
모델과ClinicAppointment
모델 간의 일대다 (One-to-Many) 관계:- 각 환자(
User
)는 여러 개의 진료 요청(ClinicAppointment
)을 생성할 수 있습니다. - 이 관계는
clinic_appointments
역참조를 통해 환자와 진료 요청이 연결됩니다.
- 각 환자(
-
앱 이름 :복수, 폴더명 : 복수, 파일명 : 단수
- ResponseFormatter를 추가하여 api response의 구조 통일
- custom exception handler를 이용하여 error response에 http status code 추가
- core.utils.exception에 APIException 유틸화하여 관리
service_layer
- 유지보수 및 비즈니스 로직 관리를 위하여 view에 service_layer 추가
- 모든 service_layer는 base_service를 상속받아 관리
- service를 기준으로 serializer, views 분리
Serializer
-
효율성 및 확장성의 용이성을 위하여 basic_serializer를 통하여 외래키를 제외한 필드 관리
- 해당 모델을 사용하는 serializer는 basic_serializer를 상속받아 필드 관리 (
Meta.fields 이용
) - 모델에 새로운 필드가 추가될 경우 basic_serializer에 필드 추가하면 해당 모델의 다른 serializer에도 자동 적용
- 해당 모델을 사용하는 serializer는 basic_serializer를 상속받아 필드 관리 (
-
명명규칙 :
- Input : {service_name}{base_name}Qs{model_name}Serializer
- Output : *{service_name}{base_name]{http_method_name}Serializer
엔드포인트 | 설명 | HTTP 메서드 |
---|---|---|
/api/accounts/user/ |
사용자 정보를 조회합니다. | GET |
/api/accounts/user/login/ |
사용자 인증 정보를 전송하여 로그인을 시도합니다. | POST |
/api/accounts/user/logout/ |
로그아웃을 수행합니다. | POST |
/api/accounts/user/signup/ |
새로운 사용자를 등록합니다. | POST |
/api/clinics/appointment/ |
진료 요청 목록을 조회합니다. | GET |
/api/clinics/approve_appointment/ |
진료 요청을 수락합니다. | POST |
/api/clinics/request_appointment/ |
진료 요청을 생성합니다. | POST |
/api/clinics/search/ |
진료 정보를 검색합니다. | GET |
/api/schema/ |
API 스키마를 조회합니다. | GET |
/api/schema/swagger-ui/ |
Swagger UI를 통해 API 문서를 확인합니다. | GET |
- drf-spectacular를 이용한 문서화
- local에서
api/schema/swagger-ui
로 접속하면 API별 schema 및 Test 가능
Name | Stmts | Miss | Cover |
---|---|---|---|
tests/conftest.py | 97 | 11 | 89% |
tests/test_accounts/test_user_view.py | 21 | 0 | 100% |
tests/test_clinics/test_clinic_view.py | 143 | 0 | 100% |
TOTAL | 652 | 36 | 94% |
- 요구사항에 대한 test case 작성
freezegun
라이브러리를 이용하여 특정 시점(2022년 1월 15일
)의 상황에서 테스트
- conftes.py에 자주 사용되는 함수들 fixture를 통해 유틸화
- 94%의 test-coverage
sqlite(DB)도 같이 올려뒀습니다. 하단의 정보를 토대로 로그인하시면 됩니다.
admin ID / PW : admin@offical.net , 0000
- 가상환경 설정
python3 -m venv {가상환경이름}
- 의존성 설치
pip install -r requirements/local.txt
- 서버 실행
python manage.py runserver
api/schema/swagger-ui
에 접속하시면 UI와 함께 API별로 테스트할 수 있습니다.
create_data_scripty.py
를 이용하여 데이터를 추가하는 것이 가능합니다python manage.py shell < create_data_script.py
을 입력해주시면 데이터가 생성됩니다.