jayeon@portfolio — jsh — 92×34
jayeon@portfolio~/projects%cat projects/ddokddok.md
AI 네이티브 개발 — 바이브코딩을 가드레일·계획으로 통제
문제: AI로 빠르게 만들면 속도는 얻지만, 생성 코드를 그대로 받으면 아키텍처·컨벤션 일관성이 무너지고 변경 추적이 어렵다.
설계: Claude Code로 구현하되 운영 규칙을 직접 설계: ① CLAUDE.md에 가드레일 명시(도메인 Spring 의존성 0 헥사고날, 테스트 선작성, jOOQ·Flyway·MySQL 고정 스택, 시크릿 하드코딩 금지) ② 요구사항 추적표 + 단계별 계획·요약 산출물로 계획→구현→검증 사이클 ③ 커밋 컨벤션 + CI 테스트 게이트로 품질 강제.
효과: AI의 속도를 살리면서 아키텍처 일관성·변경 추적성을 유지. 아래 배치 멱등성·검수 invariant가 이 워크플로우에서 나온 결과물.
다중 인스턴스 배치 중복 실행 방지 — MySQL GET_LOCK 리더 선출
문제: 다중 인스턴스 환경에서 배치가 동시에 실행되면 중복 처리 발생. 외부 코디네이터(Redis 등) 없이 멱등성을 보장해야 함.
설계: MySQL GET_LOCK advisory lock으로 리더 인스턴스를 선출. try-finally 블록으로 RELEASE_LOCK 보장. 락 획득 실패 인스턴스는 즉시 종료.
효과: 외부 코디네이터 없이 배치 멱등성 확보. 리더 인스턴스 장애 시 다음 주기에 다른 인스턴스가 자동으로 리더 역할 수행(자동 페일오버).
"검수자 ≠ 작성자" invariant — AI 리라이팅 무검수 노출 차단
문제: AI가 리라이팅한 콘텐츠가 검수 없이 노출되면 신뢰할 수 없는 정보가 부모님에게 전달될 위험.
설계: "검수자 ≠ 작성자" invariant를 도메인 정책 + DB CHECK 제약 + 애플리케이션 검증 3중으로 강제. AI 리라이팅 결과는 항상 별도 검수 상태로 생성.
효과: AI 리라이팅 글의 무검수 노출 원천 차단. 계층별 방어로 단일 계층 우회 시에도 차단 유지.
```mermaid
graph LR
  A[CLAUDE.md 가드레일] --> B[계획 산출물]
  B --> C[TDD 구현]
  C --> D[CI 테스트 게이트]
  D -->|통과| E[배포]
  D -->|실패| C
```
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 서버. AI 보조 개발(Claude Code) 워크플로우로 단독 구축 — 아키텍처·컨벤션 가드레일과 계획·검증 체계를 직접 설계해 속도와 품질을 함께 잡았다.

Java 21jOOQFlywayMySQLFCMTestContainersDocker

AI 네이티브 개발 — 바이브코딩을 가드레일·계획으로 통제

문제
AI로 빠르게 만들면 속도는 얻지만, 생성 코드를 그대로 받으면 아키텍처·컨벤션 일관성이 무너지고 변경 추적이 어렵다.
설계
Claude Code로 구현하되 운영 규칙을 직접 설계: ① CLAUDE.md에 가드레일 명시(도메인 Spring 의존성 0 헥사고날, 테스트 선작성, jOOQ·Flyway·MySQL 고정 스택, 시크릿 하드코딩 금지) ② 요구사항 추적표 + 단계별 계획·요약 산출물로 계획→구현→검증 사이클 ③ 커밋 컨벤션 + CI 테스트 게이트로 품질 강제.
효과
AI의 속도를 살리면서 아키텍처 일관성·변경 추적성을 유지. 아래 배치 멱등성·검수 invariant가 이 워크플로우에서 나온 결과물.

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

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

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

문제
AI가 리라이팅한 콘텐츠가 검수 없이 노출되면 신뢰할 수 없는 정보가 부모님에게 전달될 위험.
설계
"검수자 ≠ 작성자" invariant를 도메인 정책 + DB CHECK 제약 + 애플리케이션 검증 3중으로 강제. AI 리라이팅 결과는 항상 별도 검수 상태로 생성.
효과
AI 리라이팅 글의 무검수 노출 원천 차단. 계층별 방어로 단일 계층 우회 시에도 차단 유지.
AI 보조 개발 워크플로우 — 가드레일·계획·검증 루프
MySQL GET_LOCK 리더 선출 — 배치 멱등성 구조
검수자 ≠ 작성자 invariant — 3중 강제 메커니즘