"문자열이 남아있다고 로직이 맞는다는 뜻은 아니다"
Project 생성은 단순한 INSERT 하나가 아니라, Project를 만들고 생성자를 OWNER로 등록하는 두 단계 작업이었습니다. 이 두 단계가 Server Action에서 원자적으로 처리될 방법이 필요했습니다.
그런데 이 작업을 준비하면서 계속 마음에 걸리던 문제가 하나 있었습니다. 이전 작업들을 거치며 테스트가 계속 expect(sourceCode).toContain("특정 문자열") 방식으로 작성되고 있었는데, 이 방식은 실제 로직이 맞는지 전혀 검증하지 못합니다. 이 한계는 두 차례나 지적됐지만 "다음 작업부터 개선"으로 계속 미뤄지고 있었습니다.
create_transformation_project_with_owner라는 SECURITY DEFINER RPC를 설계해 Project 생성과 OWNER 등록을 단일 트랜잭션으로 묶고, 내부에 인증·권한·workspace 경계 재검증을 이중으로 넣도록 했습니다. 그리고 이번에는 문자열 매칭 테스트 대신, Supabase client를 실제 mock하고 함수를 직접 호출해 반환값과 mock 호출 여부를 검증하는 방식으로 전환할 것을 명시적으로 요구했습니다.
RPC의 이중 방어 구조를 코드로 확인했고, 10개 테스트 케이스가 전부 실제 함수 호출 기반으로 전환된 것을 확인한 뒤 Sign-off했습니다. 115개 테스트가 통과한 것까지는 확인했지만, 두 번이나 미뤄졌던 부채를 세 번째 작업에서야 갚았다는 사실 자체가, 이런 개선이 왜 미뤄지기 쉬운지를 함께 보여준 사례였습니다.
Server Action만으로는 여러 테이블에 걸친 작업의 원자성을 보장할 수 없다고 판단해 DB 레벨 트랜잭션이 필요한 RPC 방식을 택했습니다. 테스트 방식 전환은, 변수명만 같아도 통과하고 로직이 틀려도 문자열만 남아있으면 통과하는 검증 방식으로는 보안 핵심 로직(권한 경계)을 전혀 보증하지 못한다는 문제의식 때문이었습니다. 두 번이나 미뤄졌던 부채라, 이번에는 미루지 않고 실제로 강제했습니다.
Server Action의 각 조건 분기(성공/검증실패/권한거부/NOT_FOUND/RPC에러)마다 다른 입력값을 mock에 주입해 함수를 직접 호출해본다 반환값이 문자열 검사가 아니라 실제 객체 구조로 비교되는지 테스트 코드를 직접 읽어 확인한다 mock의 spy(rpc, insert)가 실제 호출 경로에 연결되어 있는지 확인한다 RPC 함수의 SECURITY DEFINER 선언과 search_path 설정을 SQL 파일에서 직접 확인한다
관련 프로젝트
프로젝트 개요 비즈니스 프로세스 트랜스포메이션(BPR)을 지원하는 한국어 기반 웹 애플리케이션. 컨설팅 프로젝트의 AS-IS 프로세스 분석부터 TO-BE 설계, Blueprint 승인까지의 전체 워크플로우를 디지털화하는 플랫폼으로, EPIC 단위로 구조화된 백로그를 기반으로 개발 중. 역할 및 워크플로우 PM / Architect / Reviewer 역할 수행 Codex(구현 담당)에게 Task 단위 구현 프롬프트 설계 Codex 구현 결과를 git log, git grep, git status로 직접 검증 후 승인 승인 전에는 Codex가 commit하지 않는 엄격한 게이팅 프로세스 운영 한 번에 하나의 Backlog Task만 진행, Task 완료 전 다음 Task 착수 금지 기술적 의사결정 및 성과 워크스페이스/프로젝트 접근 권한을 DB 레벨(복합 FK, SECURITY DEFINER 트리거)과 애플리케이션 레벨(Server Action 권한 검증)의 이중 방어 구조로 설계 Hard Delete 미구현 원칙 하에 배열 필드 전체교체(replace)를 단일 트랜잭션 RPC로 처리하는 패턴 확립 및 재사용 AS-IS 프로세스 그래프의 순환 참조 탐지에 Tarjan SCC 알고리즘 적용, 차단 오류(Error)와 경고(Warning)를 분리한 이중 Validator 아키텍처 설계 도메인 규칙 위반을 커스텀 Postgres 에러 코드 체계(SIA0104)로 문서화하여 거버넌스 문서와 코드베이스 간 정합성 유지 AI 생성 데이터와 사람이 검증한 데이터를 구분하는 generatedbyai / verified 메타데이터 패턴을 여러 도메인 테이블에 일관되게 적용 진행 상태 ✅ EPIC-01 (인증 / 워크스페이스 / 프로젝트 접근) ✅ EPIC-02 (조직 / 산업 / 프로젝트) 🚧 EPIC-03 (AS-IS 프로세스 그래프) — 그래프 검증, Input/Output 스키마, Business Rule 스키마 구현 완료