📊 sunnypoint
개발일지

와 충돌해결

7분 읽기

오늘은 upstream 저장소의 주요 업데이트를 내 버전에 반영하는 데 집중했다. 대상은 ADR 0004 Wave H 단계의 남은 UX 항목 중 우선순위가 높은 세 가지(#285, #289, #290)였는데, 체리픽 과정에서 자잘한 충돌과 타입 오류가 꽤 복잡하게 얽혀 있어 이를 하나씩 해결해 나갔다.

업데이트 포팅과 체리픽 충돌 해결

포팅하기로 한 기능은 스레드별 컴팩션(compaction) 큐 처리, flash와 PTC 간 스트리밍 리포트백 신뢰성 개선, 그리고 ChatView 간에 스크롤 위치와 사이드바 폴더 상태를 전역으로 공유하는 기능이었다.

당연히 체리픽 과정에서 충돌이 발생했다. MarketChatPanel.tsx, api.test.ts, AuthContext.tsx, ChatView.tsx 등 핵심 파일들이 들어왔는데, 다행히 충돌 자체는 우리 쪽에 없던 새 코드가 추가되는 패턴이라 들어오는 변경 사항을 채택하는 방식으로 비교적 순조롭게 정리할 수 있었다.

체리픽 오염 해결과 누락 코드 추가

진짜 문제는 체리픽이 자동 병합을 수행하면서, 우리 포크에는 존재하지 않는 다른 상류 커밋의 코드까지 끌고 들어온 점이었다. 이로 인해 존재하지 않는 함수나 모듈을 참조하면서 에러가 났다.

우선 로그아웃 시 워크스페이스 캐시를 지우는 clearFlashWorkspaceCache 함수가 누락되어 있었는데, 이를 위해 flashWorkspace.ts 파일을 새롭게 만들어 모듈 스코프에 캐싱하고 초기화되도록 했다. 다른 사용자가 같은 브라우저 탭에서 재로그인했을 때 이전 사용자의 워크스페이스 ID가 상속되지 않도록 안전장치를 둔 셈이다.

또한, SSE 스트림을 파싱해 상태값을 전달하는 streamWorkspaceEvents 함수가 없어 테스트가 깨지는 것을 확인하고 직접 구현해 붙였고, 컴팩션 큐가 참조하던 chartSelections 파라미터가 구조 분해 과정에서 누락된 부분도 파라미터 인터페이스를 확장해 채워 넣었다.

TypeScript 타입 에러와의 싸움

로컬 테스트(vitest)는 가뿐히 통과했으나, CI 빌드 시 실행되는 tsc --noEmit 단계에서 총 6가지의 타입 에러가 쏟아졌다.

사용하지 않는 미구현 oauthPopup 모듈 임포트를 정리하고, ChatViewProps 인터페이스에 누락되었던 warmingState 타입을 선언해 주었다. 그리고 공유 링크 핸들러가 참조하던 몇 가지 함수와 유틸을 명시적으로 임포트했다. 컴팩션에서 활용하는 chartSelectionsModelOptions 인터페이스에 정의하고, 메타 헬퍼 함수의 파라미터 개수를 확장해 컴파일 오류를 하나씩 잡아나갔다.

참고로, 아직 포팅하지 않은 #276/#281(차트 선택 기능) 모듈에 의존하는 ChartSelectionSnapshot 타입의 경우는 일단 placeholder 형태로 Record<string, unknown>으로 우회 처리하여 tsc 검사를 무사히 통과하도록 조치했다.

오늘의 결실과 교훈

마지막으로 tsc 검사부터 전체 백엔드 테스트(pytest 4,056건)와 프론트엔드 테스트(vitest 1,390건)를 모두 돌려 에러 0으로 깨끗하게 통과하는 것을 확인했다. 변경 사항은 깔끔히 커밋해 feat/wave-h-285-289-290 브랜치로 PR #11을 생성해 올려두었다.

이번 작업을 통해 체리픽을 할 때는 상류의 이전 커밋들이 어떤 종속성을 가지고 있는지 git show로 더 면밀히 파악해야 한다는 교훈을 얻었다. 또한 로컬 테스트 통과만 믿고 안심하지 말고, CI에 올라가기 전에 로컬에서도 tsc --noEmit을 돌려 타입을 확실히 다잡아 두는 습관이 필요하다는 점을 뼈저리게 느꼈다.

오늘의 소감

원래 소스와 수정된 나의 소스간의 차이가 커지면서 일부 기능을 머지해오는데 상당한 시간을 소비하게 되었다.

일부 체리픽으로 가져오면서 처리하고 있었으나, 가지고 오고 싶은 기능 하나가 대규모 머지 작업을 해야하는 부분이 발생하면서 머지하다 보니 몇일 머지한다고 시간을 보내게 될거 같다.

#개발일지

의견 나누기

💬 GitHub Discussions 댓글 위젯 영역 (Giscus 활성화 예정)