Skip to content

Repository files navigation

탐라모아 (Tamla-moa)

제주 청년 지원사업, 놓치기 전에 알려드립니다.

제주에 사는 19~39세 청년은 취업·창업·주거 지원사업을 찾으려면 온통청년, 제주도청 등 여러 기관 공고를 일일이 뒤져야 합니다. 문제는 "정보가 없어서"가 아니라 신청 마감 타이밍을 놓쳐서 기회를 흘려보낸다는 것입니다. 탐라모아는 흩어진 지원사업 공고를 한 곳에 모아 검색·필터로 찾게 하고, 관심 공고를 북마크해두면 마감 D-7·D-3·D-1에 웹·이메일로 먼저 알려줍니다.

서비스 바로가기: tamla-moa.vercel.app

미리보기

랜딩 핵심 기능 정책 검색
랜딩 히어로 핵심 기능 소개 정책 검색 화면

핵심 기능

  • 마감 알림 — 북마크한 공고의 신청 마감이 다가오면 D-7/D-3/D-1 중 선택한 시점에 웹 알림과 이메일(Gmail)로 알려줌. 채널별 on/off 가능 — 이 서비스의 핵심 차별점
  • 정책 검색·필터 — 카테고리(다중 선택), 나이, 지역, 고용상태, 정렬(마감임박/기관명/조회수)로 조건 검색
  • D-day 표시 — 목록·상세에서 마감까지 남은 일수를 바로 확인, 마감 지난 공고는 기본적으로 숨김
  • 북마크 & 캘린더 — 관심 공고를 계정에 저장하고, 마감일을 달력에서 한눈에 (상시 모집 공고는 접이식 요약으로 별도 표시)
  • 최근 본 공고 — 로그인 없이도 브라우저에 최근 조회한 공고 기록

기술 스택

구분 기술
프론트엔드 · API Next.js (TypeScript), Vercel 배포
DB · 인증 Supabase Postgres, Supabase Auth(Google OAuth), RLS로 사용자별 데이터 격리
정책 데이터 온통청년 getPlcy 공공 API → GitHub Actions로 15분 주기 갱신 → policy_cache 공개 읽기 캐시
예약 이메일 Supabase Cron → Edge Functions(Deno) → Gmail API
UI · 디자인 시스템 shadcn/ui + Tailwind CSS, Pretendard 폰트

자세한 아키텍처는 docs/architecture.md를 참고하세요.

구현 하이라이트

  • RLS + 컬럼 단위 권한 이중 방어 — 북마크·알림 설정 테이블은 Row Level Security로 "내 데이터만" 접근을 강제하고, 서버 전용 상태 컬럼(예: 발송 쿨다운 타임스탬프)은 GRANT/REVOKE로 클라이언트가 아예 쓰지 못하도록 열 단위로도 막았습니다.
  • 원자적 rate-limit — 이메일 발송 제한은 security definer Postgres 함수의 UPDATE ... WHERE ... RETURNING 패턴으로 처리해, 동시 요청에도 경쟁 조건 없이 안전하게 1회만 통과시킵니다.
  • CSS Cascade Layers 버그 추적 — 대형 모니터에서 랜딩페이지 레이아웃이 깨지는 문제를, @layer 밖에 선언된 CSS가 Tailwind 유틸리티보다 항상 우선 적용되는 브라우저 표준 동작 때문임을 원인부터 특정해 해결했습니다.

로컬 실행

npm install
cp .env.example .env.local   # 값 채우기
npm run dev
명령어 설명
npm run dev 개발 서버 실행
npm run build 프로덕션 빌드
npm run lint ESLint 검사
npm run test:email-notifications 이메일 알림 로직 단위 테스트
node --test scripts/refresh-policy-cache.test.mjs 정책 캐시 갱신 스크립트 단위 테스트

.env.local에 필요한 값은 .env.example을 참고하세요. Gmail 알림 관련 설정은 docs/email-notifications-setup.md에 별도로 정리되어 있습니다.

문서

5인 팀, 8일 스프린트로 기획부터 배포까지 진행한 팀 프로젝트입니다.

역할 팀원
총괄 이지훈
백엔드 김승민, 정윤호
프론트엔드 송다검, 진진솔

Releases

Packages

Contributors

Languages