의사와 환자, 병원을 상호 연결하는 의료 통합 플랫폼입니다.
정부의 **"일차 의료 방문 진료 수가 시범 사업"**에 영감을 받아, 거동이 불편한 환자들이 겪는 병원 방문의 어려움을 해결하고자 시작한 프로젝트입니다. 의료진과 환자를 효율적으로 연결하는 디지털 플랫폼을 통해 의료 접근성을 향상시키는 것을 목표로 합니다.
- 예약 관리 및 확인
- 진단 기록 작성 및 관리
- 처방전 작성 및 발행
- 환자 진료 이력 조회
- 저장된 주소 기반 주변 병원 검색
- 병원명 및 진료과목별 병원 검색
- 의사 예약 요청 및 관리
- 처방전 QR 코드 조회 및 출력
- 진료 내역 확인
- 소속 의료진 관리
- 예약 현황 관리
- 진료 기록 통합 관리
- 병원 운영 정보 관리
- Language: Java 17
- Framework: Spring Boot 3.5.5
- Build Tool: Gradle 8.14
- Database: MySQL 8.x
- Cache: Redis 7.x
- ORM: Spring Data JPA, QueryDSL
- Authentication: JWT (JSON Web Token)
- Containerization: Docker
- Multi-stage Build: Docker Compose
모노레포 멀티모듈 아키텍처를 채택하여 환자, 의사, 병원 각각의 독립적인 앱 서비스를 효율적으로 관리합니다.
- 관심사의 분리: API, Core, Storage 계층을 명확히 구분
- 도메인 중심 설계: 각 도메인(Appointment, Hospital, Patient 등)별로 패키지 분리
- 재사용성: 공통 로직은 medicall-api-common과 medicall-core에 집중
- api(doctor, patient, hospital, common)
- core
- storage
공통 API 인프라 모듈
- 3개의 API 모듈(patient, doctor, hospital)에서 공통으로 사용하는 기능 제공
- 보안(Security), 인증(Authentication) 설정
- 현재 사용자 정보 추출(
@CurrentUser) - 공통 예외 처리 및 응답 포맷
- 의존성: medicall-core
환자 전용 API 모듈
- Spring Boot 애플리케이션 실행
- 환자의 HTTP 요청 처리
- 병원 검색, 예약 요청, 처방전 조회 등
- 의존성: medicall-api-common, medicall-core
주요 Controller: PatientAppointmentController - 예약 관리 PatientHospitalController - 병원 검색 PatientPrescriptionController - 처방전 조회
의사 전용 API 모듈
- Spring Boot 애플리케이션 실행
- 의사의 HTTP 요청 처리
- 예약 확인, 진단 작성, 처방전 발행 등
- 의존성: medicall-api-common, medicall-core
주요 Controller: DoctorAppointmentController - 예약 확인 및 관리 DoctorTreatmentController - 진단 기록 작성 DoctorPrescriptionController - 처방전 발행
병원 전용 API 모듈
- Spring Boot 애플리케이션 실행
- 병원 관리자의 HTTP 요청 처리
- 의료진 관리, 예약 현황, 병원 정보 관리 등
- 의존성: medicall-api-common, medicall-core
주요 Controller: HospitalDoctorController - 소속 의료진 관리 HospitalAppointmentController - 예약 현황 관리 HospitalInfoController - 병원 정보 관리
비즈니스 로직 핵심 모듈
도메인 중심의 비즈니스 로직을 담당하는 순수 Java 모듈입니다.
구성 요소:
- Domain Model: 불변 객체(Java Record)로 구현된 핵심 도메인
- Service: 비즈니스 로직 처리 및 트랜잭션 관리
- Reader/Writer: 데이터 조회 및 생성/수정 담당
- Validator: 비즈니스 규칙 검증
- Repository Interface: Storage 계층과의 인터페이스 정의
데이터 영속성 모듈
JPA Entity와 실제 데이터베이스 접근을 담당합니다.
구성 요소:
- JPA Entity: 데이터베이스 테이블과 매핑
- CoreRepository: Core의 Repository 인터페이스 구현체
- JpaRepository: Spring Data JPA 기본 Repository
핵심 원칙:
- Entity ↔ Domain 변환 메서드 제공 (
toDomainModel())
- doctors: 의사 정보
- hospitals: 병원 정보
- patients: 환자 정보
- appointments: 예약 내역
- prescriptions: 처방 내역
- treatments: 진단 기록
- 커서 기반 페이징
- Access Token: API 요청 인증
- Refresh Token: Access Token 재발급
- Redis 세션 관리: 토큰 블랙리스트 및 만료 관리
- 모든 API는 JWT 토큰 필수
- CurrentUser로 인증된 사용자 정보 자동 주입
프로젝트의 일관성과 유지보수성을 위해 엄격한 DTO 네이밍 규칙을 적용합니다.
| 레이어 | DTO 타입 | 역할 | 주요 특징 |
|---|---|---|---|
| API Layer | Request | 외부 → 내부 데이터 전달 | - HTTP 요청 검증 - toCommand()/toCriteria() 제공 |
| API Layer | Response | 내부 → 외부 데이터 전달 | - from() 정적 팩토리 메서드 - 민감 정보 제외 |
| Core Layer | Command | 쓰기 작업 명령 | - 생성/수정/삭제 작업 - 불변 객체 |
| Core Layer | Criteria | 읽기 작업 조건 | - 조회/검색 조건 - 페이징 정보 포함 |
| Core Layer | Result | 작업 처리 결과 | - Service → API 전달 - 도메인 객체 조합 |
| 레이어 | 용도 | 네이밍 패턴 | 예시 |
|---|---|---|---|
| API | 생성 요청 | Create[Domain][Resource]Request |
CreatePatientAppointmentRequest |
| API | 수정 요청 | Update[Domain][Resource]Request |
UpdatePatientAppointmentRequest |
| API | 목록 조회 요청 | [Domain][Resource]ListRequest |
PatientAppointmentListRequest |
| API | 검색 요청 | [Domain][Resource]SearchRequest |
PatientHospitalSearchRequest |
| API | 상세 응답 | [Domain][Resource]DetailResponse |
PatientAppointmentDetailResponse |
| API | 목록 응답 | [Domain][Resource]ListResponse |
PatientAppointmentListResponse |
| Core | 생성 명령 | Create[Resource]Command |
CreateAppointmentCommand |
| Core | 수정 명령 | Update[Resource]Command |
UpdateAppointmentCommand |
| Core | 조회 조건 | [Resource][Purpose]Criteria |
AppointmentListCriteria |
| Core | 처리 결과 | Create[Resource]Result |
CreateAppointmentResult |
- 우아한테크코스 Java 스타일 가이드 준수
- 4칸 스페이스 들여쓰기
- 120자 라인 길이 제한
- 모든 제어문에 중괄호 필수
- Import 순서: static → java → jakarta → org → com
프로젝트 루트의 /docs/styleguide/intellij-medicall-java-styleguide.xml 파일을 IDE에 적용해주세요.
