jayeon@portfolio — jsh — 92×34
jayeon@portfolio~/projects%cat projects/ddokddok.md
다중 인스턴스 배치 중복 실행 방지 — MySQL GET_LOCK 리더 선출
문제: 다중 인스턴스 환경에서 배치가 동시에 실행되면 중복 처리 발생. 외부 코디네이터(Redis 등) 없이 멱등성을 보장해야 함.
설계: MySQL GET_LOCK advisory lock으로 리더 인스턴스를 선출. try-finally 블록으로 RELEASE_LOCK 보장. 락 획득 실패 인스턴스는 즉시 종료.
효과: 외부 코디네이터 없이 배치 멱등성 확보. 리더 인스턴스 장애 시 다음 주기에 다른 인스턴스가 자동으로 리더 역할 수행(자동 페일오버).
"검수자 ≠ 작성자" invariant — AI 리라이팅 무검수 노출 차단
문제: AI가 리라이팅한 콘텐츠가 검수 없이 노출되면 신뢰할 수 없는 정보가 부모님에게 전달될 위험.
설계: "검수자 ≠ 작성자" invariant를 도메인 정책 + DB CHECK 제약 + 애플리케이션 검증 3중으로 강제. AI 리라이팅 결과는 항상 별도 검수 상태로 생성.
효과: AI 리라이팅 글의 무검수 노출 원천 차단. 계층별 방어로 단일 계층 우회 시에도 차단 유지.
AI 보조 개발 — 가드레일 기반 워크플로우
문제: AI 보조 개발을 그대로 받으면 아키텍처·컨벤션 일관성이 흔들리기 쉬움.
설계: CLAUDE.md에 아키텍처·컨벤션 가드레일(도메인 의존성 분리, 고정 스택, 시크릿 하드코딩 금지)을 명시하고, 단계별 계획·요약 산출물을 기준으로 진행. 커밋 컨벤션·CI로 품질을 강제.
효과: AI 산출물을 정해진 규칙 안에서 운영해 구조 일관성과 변경 추적성을 유지.
```mermaid
graph TD
  subgraph "다중 인스턴스"
    A[인스턴스 1] -->|GET_LOCK 시도| L{MySQL Advisory Lock}
    B[인스턴스 2] -->|GET_LOCK 시도| L
    C[인스턴스 3] -->|GET_LOCK 시도| L
  end
  L -->|락 획득 성공| D[리더: 배치 실행]
  L -->|락 획득 실패| E[팔로워: 즉시 종료]
  D -->|try-finally| F[RELEASE_LOCK 보장]
  D --> G[알림 발송 배치]
  G --> H[FCM]
```
MySQL GET_LOCK 리더 선출 — 배치 멱등성 구조
```mermaid
sequenceDiagram
  participant 자녀앱
  participant AppLayer
  participant DomainLayer
  participant DB

  자녀앱->>AppLayer: 콘텐츠 등록 요청
  AppLayer->>DomainLayer: 검수자=작성자 검증
  DomainLayer-->>AppLayer: 위반 시 예외 반환
  AppLayer->>DB: 저장 시도
  DB-->>AppLayer: CHECK 제약 위반 시 거부
  Note over AppLayer,DB: AI 리라이팅 결과는 검수 대기 상태로 생성
  AppLayer-->>자녀앱: 검수 필요 상태 반환
```
검수자 ≠ 작성자 invariant — 3중 강제 메커니즘
# 관련 링크
2026.04 — 2026.05 · 될랩

똑똑 (Knock Knock)

자녀가 검수한 안심 정보를 부모님 눈높이로 매일 전달하고, 부모님의 하루 반응을 저녁 요약으로 자녀에게 돌려주는 가족 연결형 시니어 알림 서비스의 REST API 서버.

Java 21jOOQFlywayMySQLFCMTestContainersDocker

다중 인스턴스 배치 중복 실행 방지 — MySQL GET_LOCK 리더 선출

문제
다중 인스턴스 환경에서 배치가 동시에 실행되면 중복 처리 발생. 외부 코디네이터(Redis 등) 없이 멱등성을 보장해야 함.
설계
MySQL GET_LOCK advisory lock으로 리더 인스턴스를 선출. try-finally 블록으로 RELEASE_LOCK 보장. 락 획득 실패 인스턴스는 즉시 종료.
효과
외부 코디네이터 없이 배치 멱등성 확보. 리더 인스턴스 장애 시 다음 주기에 다른 인스턴스가 자동으로 리더 역할 수행(자동 페일오버).

"검수자 ≠ 작성자" invariant — AI 리라이팅 무검수 노출 차단

문제
AI가 리라이팅한 콘텐츠가 검수 없이 노출되면 신뢰할 수 없는 정보가 부모님에게 전달될 위험.
설계
"검수자 ≠ 작성자" invariant를 도메인 정책 + DB CHECK 제약 + 애플리케이션 검증 3중으로 강제. AI 리라이팅 결과는 항상 별도 검수 상태로 생성.
효과
AI 리라이팅 글의 무검수 노출 원천 차단. 계층별 방어로 단일 계층 우회 시에도 차단 유지.

AI 보조 개발 — 가드레일 기반 워크플로우

문제
AI 보조 개발을 그대로 받으면 아키텍처·컨벤션 일관성이 흔들리기 쉬움.
설계
CLAUDE.md에 아키텍처·컨벤션 가드레일(도메인 의존성 분리, 고정 스택, 시크릿 하드코딩 금지)을 명시하고, 단계별 계획·요약 산출물을 기준으로 진행. 커밋 컨벤션·CI로 품질을 강제.
효과
AI 산출물을 정해진 규칙 안에서 운영해 구조 일관성과 변경 추적성을 유지.
MySQL GET_LOCK 리더 선출 — 배치 멱등성 구조
검수자 ≠ 작성자 invariant — 3중 강제 메커니즘