Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
91923da
chore(deps): 선언 없이 쓰던 의존성 명시하고 검증 파이프라인 추가
RosieOh Aug 23, 2026
081a2e5
fix(security): 프로덕션 로그와 주소창으로 새던 민감정보 차단
RosieOh Aug 23, 2026
24c2646
fix(api): 서버 응답과 어긋나 조용히 실패하던 스키마 정정
RosieOh Aug 23, 2026
6a97cb1
fix(query): 손으로 맞추던 무효화 키를 팩토리에서 가져오게 정정
RosieOh Aug 23, 2026
d8f31a4
refactor(route): 모든 화면을 레이아웃 그룹에 넣고 탭 바를 nav 로 재작성
RosieOh Aug 23, 2026
32bfecc
feat(a11y): 아이콘 버튼에 이름을 주고 포커스 표시를 되살림
RosieOh Aug 23, 2026
74e4a8e
fix(ui): 눌러도 동작하지 않던 진입점들 정정
RosieOh Aug 23, 2026
bff9157
feat(dev): 일반 로그인으로 들어가는 개발 전용 버튼 추가
RosieOh Aug 23, 2026
d22a80f
feat(screen): 데이터 계층만 있고 화면이 없던 기능들 구현
RosieOh Aug 23, 2026
aab2c4f
feat(screen): 저장한 지원금·안 읽음 배지·동의 이력·건강 알림 노출
RosieOh Aug 23, 2026
d79bf62
refactor(cleanup): 아무도 쓰지 않는 코드 제거
RosieOh Aug 23, 2026
5e0b042
test: 조용히 틀리는 경로를 계약·인터셉터 테스트로 고정
RosieOh Aug 23, 2026
ebab192
docs(readme): 이번에 내린 판단의 근거 정리
RosieOh Aug 23, 2026
b17985b
ci: 테스트 환경이 요구하는 Node 버전으로 맞춤
RosieOh Aug 23, 2026
d91ac7b
feat(app): 라우트 경계에 로딩·에러 화면 추가
RosieOh Aug 24, 2026
6b38413
feat(seo): sitemap·robots·OG 이미지 추가
RosieOh Aug 24, 2026
001edd3
chore(env): sitemap 절대 URL 용 NEXT_PUBLIC_SITE_URL 추가
RosieOh Aug 24, 2026
f803110
feat(screen): 지원금 카테고리 탐색과 발견 경로 추가
RosieOh Aug 24, 2026
0ced675
feat(screen): 찜한 병원 목록과 프로필 사진 업로드 연결
RosieOh Aug 26, 2026
97d894a
feat(health): 건강기록 첨부를 실제로 열 수 있게 연결
RosieOh Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .env.example
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
# CareCode 백엔드 베이스 URL
# 백엔드의 CORS_ALLOWED_ORIGINS 에 이 앱의 주소(http://localhost:3000)가 들어 있어야 한다.
NEXT_PUBLIC_API_URL=http://localhost:8080

# 이 앱이 서비스되는 주소. sitemap.xml 과 robots.txt 의 절대 URL 에 쓰인다.
# 비우면 http://localhost:3000 으로 떨어지므로 배포 환경에서는 반드시 설정한다.
NEXT_PUBLIC_SITE_URL=

# ── 웹 푸시(FCM) — 선택 ───────────────────────────────────────────────
# 아래 6개가 "모두" 채워져야 푸시 기능이 켜진다(isPushConfigured).
# 하나라도 비어 있으면 알림 설정 화면에서 푸시 토글이 잠기고 기기 등록 버튼이 숨는다.
# FCM 웹 설정값은 원래 공개되는 값이라 비밀이 아니다.
NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
NEXT_PUBLIC_FIREBASE_APP_ID=
NEXT_PUBLIC_FIREBASE_VAPID_KEY=

# ── 개발용 빠른 로그인 — 선택 (개발 서버에서만 동작) ──────────────────
# 카카오 로그인은 실제 앱 키가 있어야 해서 로컬에서는 쓸 수 없다.
# 아래 둘을 채우면 로그인 화면에 [DEV] 버튼이 생겨 그 계정으로 바로 들어간다.
# 둘 중 하나라도 비면 버튼이 렌더되지 않고, 프로덕션 빌드에서는 코드째 빠진다.
#
# 계정은 백엔드에 직접 만든다:
# curl -X POST http://localhost:8082/auth/register \
# -H 'Content-Type: application/json' \
# -d '{"email":"dev@carecode.local","password":"devpassword123!","name":"dev","role":"PARENT"}'
# role 을 ADMIN 으로 주면 /admin 화면까지 확인할 수 있다.
NEXT_PUBLIC_DEV_LOGIN_EMAIL=
NEXT_PUBLIC_DEV_LOGIN_PASSWORD=
42 changes: 42 additions & 0 deletions .github/workflows/ci.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
name: CI

on:
pull_request:
push:
branches: [main]

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
# package.json 의 engines 하한(^22.22.2 || >=24.15.0)을 만족해야 한다.
# Node 20 에서는 jsdom 30 이 쓰는 undici 가 markAsUncloneable 을 찾지 못해
# 테스트가 한 건도 돌지 않고 죽는다.
node-version: 24
cache: npm

- run: npm ci

# 단계를 나눠 두면 어디서 깨졌는지 로그를 뒤지지 않아도 보인다.
# 앞 단계가 실패해도 뒤 단계 결과를 함께 보려면 `if: always()` 를 쓴다 —
# PR 한 번에 고칠 거리를 모두 알려 주는 편이 왕복을 줄인다.
- name: Typecheck
run: npm run typecheck

- name: Lint
if: always()
run: npm run lint

- name: Test
if: always()
run: npm test

# 스키마 계약 테스트가 통과해도 빌드가 깨질 수 있다(서버 컴포넌트 경계 등).
- name: Build
run: npm run build
env:
NEXT_PUBLIC_API_URL: http://localhost:8080
2 changes: 2 additions & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,8 @@ yarn-error.log*

# env files (can opt-in for committing if needed)
.env*
# 값이 없는 템플릿은 커밋한다. README 가 `cp .env.example .env.local` 을 안내한다.
!.env.example

# vercel
.vercel
Expand Down
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
npm run lint
205 changes: 166 additions & 39 deletions README.md

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions eslint.config.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,15 @@ const compat = new FlatCompat({
})

const eslintConfig = [
{
/**
* flat config 는 `node_modules` 만 기본으로 건너뛴다.
* 빌드 산출물을 빼 두지 않으면 `eslint .` 이 `.next/` 안의 생성 코드까지 훑어
* 몇 분씩 걸린다.
*/
ignores: ['.next/**', 'out/**', 'build/**', 'coverage/**', 'next-env.d.ts'],
},

// Next.js 기본 설정
...fixupConfigRules(compat.extends('next/core-web-vitals', 'next/typescript')),

Expand Down
4 changes: 3 additions & 1 deletion next.config.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,7 +8,9 @@ const nextConfig: NextConfig = {
* 컴포넌트 갤러리(/component-test) 처럼 내부 확인용 화면이 프로덕션 번들에
* 섞여 나가지 않도록 확장자로 걸러낸다.
*/
pageExtensions: isDevelopment ? ['tsx', 'ts', 'jsx', 'js', 'dev.tsx'] : ['tsx', 'ts', 'jsx', 'js'],
pageExtensions: isDevelopment
? ['tsx', 'ts', 'jsx', 'js', 'dev.tsx']
: ['tsx', 'ts', 'jsx', 'js'],
turbopack: {
rules: {
'*.svg': {
Expand Down
Loading
Loading