LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

DevLogSEO Jing

Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건 수정

2026년 4월 1일·4분 읽기

테스트부터 정리하자

오늘은 밀려 있던 테스트 작업부터 시작했다. coveralls 대시보드를 열어보니 code-block 커버리지가 3.36%로 찍혀 있었다. 컴포넌트 크기에 비해 너무 낮아서, 더 미루기 전에 한번 잡아보기로 했다.

code-block.test.tsx에 총 14개 테스트를 추가했다. children 모드와 HTML(code) 모드를 나눠서 렌더링을 확인하고, hidden sections 접기/펼치기, FullscreenView 진입/종료까지 커버했다. createPortal과 클립보드 API는 모킹해서 처리했다.

icon-button 쪽은 사정이 좀 달랐다. 5개 케이스가 있었는데 당장 고치기보다는 describe.skip으로 스킵 처리하고, 나중에 컴포넌트 구조를 정리하면서 다시 작성하기로 했다. 지금 억지로 맞추면 컴포넌트 변경 때마다 깨질 게 뻔하니까.


버그 1: 코드 전체보기가 세로로 나온다

모바일 프레젠테이션 모드에서 코드블록의 "전체보기"를 누르면 FullscreenView가 세로 방향으로 표시되는 문제가 있었다. 프레젠테이션은 rotate(90deg)로 화면 전체를 가로로 돌려놓은 상태인데, FullscreenView는 그 정보를 모른 채 body 기준 fixed inset-0으로 붙어버리니 방향이 안 맞는 것이다.

해결은 FullscreenView에 zIndex와 rotate prop을 추가하는 방향으로 갔다. 프레젠테이션 컴포넌트에서 FullscreenView를 열 때

rotate={needsRotation}

과

zIndex={60}

을 넘겨주면, FullscreenView 내부에서 회전 여부와 z-index를 외부 컨텍스트에 맞게 처리한다.


버그 2: 프레젠테이션 종료 후 스크롤이 멈춘다

이건 재현 경로가 꽤 길었다. 프레젠테이션 진입 -> 코드 전체보기 열기 -> 코드 닫기 -> 프레젠테이션 종료. 이 순서대로 하면 페이지 스크롤이 완전히 먹통이 된다.

원인을 추적해 보니 useEffect 의존성 배열에 fullscreenCode 상태가 들어가 있었다. 코드 전체보기를 열고 닫을 때마다 effect의 cleanup과 재실행이 반복되면서 overflow 복원 순서가 꼬여버린 것이다.

구체적으로 말하면, cleanup에서 overflow를 원래 값으로 돌리는 로직이 있는데 코드 전체보기가 닫힐 때 cleanup이 한 번, 재실행 시 다시 hidden으로 설정되는 사이클이 돈다. 프레젠테이션이 아직 열려 있는 상태에서 overflow가 잠깐 풀렸다가 다시 잠기는데, 이때 저장해 둔 "원래 값"이 hidden으로 덮어씌워진다. 결국 프레젠테이션 종료 시 hidden을 복원해 버리니 스크롤이 안 되는 것이다.

해결은 간단했다. fullscreenCode를 ref로 바꿔서 최신값을 참조하되, 의존성 배열에서는 제거했다. effect가 불필요하게 재실행되지 않으니 overflow 복원 순서도 정상으로 돌아왔다.


정리

테스트 커버리지 올리기와 버그 잡기를 병행한 하루였다. 특히 두 번째 버그는 useEffect 의존성 배열이 만들어내는 부수효과의 좋은 사례라서 기억해 둘 만하다. 상태값을 의존성에 넣으면 effect 사이클이 예상보다 자주 돌 수 있고, 그 안에서 DOM을 직접 조작하는 코드가 있으면 순서 문제가 생기기 쉽다.

Post Q&A

오케이징에게 물어보기

Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건 수정 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/SEOJing/devLog
파일 14개, 폴더 1개
Day 1 - 디자인 컨셉과 디자인 시스템Day 2 - 블로그 스켈레톤과 MDX 파싱Day 3 - MDX 이슈, 반응형, 다크모드Day 4 - 배포와 CI/CDDay 5 - shiki 제거, MDX 모듈화, 그리고 대량 포스팅Day 6 - 스터디 자료 작성과 데스크탑 비율 수정Day 7 - Front Matter CMS와 관련 게시물 탐색기Day 8 - 아티클 퀴즈와 스터디 자료Day 9 - 프레젠테이션 모드, 코드블럭 개선, 테스팅Day 10 - 프레젠테이션 모드 안정화Day 11 - 프레젠테이션 확대 기능, FullscreenView 개선Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건 수정기술 블로그를 직접 제작하게 된 이유왜 자꾸 프로젝트가 중단되는지

같은 섹션의 대표 이미지

24 posts · latest first
SEO Jing26. 04. 01.

Day 12 - 테스트 커버리지 개선, 모바일 프레젠테이션 버그 2건.

SEO Jing 개발 열두째 날. code-block 테스트 14개 추가로 커버리지 대폭 개선, 모바일 프레젠테이션에서 FullscreenView 방향 전환 문제와 스크롤 멈춤 버그 수정.

26. 04. 01.SEOJing
SEO Jing26. 03. 25.

Day 11 - 프레젠테이션 확대 기능,.

SEO Jing 개발 열한째 날. PC 프레젠테이션 확대/축소 컨트롤 추가, 모바일 orientation 판단 로직 개선, FullscreenView를 독립 컴포넌트로 분리 및 PC 대응.

26. 03. 25.SEOJing
SEO Jing26. 03. 23.

Day 10 - 프레젠테이션 모드 안정화.

SEO Jing 개발 열째 날. 프레젠테이션 모드의 모바일 UX 문제들을 전면 수정. 퀴즈·코드블록·이미지·포스트목록 처리 개선, 롱프레스 UX 및 하단 바 레이아웃 안정화. 모바일 뷰포트·리스트 분할 문제 수정, 채움 비율 보수적으로 조정, 포스트 탐색기 자연 정렬 적용.

26. 03. 23.SEOJing
SEO Jing26. 03. 22.

Day 9 - 프레젠테이션 모드, 코드블럭 개선, 테스팅.

SEO Jing 개발 아홉째 날. 프레젠테이션 기능 추가, 퀴즈 구조 변경, 모바일 반응형, 코드블럭 사용성, 테스팅 도입.

26. 03. 22.SEOJing
SEO Jing26. 03. 21.

Day 8 - 아티클 퀴즈와 스터디 자료.

SEO Jing 개발 여덟째 날. 아티클 퀴즈 디자인시스템 구현과 스터디 대면 자료 작성.

26. 03. 21.SEOJing
SEO Jing26. 03. 20.

Day 7 - Front Matter CMS와 관련 게시물.

SEO Jing 개발 일곱째 날. Front Matter CMS 설치와 관련 게시물 이동 탐색기 구현.

26. 03. 20.SEOJing
SEO Jing26. 03. 18.

Day 6 - 스터디 자료 작성과 데스크탑 비율 수정.

SEO Jing 개발 여섯째 날. 데스크탑 비율 수정과 씨랩 스터디 사전 진단 자료 작성.

26. 03. 18.SEOJing
SEO Jing26. 03. 17.

Day 5 - shiki 제거, MDX 모듈화, 그리고.

SEO Jing 개발 다섯째 날. shiki를 rehype-prism-plus로 교체하고, gray-matter 직접 구현, MDX 모듈화, 페이지 내 검색, 테이블 디자인시스템까지.

26. 03. 17.SEOJing
SEO Jing26. 03. 16.

Day 4 - 배포와 CI/CD.

SEO Jing 개발 넷째 날. lint, codecov, Cloudflare 배포, fs 런타임 이슈.

26. 03. 16.SEOJing
SEO Jing26. 03. 15.

엄청난 피드백.

CLI 코드 리뷰에서 받은 피드백과 전체 코드 수정 계획을 정리했다.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

생각보다 어려웠던 댓글, 완독 로컬스토리지.

localStorage만으로 글 읽기 추적, 스크롤 진행률, 댓글 감지를 구현한 과정을 정리했다.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

MDX 관련 이슈 노트.

블로그 디테일 페이지에서 MDX를 렌더링하기 위해 검토한 라이브러리들과 최종 선택 과정.

26. 03. 15.SEOJing
SEO Jing26. 03. 15.

Day 3 - MDX 이슈, 반응형, 다크모드.

SEO Jing 개발 셋째 날. MDX 라이브러리 이슈, 반응형, 코드블럭, 댓글, 다크모드, 코드 리뷰.

26. 03. 15.SEOJing
SEO Jing26. 03. 14.

디자인 시스템을 구축할 때 주의할 점.

디자인 시스템 구현 시 파일 구조, 디자인 토큰, 유의 사항을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

폰트는 왜 메인 페이지에서만 적용이 안되고 있었을까?.

Tailwind v4 환경에서 폰트가 메인 페이지에서만 적용되지 않던 원인과 Hydration Mismatch 이슈를 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

MDX DOM 트리 파싱하기.

MDX 파일의 경로 탐색 로직과 콘텐츠 트리 생성 과정을 정리했다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

결국 Node.js 까지 와버렸다.

MDX 파일 구조를 JSON으로 변환하기 위해 Node.js의 fs 모듈을 배워봤다.

26. 03. 14.SEOJing
SEO Jing26. 03. 14.

Day 2 - 블로그 스켈레톤과 MDX 파싱.

SEO Jing 개발 둘째 날. 디자인 시스템 확장, 블로그 스켈레톤, 폰트 이슈 해결.

26. 03. 14.SEOJing
SEO Jing26. 03. 13.

전체적인 플로우.

SEO Jing 프로젝트의 기술 스택 선정과 전체적인 개발 플로우 정리.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

Storybook으로 디자인 시스템 테스팅하기.

Storybook의 사용법과 디자인 시스템 개발에서의 장점을 정리했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

MDX가 뭘까?.

MDX의 개념과 블로그에서 활용하는 이유를 정리했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

Day 1 - 디자인 컨셉과 디자인 시스템.

SEO Jing 개발 첫째 날. 디자인 컨셉 설정과 디자인 시스템 구축을 시작했다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

기술 블로그를 직접 제작하게 된 이유.

SEO Jing을 개발하게 된 이유입니다.

26. 03. 13.SEOJing
SEO Jing26. 03. 13.

왜 자꾸 프로젝트가 중단되는지.

프로젝트가 중단되는 이유에 대한 자기 회고입니다.

26. 03. 13.SEOJing