uppinote

uppinote

133개의 글
  1. 백엔드/API설계

    Subscription 모델링: 왜 planId는 불변이어야 하는가 (trialPlanId 분리 패턴)

    Trial은 구독의 한 종류가 아니라 구독 위에 얹힌 임시 레이어입니다. planId를 불변으로 유지하고 trialPlanId로 기능을 덧칠한 설계 이야기입니다.

    18분 읽기
  2. 백엔드/API설계

    분산 트랜잭션이 없을 때: Payment Provider와 DB의 cancelFailed 롤백 패턴

    DB + PG의 다단계 연산은 원자적이지 않습니다. Saga 보상 대신 마커를 저장하고 cron이 자동 복구하는 패턴으로 해결했습니다.

    18분 읽기
  3. 백엔드/API설계

    스케줄 결제의 숨겨진 덫: PENDING Invoice를 먼저 만들어야 하는 이유

    webhook을 Invoice 생성 트리거로 쓰면 세 가지 문제가 터집니다. 스케줄 등록 시점에 PENDING Invoice를 미리 만드는 구조로 해결한 방법을 정리했습니다.

    18분 읽기
  4. 백엔드/인증-보안

    OAuth와 이메일 가입을 하나의 온보딩 플로우로 통합하기

    계정 생성과 조직 설정을 분리하면 OAuth·이메일 두 가입 경로가 하나의 온보딩 페이지로 모입니다. 미들웨어 한 줄이 이 통합을 가능하게 합니다.

    16분 읽기
  5. 백엔드/인증-보안

    NextAuth v5 JWT 콜백: OAuth와 Credentials 사용자 한 곳에서 분기하기

    OAuth 경로에서는 user 객체에 회사 관계가 없어 토큰 초기화에 실패합니다. account.type 분기와 추가 DB 조회로 해결한 방법을 정리했습니다.

    14분 읽기
  6. 백엔드/인증-보안

    NextAuth PrismaAdapter + 암호화된 이메일: Blind Index 커스텀 Adapter

    OAuth 추가 후 getUserByEmail이 null을 반환하는 조용한 실패를 추적해, Prisma Extension과 Blind Index를 활용한 커스텀 Adapter로 해결한 사례입니다.

    20분 읽기
  7. 프론트엔드/Next.js

    OG 이미지 구현의 두 전환점: 단순한 답이 이긴 두 번의 리팩토링

    OG 이미지를 구현하면서 같은 영역을 두 번 리팩토링했습니다. 두 번 모두 "영리해 보이는" 첫 설계를 버리고 "덜 특별한" 두 번째 설계를 택했고, 두 번 모두 그게 맞았습니다. 공통 패턴과 의사결정 기준을 정리합니다.

    16분 읽기
  8. 프론트엔드/Next.js

    Next.js i18n 미들웨어에서 OG 이미지가 안 보이는 이유: redirect vs rewrite 완벽 가이드

    다국어 사이트에서 루트 경로의 OG 이미지가 안 보이는 이유는 next-intl 미들웨어의 307 redirect 때문입니다. 크롤러 UA 감지 대신 모든 요청을 rewrite하여 해결하는 방법을 다룹니다.

    14분 읽기
  9. 프론트엔드/Next.js

    Next.js opengraph-image에서 한글이 깨지는 이유: Satori 폰트 로딩 완벽 가이드

    Next.js `ImageResponse`가 한글을 빈 사각형으로 렌더링하는 이유는 Satori가 OS 폰트를 읽지 않기 때문입니다. `fonts` 배열에 Noto Sans KR을 주입하는 정확한 방법과, 정적 PNG로 전환하는 프래그매틱 대안을 다룹니다.

    16분 읽기
  10. 도구/Obsidian

    window.confirm() 대신 두 번 클릭 패턴: Obsidian 플러그인에서 안전한 삭제 UX 만들기

    Obsidian 플러그인의 Settings 탭에서 window.confirm()을 쓰다가 Linux에서 dialog가 차단되는 문제를 만났습니다. 그리고 credential 삭제는 확인 없이 즉시 삭제되는 더 큰 문제도 있었죠. 두 문제를 한 번에 해결하는 two-step delete 패턴과 destructive action UX의 일반 원칙을 정리했습니다.

    19분 읽기