dictionary-app (프런트엔드)
React 19 + Vite(Rolldown) + TypeScript, Chakra UI v3. TanStack Query·React Router·React Hook Form + Zod·Zustand·ag-grid 사용. GitHub Pages로 배포.
데이터베이스 컬럼명을 표준화하기 위한 단어사전 관리 도구입니다. 컬럼명은 대개 여러 단어와 도메인을 조합해서 만들어지는데, 컬럼명 생성에 필요한 단어와 도메인을 데이터베이스에서 관리합니다. 사용자가 입력한 단어를 잘라 각 단어에 대응하는 정확한 영문 토큰(단축어)을 찾고, 이 단축어들을 언더바(_)로 이어 붙인 뒤 마지막에 도메인을 결합해 최종 컬럼명을 반환합니다. 입력한 단어가 데이터베이스에 없으면 한영사전 인터페이스를 통해 후보 영단어를 보여주고, 사용자가 그중 하나를 선택해 새 단어로 등록할 수 있습니다.
dictionary-app (프런트엔드)
React 19 + Vite(Rolldown) + TypeScript, Chakra UI v3. TanStack Query·React Router·React Hook Form + Zod·Zustand·ag-grid 사용. GitHub Pages로 배포.
dictionary-api (백엔드)
Java 26 + Spring Boot 4.1.0 + Gradle. 레이어드 구조(controller/service/repository) + Spring Data JPA/QueryDsl/Flyway. Render로 배포.
외부 사전 API
국립국어원 표준국어대사전(뜻풀이)·한영사전(krdict, 영어 번역) 오픈 API를 백엔드가 호출해 후보 영단어를 조회합니다.
[dictionary-app] --axios (withCredentials)--> [dictionary-api] React 19 Spring Boot 4 GitHub Pages Render | DB에 없는 단어일 때만 v [국립국어원 표준국어대사전 / 한영사전 API]VITE_APP_API_URL(빌드 시 고정되는 Vite 환경변수)을 baseURL로 axios를 사용하며, withCredentials: true로 세션 쿠키를 실어 보냅니다.StdictClient/KrdictClient)를 호출합니다.세션 기반 인증이며 JWT를 사용하지 않습니다.
spring-session-jdbc로 로그인 세션을 DB에 저장합니다(SPRING_SESSION 테이블).POST /login) 성공 시 서버가 세션을 생성하고, 프런트엔드는 이후 모든 요청에 세션 쿠키를 자동으로 실어 보냅니다(axios withCredentials: true).AuthorizationInterceptor가 담당하며, 화이트리스트(fail-closed) 방식입니다 — @PublicApi가 없는 모든 API는 로그인이 필요합니다.guest_yn = 'Y')은 조회는 가능하지만 @WriteApi가 붙은 생성/수정/삭제는 403으로 거부됩니다.프런트엔드 — GitHub Pages
dictionary-app 저장소의 deploy 브랜치에 push되면 GitHub Actions가 빌드 후 GitHub
Pages로 배포합니다. master는 통합 브랜치일 뿐 배포를 트리거하지 않습니다.
백엔드 — Render
dictionary-api 저장소의 deploy 브랜치에 push되면 Docker 이미지로 빌드되어 Render에
배포됩니다. 무료 티어 슬립 방지를 위해 10분 간격으로 /actuator/health를 호출하는
keep-alive 워크플로우가 있습니다.
로컬에서 전체 스택(MySQL + 백엔드 + 프런트엔드)을 한 번에 띄우려면 dictionary-api의 docker-compose.yml(docker 프로파일)을 사용합니다 — 세 컨테이너가 dictionary-net 브리지 네트워크로 묶입니다.