Skip to content

Rayd-kim/todak

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,043 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

토닥

반려인의 병원 방문 번거로움을 해결하기 위한 비대면 의료 서비스

🏆프로젝트 성과

공통프로젝트 웹디자인부분 우수상 수상(2등)🥈

alt text

📜 목차

📝서비스 개요

WebRTC 기술을 이용한 반려인들을 위한 반려동물 비대면 의료 서비스입니다.

페르소나

구름이를 키우는 반려인 '이반려'

  • 문제점 :
    • 약물 투여시기 결정을 위해 병원에서 주기적인 관찰 진료가 필요
    • 병원에 대한 스트레스가 높음
  • 필요한 점 :
    • 병원에 방문하지 않고 관찰 진료 필요
    • 시간, 공간에 제약 없이 진료 필요

⚡주요 기능

토닥은 반려인, 수의사 , 병원 관계자 3가지의 사용자 유형이 존재

반려인 홈 수의사 홈 병원관계자 홈

1. 반려인

반려동물 관리

  • 프로필 등록 : 반려동물의 정보를 프로필 형태로 등록하여 정보 열람 및 관리
예약 신청1 예약 신청2 예약 신청3

진료 내역 조회

  • 예약 요약 제공 : 작성했던 진료 신청서 내용을 요약해 어떤 진료 내역인지 한눈에 확인 가능
  • AI 요약 진단서 : 수의사의 검증을 거친 AI 요약 진단서 보관

예약 시간 설정 1

예약 신청

  • 신청서 작성 : 원하는 병원과 수의사를 검색 후 선택하고, 증상 입력
  • 자동 결제 수단 선택 : 카카오페이 결제를 통해 예약을 확정하고 승인 대기 상태로 전환
예약 신청1 예약 신청2 예약 신청3

2. 수의사

비대면 진료

  • 실시간 1:1진료 : Kurento 기반 WebRTC 기술을 활용하여 원격 화상 진료 지원
비대면진료1 비대면진료2

진단서 검토

  • STT → text 변환 : Whisper-1을 이용해 비대면 진료 중 음성을 텍스트 파일로 변환
  • AI text 요약 : 의료 용어가 많은 텍스트를 ChatGPT 4.1을 통해 핵심 내용 요약
  • 수의사 검증 : 수의사의 검토 절차를 통해 수정, 승인

수의사진료상세

3. 병원 관계자

진료 일정 관리

  • 예약 시간 설정 : 버튼 토클 방식으로 진료 가능/불가 시간 설정
예약 시간 설정 1 예약 시간 설정 2

예약 관리

  • 신청 목록 확인 : 전체 예약 내역을 조회하고, 내용을 검토한 뒤 승인 또는 반려 처리 가능
예약 승인 예약 반려

결제 관리

  • 수납 : 진료 종료 후 결제 금액 입력 → 자동 결제 요청

예약 시간 설정 1

🙋담당 역할

  • Kurento 미디어 서버를 이용한 비대면 진료화면 구현
  • 카카오페이 API를 활용한 결제 서비스 구현
  • 백엔드 서버 RestAPI 작성
  • 프론트엔드 자문 및 배포를 위한 CI/CD 파이프라인 구축 및 운영

🛠기술 스택

Frontend

  • Language: TypeScript
  • Framework: React 19
  • UI/스타일링: TailwindCSS
  • 상태 관리: Zustand
  • 라우팅: React Router Dom
  • 개발 도구: Vit

Backend

  • Language: Java 17
  • Framework: Spring Boot 3.3.3
  • Database: MySQL, Redis, Elasticsearch
  • ORM: Spring Data JPA
  • 인증/보안: JWT (jjwt), Spring Security
  • 메시징 서비스: RabbitMQ
  • API 문서화: Swagger
  • 웹소켓: Spring WebSocket
  • 개발 도구: Lombok, Devtools
  • AI : GMS

Infra

  • Containerization: Docker
  • CI/CD: Jenkins
  • Cloud: AWS ,S3 Bucket

🔧기술 선정 이유 및 문제 해결

Kurento 미디어 서버

  • Web RTC기능을 P2P 방식이 아닌 미디어 서버를 거쳐서 관리하기 위해서 사용했습니다. 이렇게 미디어 서버를 통해서 관리하면 녹음, 녹화 같은 추가 기능을 적용하기 수월합니다. 보통 더 편한 OpenVidu미디어 서버를 많이 사용하지만, AI가 요약 및 분석하여 진단서를 뽑아주는 기능을 위해서 서비스에서 수의사 음성을 이용해서 STT로 뽑아내야했습니다. 이러한 특수한 미디어 파이프라인을 직접 구현하기 위해서 Kurento를 사용하였습니다.

Redis

  • 예약 내역을 입력한 이후에 카카오페이를 등록하게 Flow를 짰습니다. 이 과정에서 예약내역을 미리 Redis에 저장하고, 정상적으로 등록 된 이후에 DB에 저장하도록 만들었습니다. 또한, 자동결제 등록을 위해 카카오페이에서 임시로 전달하는 key값을 redis에 잠시 저장한 후 사용하기 위해서 redis를 적용하였습니다.

Elasticsearch

  • 서비스에서 병원들을 이름으로 검색하는 기능을 구현했습니다. 이 과정에서 한 글자 한 글자가 완성되면 자동완성하여 보여주도록 했습니다. 이 때, 단순 DB에서 LIKE로 검색할 경우 검색 시간이 오래 걸리는데, 이러한 자동검색이 매우 빈번하게 요청되고 Connection pool에도 부담이 되기 때문에 ElasticSearch를 적용하였습니다.

RabbitMQ

  • AI진단서를 위해서 수의사의 음성을 Text로 뽑은 뒤, AI에 요청을 보내게 되는데 이 때, 트래픽이 몰려서 AI 요약 및 분석이 실패할 경우 재시도를 자동으로 관리하기 위해서 적용하였습니다.

⚙️문제 해결 사례

예약 상세내역 저장방식

  • 저희 서비스에서는 예약신청을 작성할 때, 증상 사진을 넣어주도록 구현했습니다. 이 과정에서 MultipartFile 타입으로 사진을 서버에서 받아서 S3에 저장하게 되는데, 이 때 작성한 정보가 카카오페이를 등록한 이후에 서버에 전달되어야 했습니다. 하지만, 외부 API인 카카오페이를 등록하게 되면 URL이 바뀌게 되어서 이러한 정보를 React에서 유지할 수 없는 이슈가 있었습니다. 이를 해결하기 위해서 File형식으로 저장했다가 다시 MultipartFile로 바꾸는 방식을 고려했는데, MultipartFile은 Http 요청으로만 전달이 되는 타입이었기 때문에 변환에 어려움이 있었습니다. 그래서 Redis에 DB에 저장되는 정보 그대로를 Redis에 저장하였습니다. 그 후, 결제등록이 완료된 이후에만 예약신청내역에 저장되도록 하는 방식을 통해서 해결하였습니다.

📐아키텍처 구성

시스템 아키텍처

alt text

ERD

alt text

📂폴더 구조

  • Frontend
Todak/
├── frontend/                 # React 기반 프론트엔드
│   ├── src/                  # 소스코드
│   │   ├── component/        # 공통/페이지별 컴포넌트
│   │   │   │   ├── auth/     # 인증 관련 페이지
│   │   │   │   ├── Owner/    # 반려인 페이지
│   │   │   │   ├── Staff/    # 직원 페이지
│   │   │   │   ├── Vet/      # 수의사 페이지
│   │   ├── assets/           # 이미지, 폰트 등 정적 리소스
│   │   ├── types/            # TypeScript 타입 정의
│   │   │   ├── Owner/        # 반려동물 주인 관련 타입
│   │   │   ├── Staff/        # 직원 관련 타입
│   │   │   ├── Vet/          # 수의사 관련 타입
│   │   │   └── auth.ts       # 인증 관련 타입
│   │   ├── services/         # API 서비스 로직
│   │   │   └── api/          # API 호출 함수들
│   │   ├── router/           # 라우팅 설정
│   │   ├── layouts/          # 레이아웃 컴포넌트
│   │   ├── store/            # 상태 관리 (Zustand)
│   │   ├── RTC/              # 실시간 통신 (WebRTC)
│   │   ├── utils/            # 유틸리티 함수
│   │   ├── styles/           # CSS 스타일
│   │   ├── plugins/          # 플러그인 설정 (axios 등)
│   │   └── ...               # 기타 src 하위 파일
│   ├── public/               # 정적 파일 (이미지, favicon 등)
│   ├── dist/                 # 빌드된 파일들
│   ├── package.json          # 프론트엔드 의존성/스크립트
│   ├── vite.config.ts        # Vite 설정
│   ├── tailwind.config.js    # Tailwind CSS 설정
│   ├── Dockerfile            # 프론트엔드 도커파일
│   ├── Jenkinsfile           # CI/CD 파이프라인 설정
│   ├── nginx.conf            # Nginx 설정
│   └── ...                   # 기타 설정 파일 (tsconfig, eslint 등)
│
├── README.md                 # 프로젝트 설명서
└── ...                       # 기타 파일/폴더
  • Backend
backend/
├── build.gradle
├── docker-compose.yml
├── Dockerfile
├── gradlew
├── gradlew.bat
├── Jenkinsfile
├── settings.gradle
├── .gitattributes
├── .gitignore
│
├── src/
│   ├── main/
│   │   ├── java/com/A409/backend/
│   │   │   ├── BackendApplication.java
│   │   │   └── domain/
│   │   │       ├── home/
│   │   │       │   └── controller/
│   │   │       │       └── HomeController.java
│   │   │       │
│   │   │       ├── hospital/
│   │   │       │   ├── entity/
│   │   │       │   └── repository/
│   │   │       │
│   │   │       ├── pet/
│   │   │       │   └── entity/
│   │   │       │       ├── OwnerPet.java
│   │   │       │       └── Pet.java
│   │   │       │
│   │   │       ├── reservation/
│   │   │       │   └── entity/
│   │   │       │       ├── FirstTreatment.java
│   │   │       │       ├── Rejection.java
│   │   │       │       ├── Reservation.java
│   │   │       │       └── Treatment.java
│   │   │       │
│   │   │       ├── user/
│   │   │       │   ├── auth/
│   │   │       │   │   ├── entity/
│   │   │       │   │   │   └── Auth.java
│   │   │       │   │   └── repository/
│   │   │       │   │       └── AuthRepository.java
│   │   │       │   │
│   │   │       │   ├── owner/
│   │   │       │   │   ├── controller/
│   │   │       │   │   ├── dto/
│   │   │       │   │   ├── entity/
│   │   │       │   │   ├── repository/
│   │   │       │   │   └── service/
│   │   │       │   │
│   │   │       │   ├── staff/
│   │   │       │   │   ├── controller/
│   │   │       │   │   ├── dto/
│   │   │       │   │   ├── entity/
│   │   │       │   │   ├── repository/
│   │   │       │   │   └── service/
│   │   │       │   │
│   │   │       │   └── vet/
│   │   │       │       ├── controller/
│   │   │       │       ├── dto/
│   │   │       │       ├── entity/
│   │   │       │       ├── repository/
│   │   │       │       └── service/
│   │   │       │
│   │   │       └── global/
│   │   │
│   │   └── resources/
│   │       ├── elasticsearch/
│   │       └── application.properties
│   │
│   └── test/

👥팀원 소개

이대연 김유성 송인범 안성수 전윤지 한진경
FE, 팀장 BE BE BE FE FE

About

ssafy common project todak

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 69.4%
  • Java 30.0%
  • Other 0.6%