Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
게시글 프로젝트 Frontend 레포지토리
README 전체를 불러오는 중입니다.
README 전문 보기 ↗일본 취업 · 워킹홀리데이 · 유학 · 일본생활 · 여행에 관심 있는 한국인을 위한 커뮤니티 서비스의 프론트엔드입니다. 기획부터 설계, 개발, 배포, 운영까지 1인으로 진행했습니다.
📦 운영 종료 안내 이 서비스는 2026년 6월부터 11월까지 실제로 운영되었고, 2026-11-25에 운영을 종료했습니다. 지금은 게시글을 작성자 정보 없이 보여주는 읽기 전용 아카이브로 전환되어 있습니다.
| 메인 | 카테고리 |
|---|---|
| 게시글 상세 | 글쓰기 에디터 |
|---|---|
| 로그인 (Cloudflare Turnstile) | |
|---|---|
회원 닉네임과 IP 표시는 개인정보 보호를 위해 모자이크 처리했습니다.
| 영역 | 기술 |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS 4 |
| Editor | Tiptap 3 (이미지 삽입 확장) |
| 배포 | Vercel (Analytics, Speed Insights) |
| 외부 API | 한국수출입은행 환율 Open API |
| 영역 | 경로 |
|---|---|
| 게시판 | /posts, /posts/category/[slug], /posts/[id], /posts/search, /posts/new |
| 공지 | /notices, /notices/[id] |
| 회원 | /signup, /login, /find-account, /reset-password, /mypage, /users/[nickname] |
| 알림 | /notifications |
| 관리자 | /admin, /admin/reports, /admin/users, /admin/notices |
| 정책 | /terms, /privacy, /about, /contact |
토큰은 HttpOnly 쿠키라 JS에서 읽을 수 없고, 클라이언트는 /me 응답을 받은 뒤에야 로그인 여부를 압니다.
그래서 로그인한 사용자가 /login에 들어오면 "로그인" 화면이 잠깐 보였다가 이동하는 문제가 있었습니다.
**Next.js Proxy(구 Middleware)**에서 쿠키 존재 여부만 보고 렌더 전에 리다이렉트해 해결했습니다. 실제 인가 검증은 백엔드가 담당하고, 프론트는 낙관적 검사만 합니다.
환율 API 키는 NEXT_PUBLIC_ 접두어를 붙이지 않아 클라이언트 번들에 포함되지 않게 했고, 서버 컴포넌트에서만 호출합니다.
unstable_cache로 응답을 캐싱해 영업일 1회 고시되는 데이터를 매 요청마다 부르지 않도록 했습니다.
lib/api/에 도메인별 API 함수를 두고, 클라이언트용(client.ts)과 서버 컴포넌트용(server.ts) 호출을 나눴습니다.
브라우저 fetch는 쿠키를 자동으로 싣지만 서버 컴포넌트의 fetch는 그렇지 않아서, 서버 쪽에서는 요청 쿠키를 헤더로 직접 전달해야 하기 때문입니다.
NEXT_PUBLIC_ALLOW_INDEXING=true일 때만 색인을 허용하도록 해서, 프리뷰 배포가 검색에 노출되지 않게 했습니다.
운영 환경에서는 sitemap과 robots.txt를 통해 Google Search Console에 등록했습니다.
app/ # App Router 페이지
components/ # 도메인별 컴포넌트 (post, comment, admin, auth, layout ...)
lib/
├── api/ # 백엔드 API 호출 (도메인별)
├── auth-context.tsx
└── ... # 포맷, 레벨, 알림, 환율 등 유틸
types/ # 공통 타입
proxy.ts # 인증 페이지 리다이렉트
npm install
npm run dev # http://localhost:3000
백엔드 주소 등 환경변수는 .env.local에 설정합니다.