제출본의 정본은 내 문서가 아니라 콘솔과 업로드된 파일이다

9월 8일, 네이버 로그인 승인을 확인하러 개발자 콘솔을 열었다. 제출된 소명문을 펼쳐 보니 171자 다섯 문장이었다. 세션이 쓴 문서에는 「최종 제출본」으로 135자 네 문장이 적혀 있었다. 다섯째 문장은 제출 직전에 내가 더한 것이었고, 어느 기록에도 없었다 그 뒤로 규칙을 하나…

원스토어 콘솔에서는 기본값과 「권장」부터 의심했다

9월 16일, 원스토어 콘솔에 APK를 올리자 서명 옵션이 둘 떴다. 한쪽에 「(권장)」이 붙어 있었다. 그쪽을 고르면 원스토어가 앱을 다시 서명하고, 서명 지문이 바뀌면 카카오와 구글 콘솔에 등록해 둔 키 해시가 전부 어긋난다. 소셜 로그인 넷이 한꺼번에 죽는다 권장이 안 붙은…

위치기반 앱은 스토어 저장 버튼에서 사업자등록까지 거슬러 올라간다

9월 2일 오후 4시 18분, 원스토어 콘솔에서 저장을 두 번째로 눌렀다. 첫 번째는 「등록 실패. 고객센터에 문의 주시기 바랍니다.」였고, 두 번째에 진짜 이유가 나왔다. 신고필증 파일이 없다는 것이었다 그 파일 하나를 받으려고 사업자등록부터 다시 시작했다. 결과만 적으면 자택으로 사업자등록을 신청한…

AI 에이전트가 앱 출시를 대신 못 한 자리는 네 종류뿐이었다

9월 7일 밤 9시 13분, 홈택스 사업자등록 화면에서 건물명·동·층·호 칸이 비어 있었다. 입력도 안 됐다. Claude Code 세션은 그 화면을 보고 「사업장 주소에 호수가 없다」고 적었고, 주소검색으로 다시 넣어 보자고 권했다. 나는 그대로 저장을 눌렀다. 다음 날 받은 사업자등록증에는 호수까지…

DIP로 컴포넌트 순환 의존을 끊으려면 시그니처의 타입까지 옮겨야 한다

강의를 만들면 빈 커리큘럼도 함께 생기게 하고 싶었다. 강의 생성 서비스에서 커리큘럼 생성 포트를 한 줄 부르자 테스트 두 개가 깨졌다. 하나는 DB의 유니크 제약이고, 하나는 아키텍처 테스트의 순환 금지 규칙이다. 순환은 의존성 역전 원칙(DIP)으로 풀었다. 인터페이스를 쓰는 쪽 패키지로…

도메인에 위임만 하는 애플리케이션 서비스도 테스트해야 버그가 드러난다

커리큘럼 편집 서비스의 메서드는 모두 세 줄이다. 커리큘럼을 찾고, 도메인 메서드를 부르고, 저장한다. 로직은 전부 도메인에 있고 도메인 테스트는 꼼꼼하다. 강의는 이 서비스가 너무 단순하다며 테스트를 과제로 남겼다. 나는 그 과제를 하기 전에 서비스를 먼저 커밋했는데, 강의 코드에 있던 버그…

JPA OrderColumn과 orphanRemoval은 수업 이동에서 충돌한다

도메인 코드에서 수업을 지우는 방법은 리스트에서 빼는 것이다. JPA의 orphanRemoval은 그렇게 빠진 엔티티를 DB에서도 지워 준다. 편한 설정이지만 커리큘럼에서는 켤 수 없었다. 수업 이동이 “한 리스트에서 빼서 다른 리스트에 넣는” 동작이고, JPA 스펙은 고아가 된 엔티티를 다른 관계에 다시 넣지…

리스트 인덱스로 애그리거트 구조를 편집하면 삭제가 인덱스를 먼저 바꾼다

커리큘럼 편집 요청은 전부 숫자로 온다. “섹션 0번의 수업 2번을 섹션 1번의 0번 자리로 옮겨라” 같은 식이다. 리스트 인덱스로 애그리거트 구조 편집을 구현하면 코드는 짧다. 대신 remove가 한 번 일어나면 그 뒤 원소의 인덱스가 하나씩 당겨진다는 사실을 계속 의식해야 한다.…

커리큘럼 애그리거트는 탐색이 아니라 편집을 기준으로 트리로 설계한다

강의 애그리거트에는 강사, 소개, 공개 상태가 들어 있다. 다음은 실제 학습 내용이다. 강의는 여러 수업으로 이뤄지고, 수업이 많으니 섹션으로 다시 묶는다. 수업과 섹션은 강의에 속한 것처럼 보이니 Course 아래에 매달고 싶어진다. 이 글의 커리큘럼 애그리거트 트리 설계는 그 선택지를 버리는…