01_Error: Cannot find module 'recoil'
사건발단 정빈님의 작업물과 승원님이 작업물을 같은시간에 dev 로 merge. 승원님이 올리신 작업물엔 내가 작업한 recoil 라이브러리가 포함되어 있다. dev 서버에 성공적으로 merge 후 internet server error 가 발생하여 단순 백엔드에서 나는 오류라고 생각했지만, 인프라팀에서 에러를 추적하니 recoil 모듈에서 발생하는 에러였다.
에러코드
인프라팀에서 보내준 에러 코드는 다음과 같았다.
2|quv-site | 2023-12-05 11:20:49.324: Error: Cannot find module 'recoil' 2|quv-site | Require stack: 2|quv-site | - /home/qv/.next/server/pages/_app.js 2|quv-site | - /home/qv/node_modules/next/dist/server/require.js 2|quv-site | - /home/qv/node_modules/next/dist/server/next-server.js 2|quv-site | - /home/qv/node_modules/next/dist/server/next.js 2|quv-site | - /home/qv/server.js 2|quv-site | at Module._resolveFilename (node:internal/modules/cjs/loader:995:15) 2|quv-site | at /home/qv/node_modules/next/dist/server/require-hook.js:54:36 2|quv-site | at Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) 2|quv-site | at mod.require (/home/qv/node_modules/next/dist/server/require-hook.js:64:28) 2|quv-site | at require (node:internal/modules/cjs/helpers:103:18) 2|quv-site | at 29755 (/home/qv/.next/server/pages/_app.js:1:1654) 2|quv-site | at __webpack_require__ (/home/qv/.next/server/webpack-runtime.js:1:160) 2|quv-site | at /home/qv/.next/server/chunks/7648.js:1:35272 2|quv-site | at __webpack_require__.a (/home/qv/.next/server/webpack-runtime.js:1:1003) 2|quv-site | at 67648 (/home/qv/.next/server/chunks/7648.js:1:35169) { 2|quv-site | code: 'MODULE_NOT_FOUND', 2|quv-site | requireStack: [ 2|quv-site | '/home/qv/.next/server/pages/_app.js', 2|quv-site | '/home/qv/node_modules/next/dist/server/require.js', 2|quv-site | '/home/qv/node_modules/next/dist/server/next-server.js', 2|quv-site | '/home/qv/node_modules/next/dist/server/next.js', 2|quv-site | '/home/qv/server.js' 2|quv-site | ] 2|quv-site | }
첫번째 시도
git hub action cache 삭제해보기
처음에는 install 받기 전 코드를 push 한 정빈님 코드와 recoil 코드가 충돌하여 나는 에러라고 생각했다.
github action 에 있는 cache 관련 코드를 삭제하고 npm install 부분을 force 처리하여 배포시도했다.
하지만 여전히 에러가 발생했다.
//.github > workflow > build.yml - name: Cache node modules uses: actions/cache@v3 id: cache with: path: node_modules key: npm-packages-${{ hashFiles('**/package-lock.json') }} - name: Install dependencies if: steps.cache.outputs.cache-hit != 'true' run: npm install -f
두번째 시도
기존 node modules 와 package.lock.json 을 삭제 후 재 install 한 뒤 dev 에 push 했다.
하지만 결과는 동일했다.
인프라 대홍님과 디버깅을 해보았을때 서버에 recoil 이 없었고, 직접 인스톨하니 정상적으로 받아지며 마침내 dev 서버에도 정상적으로 나타나는것을 확인했다.
결국 클라이언트에서 받은 라이브러리를 git hub action 이 서버로 가져오지 못한다는 것이었는데, 이부분에 관련하여 git hub action 을 세팅한 승섭님께 여쭤보았다.
해결
결론적으로 build.yml 의 "*node_modules*" 코드때문이었다.
매 빌드마다 node_modules 를 실행하면 S3 에 올리는 용량이 커지고 그만큼 과금문제가 생길 수 있기 때문에 제외시킨다고 하셨다.
- name: Build run: npm run build - name: Create deployment archive run: | zip -r ${{ inputs.zip_name }} . -x "*.git*" -x "*.github*" -x "*node_modules*"
그렇다면 새로운 라이브러리를 받을때마다 서버에 직접 install 해달라고 해야할까
해당 코드는 리소스때문에 그대로 두되,
script > afterInstall.sh
파일을 재실행 해야한다.package.json 에 서버를 재실행하는 방향으로 적용하여 문제를 해결할 수 있었다.
#!/bin/bash cd /home/qv sudo npm run restart
package.json
"scripts": { "dev": "next dev -p 8080", "prebuild": "rimraf .next/*", //--omit=dev : devDependencies 를 제외한 나머지 재실행 "prerestart": "npm install --omit=dev", "build": "next build", "lint": "next lint", "start": "node server.js", "restart": "pm2 reload ecosystem.config.js", "commit": "git-cz" },