Expo와 Next.js를 같이 둘 때 lint와 asset 타입을 맞추기
초기 모바일 앱과 웹 앱이 같은 저장소 안에 있을 때 lint, 이미지 컴포넌트, 폰트/이미지 타입 선언을 정리한 기록입니다.
Code notes
코드에서 확인한 구현 포인트
배포 기준 2025.12.18
관련 파일
eslint.config.mjsapps/mobile/tsconfig.jsonapps/mobile/types/assets.d.tsapps/web/app/upload-test/page.tsx구현 메모
Next.js 웹 규칙과 Expo 앱 asset 처리 방식이 같은 저장소에서 충돌하는 지점을 확인했다.
폰트와 이미지 asset 타입 선언을 추가해 Expo 쪽 TypeScript 오류를 줄였다.
웹 업로드 테스트 화면은 Next Image 사용 방식에 맞춰 lint 경고를 정리했다.
웹 규칙과 앱 규칙이 부딪히다
초기에는 웹 앱과 Expo 앱이 같은 저장소 안에 있었다. 이 구조는 빠르게 만들기에는 좋았지만, lint와 TypeScript 규칙이 서로 다른 세계를 동시에 보게 되는 문제가 있었다.
Next.js는 웹 접근성과 이미지 최적화 규칙을 강하게 보고, Expo 쪽은 폰트와 이미지 asset을 번들러가 다르게 처리한다. 그래서 같은 TypeScript 프로젝트 안에서 작은 타입 오류와 lint 경고가 쌓였다.
정리한 것들
웹의 업로드 테스트 페이지에서는 일반 img 대신 Next Image를 쓰도록 바꾸고, 외부 업로드 URL 미리보기를 위해 필요한 옵션을 붙였다.
Expo 앱 쪽에는 ttf와 png asset 타입 선언을 추가했다. 폰트와 이미지 import가 런타임에서는 동작하더라도 타입스크립트가 모르면 빌드와 lint에서 계속 걸리기 때문이다.
또 Expo 쪽 eslint 설정을 mjs로 정리하고, 웹 루트의 lint가 모바일 앱 파일을 볼 때 불필요하게 막히지 않도록 예외 규칙을 조정했다.
모노레포를 운영하며 배운 점
웹과 모바일을 한 저장소에 둘 때는 코드 공유보다 설정 공유가 더 먼저 문제를 만든다. 각 앱이 어떤 빌드 도구와 타입 규칙을 쓰는지 명확히 나눠야 한다.
이후 apps/web과 apps/mobile로 구조를 재정리한 것도 이 경험과 연결된다. 기능이 늘어날수록 앱 경계와 설정 경계를 분명히 두는 편이 장기적으로 덜 헷갈린다.
Keep reading
다른 글 이어서 보기
Debugging
2026.05.05
6 min read
GitHub 푸시 후 Vercel 배포가 Blocked가 되었을 때
커밋은 올라갔지만 Vercel 자동 배포가 막혔던 상황에서, GitHub 작성자와 프로젝트 권한을 확인해 해결한 기록입니다.
Debugging
2026.05.04
7 min read
서브도메인은 연결됐는데 /admin이 404였던 이유
blog, ad, nacho 서브도메인을 나누는 과정에서 Vercel 404와 앱 내부 라우팅 문제를 구분해 해결한 기록입니다.
Debugging
2026.05.03
8 min read
도메인은 연결됐는데 접속이 거부될 때
tangly.kr과 www 도메인을 Vercel에 붙이며 DNS, 네임서버, SSL 발급 대기 상태를 구분해 해결한 기록입니다.