열린 항목

여기는 아직 정하지 않았거나, 정한 것끼리 부딪히는 지점을 모아두는 곳이다.

표준을 읽다가 빈틈을 발견하면 그 자리에서 여기에 적는다. 대화가 끊겨도 남아야 하기 때문이다. 적을 때는 무엇이 비었는지를 한 줄로 남긴다. 자세한 경로는 그 빈틈을 닫는 글이 든다.

  • 모순 — 두 표준이 서로를 부정한다. 코드를 짜면 그 자리에서 막힌다
  • 미정의 — 정한 적이 없다. 사람마다 다르게 구현하게 된다

닫을 때는 여기서 지우지 않고 닫힌 항목으로 옮긴다. 무엇이 왜 열려 있었는지가 그 표준을 만든 이유이기 때문이다. 이 장부를 페이지 둘로 나눈 것도 그래서다 — 새 표준을 쓰기 전에 읽어야 하는 건 열린 쪽뿐인데, 한 페이지에 두면 이미 닫힌 것까지 매번 따라온다.


아키텍처 자체가 비어 있는 자리

#항목종류무엇을 정해야 하나파급
1 3계층만의 표준 미정의
계층과 패키지 구조는 정해졌는데 Controller 네이밍·Mapper XML처럼 3계층에서만 의미가 있는 규칙은 0개다. Route는 URL 라우팅 네이밍 표준이 양쪽으로 닫았다. 여기에 「도메인 드리븐 전용」 표시가 붙은 원칙 3개가 얹힌다 — 정렬 화이트리스트의 소유 자리, DELETE의 범위, 상태 전이 동사의 출처. 돌아가는 프로젝트가 없어 미루고, 프로젝트가 서면 한꺼번에 닫는다
높음

요청 한 사이클에서 비어 있는 자리

여섯 중 다섯(로깅·추적 키, ErrorCode의 수명주기·진단 정보 경계·도메인 판별·공용 클라이언트 소유권)은 ErrorCode 계약 표준이 닫았다. 하나가 남았다.

#항목종류무엇을 정해야 하나파급
7 If-Match로 수정 충돌을 막을지 미정의
조회에 ETag를 붙이면서 수정 충돌을 HTTP에서 막을 재료가 생겼다. 앞당길지, 412를 공통 봉투와 ErrorCode로 어떻게 표현할지가 비어 있다
중간

이미 정한 표준이 조회를 막고 있는 자리

브라우저에서 DB까지 조회 하나가 흐르는 길을 한 칸씩 짚으면서 나왔다. 새로 정하는 것으로 끝나지 않고 이미 닫은 표준을 다시 열어야 한다.

#항목종류무엇을 정해야 하나파급
8 조회 캐시를 어느 계층에 두는가 미정의
캐시·Redis가 표준 전체에서 0건이다. @Cacheable도 프록시 기반이라 Service를 package-private으로 감춘 구조와 부딪히고, 무효화 책임도 비어 있다
중간

조회 요청이 들어오는 쪽에서 비어 있는 자리

같은 검색에서 나왔다. 기존 표준과 부딪히지는 않는다 — 정한 적이 없을 뿐이라 새로 정하면 된다.

#항목종류무엇을 정해야 하나파급
9 CORS preflight 실패의 응답 미정의
OPTIONS는 Controller도 Advice도 안 타서 실패해도 공통 봉투가 안 나간다. 허용 출처를 어디서 설정할지, ErrorCode로 표현할 수 있는지가 비어 있다
중간

데이터베이스 쪽에서 비어 있는 자리

같은 검색에서 나왔다. 요청 흐름 그림의 마지막 칸 바깥이라 지금까지 한 번도 안 보이던 자리다.

#항목종류무엇을 정해야 하나파급
12 트랜잭션 격리 수준 미정의
격리 수준이 0건이다. 경계와 readOnly는 정했지만 격리는 DB 기본값에 맡겨져 있고, MariaDB의 REPEATABLE READ가 의도한 것인지 확인한 적이 없다
중간
14 읽기 복제본과 readOnly = true의 관계 미정의
복제본을 두면 readOnly라우팅 힌트가 되고 쓰고 바로 읽기가 깨진다. 다만 이 프로젝트에 복제본이 있는지부터 확인해야 한다
중간

컨트롤러를 둘로 가르면서 새로 열린 자리

컨트롤러 패키지 분리 표준을 정하는 순간 따라 나온 빈틈 둘 중 하나가 남았다. 나머지 하나(소속 판정 단위)는 아키텍처 소속 표준이 닫았다.

#항목종류무엇을 정해야 하나파급
15 web 패키지 안에서 무엇을 하라는 규칙이 하나도 없다 미정의
SSR·템플릿·ModelAndView0건이고 응답 규칙은 전부 JSON 전제다. 실패 처리와 뷰 모델 규칙이 통째로 없는데, SSR 프로젝트가 없어 미룬다
높음

AI가 Java 코드를 부분만 읽을 방법이 비어 있는 자리

블로그 색인(_ai/index.yml · _ai/map.yml)을 Java에도 옮길 수 있는지 보다가 나왔다.

#항목종류무엇을 정해야 하나파급
18 블로그의 색인 층을 Java 코드에 어떤 모양으로 옮길 것인가 미정의
블로그 색인은 44편을 재고 나서 정했는데 Java엔 소스가 없다. 줄 번호(A) · 심볼(B) · 유스케이스 횡단(C) 중 C가 유력하나 임계점은 도메인 둘이 application에서 만나는 유스케이스다
중간

포맷터를 도구에 맡기면서 IDE 쪽이 확인되지 않은 자리

코드 포맷터 표준에서 Spotless는 돌려봤지만 IDE 쪽은 재보지 않았다.

#항목종류무엇을 정해야 하나파급
19 IDE가 만드는 모양과 빌드가 만드는 모양이 같은지 확인되지 않았다 미정의
Spotless는 Eclipse JDT, IntelliJ는 자기 엔진이라 같은 XML로 같은 출력이 나온다는 보장이 없다. 어댑터로 한 벌이 되는지, 안 되면 IDE 포맷을 끌지가 비어 있다
중간

컨트롤러의 봉투 조립을 그대로 두기로 하면서 남은 자리

끝까지 안을 좁혀놓고 지금은 하지 않기로 한 것이다. 다시 열 조건만 적어둔다.

#항목종류무엇을 정해야 하나파급
20 성공 봉투 조립을 컨트롤러 밖으로 뺄 것인가 미정의
성공 팩토리를 헬퍼로 옮기는 안(B-3)까지 골라놓고 접었다. 이름이 Swagger @ApiResponses와 겹치고, 복사본이 아직 몇 벌 없다. 쌓이면 다시 본다
중간
21 컨트롤러 본문을 흐름으로 읽히게 하는 방법 미정의
Optional 체인(F-5)·실패를 값으로(F-4)·우리 타입에 map(F-2)은 버렸다. 남은 것은 지역변수(F-6)인데 var가 0건이라 그 선을 먼저 그어야 한다
중간

이슈 하나를 여러 세션이 이어받을 때 무엇이 남아야 하는가

에이전트 운영 표준에서 본문과 댓글의 소유가 확정되자 그 둘로도 안 덮이는 자리가 드러났다.

#항목종류무엇을 정해야 하나파급
25 이슈를 쪼갤지 묻는 계약 개수를 무엇으로 재는가 미정의
기준 개수가 지어낸 값이다. 신호는 앞에서 띄우는데 정답은 뒤에서만 나오므로, 무엇을 어디에 관측할지와 몇 건을 봐야 고칠지가 비어 있다
낮음

계약을 표로 바꾸면서 새로 열린 자리

API 테스트 계약표 표준을 정하면서 끝까지 못 정한 것 중 남은 둘이다. 실제로 API 하나에 만들어봐야 답이 나온다.

#항목종류무엇을 정해야 하나파급
26 어노테이션에서 행을 어디까지 뽑을 수 있는가 미정의
@Min·@Max·@NotNull은 경계가 명확한데 @Pattern은 정규식이라 경계가 자동으로 안 나온다. 커스텀 검증(@SortKey)도 같다. 생성기가 못 뽑는 것을 어떻게 표시할지가 비어 있다
중간
27 API 수십 개의 표를 어디서 모아 보는가 미정의
표준은 API 하나의 표만 정했다. API 50개면 HTML 50장인데 노랑이 어디 있는지 한눈에 볼 층이 없다. 지금은 도메인마다 리스너 하나·HTML 하나뿐이라 통합 뷰가 없다. 요약 페이지를 둘지, 노랑이 있으면 CI를 실패시킬지가 비어 있다
중간

이슈 상태를 표준이 건드리기 시작하면서 열린 자리

커밋 대기 표준이 원칙 4-1·4-2로 이슈 전환을 가져갔다. 표준이 저장소 밖(트래커)의 상태를 처음으로 건드린 것이라, 그 바깥을 다루는 규칙이 아직 없다.

#항목종류무엇을 정해야 하나파급

접미사로는 더 못 쪼개는 큰 폴더가 남은 자리

접미사 패키지 분할 표준api·application만 나누기로 하면서 접미사로 안 풀리는 자리가 숫자로 드러났다.

#항목종류무엇을 정해야 하나파급

표준이 코드가 아니라 태도를 다루기 시작하면서 열린 자리

일머리 표준이 처음으로 만들어지는 코드가 아니라 만드는 과정의 판단을 규칙으로 적었다. 그러면서 다른 표준에는 없던 문제가 두 개 따라왔다.

#항목종류무엇을 정해야 하나파급
44 일머리가 이 저장소와 배포본 밖에서는 안 걸린다 미정의
38번을 닫으면서 덮이지 않은 자리가 남았다. 일머리는 이제 coding-standards/CLAUDE.md(자바 프로젝트)와 이 저장소의 CLAUDE.md 두 곳에서 걸리는데, 그 밖의 프로젝트에서는 여전히 안 걸린다. 전역 ~/.claude/CLAUDE.md 에 두면 전부 덮이지만 저장소 밖이라 검사가 못 미치는 것이 38번을 그 방식으로 안 닫은 이유 그대로 남아 있다 — 장부가 거기 심링크가 있다고 적어둔 것이 실제로는 없었고 아무도 몰랐다. 검사가 닿는 전역 자리를 만들 수 있는지, 아니면 일머리를 「표준을 깐 프로젝트에서만 도는 규칙」으로 범위를 좁혀 못 박을지가 비어 있다
보통

테스트의 통증에 이름을 붙이면서 열린 자리

테스트 냄새 어휘 표준이 진단의 통증 넷을 Meszaros 의 이름으로 부르기로 했다. 이름은 들였는데 그 이름이 가리키는 곳을 볼 수단이 없는 자리가 둘 드러났다. 그중 40번은 패키지 구조 표준 원칙 7이 닫았다. 하나가 남았다.

#항목종류무엇을 정해야 하나파급
39 프로젝트 냄새를 볼 사람도 자리도 없다 미정의
Meszaros 는 냄새를 누가 알아채는가로 셋으로 가르는데, 세 번째(프로젝트 냄새)의 전제가 「코드도 안 보고 테스트도 안 돌리는 사람」이다. 이 프로젝트에 그 역할이 없어서 주기 점검 자리를 만드는 안을 버렸다 — 안 도는 자리는 덮여 있다는 착각을 만들기 때문이다. 그런데 진단의 통증 넷 중 하나(High Test Maintenance Cost)가 정확히 거기 있어 진단의 4분의 1이 안 보이는 채로 남는다. 에이전트가 그 자리에 앉을 수 있는지(코드를 읽으므로 정의상 안 된다), 아니면 「고치는 데 든 시간」을 사후에라도 재는 다른 수단이 있는지가 비어 있다
높음

실패 화면을 정하면서 열린 자리

실패 화면 표준이 예상 못 한 예외를 error.js 로 잡기로 했다. 화면은 지켜지는데 그 예외가 있었다는 사실이 사람에게 닿는 길은 안 정했다.

#항목종류무엇을 정해야 하나파급

디자인 리뷰를 표준으로 만들면서 열린 자리

Figma 리뷰 댓글 표준이 에이전트가 어디서 멈추는지는 정했다. 그 이력을 프로젝트마다 어디에 어떤 형태로 두는지는 안 정했다.

#항목종류무엇을 정해야 하나파급
53 리뷰 이력을 프로젝트마다 어디에 두나 미정의
이 블로그는 _data/design-review.yml + _pages/design-review.md 로 뒀는데, 그건 Jekyll 구조라 배포본을 쓰는 자바·Next.js 프로젝트에는 그 자리가 없다. 표준은 「저장소 안에 두되 데이터와 표시용을 나눈다」까지만 말하고 실제 경로와 형식을 정하지 않았다 — 그러면 프로젝트마다 다른 자리에 다른 모양으로 생기고, 에이전트가 어디를 읽어야 할지 매번 찾는다. Figma 를 실제로 쓰는 프로젝트가 아직 이 블로그뿐이라 두 번째가 나오면 그때 공통 자리를 정한다
중간
54 핀이 며칠째 안 닫히면 무엇을 하나 미정의
표준은 「쌓인 핀은 확인이 밀린 만큼이고 그게 보이는 게 맞다」고 정했다. 그런데 밀린 것을 알려주는 장치는 없다. 이력의 waiting 이 몇 건이든 아무도 말해주지 않아서, 확인을 잊으면 그대로 쌓인다. 실패 알림 표준이 터진 것을 사람에게 밀어주듯 밀린 리뷰도 밀어줄지가 비어 있다. 며칠을 기준으로 볼지, 어디로 보낼지 둘 다 안 정했다
낮음

이미 닫힌 것은 닫힌 항목에 있다.