국비과정 4인 팀 프로젝트로 진행한 CareMatch를 발표까지 마쳤다. 기획부터 배포, 발표까지의 과정을 정리해본다.
🔗 서비스 링크: https://care-match-lake.vercel.app
한 줄 소개
CareMatch는 요양보호사·간병인·가사도우미와 요양시설을 연결하는 구인구직 매칭 플랫폼입니다.
고령화 사회로 접어들면서 요양 인력에 대한 수요는 늘고 있지만, 정작 구직자와 시설을 연결해주는 서비스는 파편화되어 있다는 문제의식에서 출발했다. 단순 매칭을 넘어 조건 기반 매칭 점수까지 제공하는 게 핵심 차별점이다.
타겟 사용자
구직자가 등록한 희망조건(직종·지역·근무형태·근무시간대·희망급여)과 공고 조건을 비교해 0~100점 매칭 점수를 자동 계산한다.
자격증, 경력인증 증빙, 사업자등록증, 프로필 사진 등은 presigned URL 방식으로 업로드해서, 서버를 거치지 않고 클라이언트가 스토리지에 직접 업로드하도록 만들어 서버 부하를 줄였다.
| 구분 | 기술 |
|---|---|
| 프론트엔드 | React 19, Vite, TypeScript, Tailwind CSS, React Router — Vercel 배포 |
| 백엔드 | Spring Boot 3, Spring Security(JWT/OAuth2), Spring Data JPA — Render 배포(Docker) |
| DB | PostgreSQL(Neon), 로컬은 H2 인메모리 |
| 마이그레이션 | Flyway (운영에만 자동 적용) |
| 파일 스토리지 | Cloudflare R2 (S3 호환, presigned URL) |
| 결제 | 포트원(PortOne) V2 |
| 지도 | 카카오맵 SDK |
| CI | GitHub Actions (PR마다 프론트/백엔드 자동 빌드·린트·타입체크) |
전부 무료/저비용 티어로 구성해서 실제 서비스처럼 엔드투엔드 배포까지 완료한 게 포인트다.
[React (Vercel)] ──HTTPS/JWT──▶ [Spring Boot API (Render, Docker)]
│
├──▶ PostgreSQL (Neon)
├──▶ Cloudflare R2 (파일 presigned URL)
└──▶ PortOne (결제 검증)
모노레포로 backend/, frontend/, docs/를 분리했고, 프론트/백엔드가 완전히 분리된 SPA + REST API 구조에 JWT(Access/Refresh) 기반 인증을 적용했다.
4명이 겹치지 않고 개발하기 위해 아래 규칙을 세웠다.
main(직접 push 금지) + feature/*. 담당 영역별 접두사를 고정해서(feature/fe-*, feature/be-*) 브랜치 이름만 봐도 누가 어느 영역을 작업 중인지 파악 가능feat: / fix: / refactor: / style: / docs: / chore: 태그로 의도 구분, 작업 중간엔 wip: 커밋 후 나중에 Squash mergemain에 vX.Y.Z 태그만 남기고, main push 시 Vercel/Render가 자동 배포member, auth, jobposting, application, certificate, badge, contact, notification, point, terms, verification, support, storage, security — 도메인 단위로 패키지를 나누고, 각 도메인 안에서 controller/service/repository/domain/dto를 분리해 기능 단위로 독립적으로 개발·리뷰할 수 있게 구성했다.
실제로 부딪혔던 문제와 해결 과정을 정리하면 아래와 같다.
AllowedOriginPatterns)으로 전환server.port=${PORT:8080}으로 해결@Lob 이슈: PostgreSQL에서 문자열 컬럼이 oid로 생성되는 버그 → TEXT 컬럼 명시 + Flyway 마이그레이션 도입현재 구현 완료 범위: 회원가입/로그인(소셜 포함)/비밀번호 찾기/회원 탈퇴, 구인공고 CRUD/검색/지도/매칭점수순 정렬, 매칭 점수 계산, 인재검색+연락처 열람, 구직신청, 인증구직자 마크, 포인트 실결제(포트원), 알림, 관리자 대시보드, 고객센터, 파일 업로드, 접근성 설정까지 — 엔드투엔드로 배포된 상태다.
향후 과제
기획부터 배포까지 4명이 나눠서 진행한 프로젝트를 실제로 발표까지 해보니, 기능 구현 자체보다도 CORS, 배포 환경, 동시성 문제처럼 실제 서비스 단계에서만 만날 수 있는 이슈들을 겪고 해결한 경험이 가장 값진 부분이었다. 특히 결제/포인트 동시요청 문제를 직접 테스트로 재현하고 비관적 락으로 재설계했던 과정은 이후 포트폴리오에서도 강조할 만한 부분인 것 같다.