---
layout: post
title: "자잘한 도움말 #5 NPM install 속도가 너무 느려요!"
subtitle: WSL에서만 특히 NPM 속도가 느릴 때
description: WSL, NPM, WSL NPM install 속도, resolv.conf, deno, node
date: 2022-05-05 11:40:00 +0900
categories: [Micro]
---

## TL;DR

- [https://www.reddit.com/r/bashonubuntuonwindows/comments/nt8asc/npm_install_extremely_slow_on_wsl2/hk7zpbw/](https://www.reddit.com/r/bashonubuntuonwindows/comments/nt8asc/npm_install_extremely_slow_on_wsl2/hk7zpbw/)
- WSL에서 다음 명령어를 실행한 다음 WSL을 재부팅하자.

```shell
sudo rm /etc/resolv.conf
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
sudo chattr +i /etc/resolv.conf
```

진짜 이게 끝이다. 밑에 있는 글은 읽을 필요 없다. 그냥 검색 잘 되게 키워드 남발해놓은 활자 덩어리 같은거다.

## 이하 그리 중요하진 않은 내용들

20대 초반에는 내가 대체 어떤 개발자가 될지 감이 안잡힌 채로 살고 있었다. 근데 이제와서 정신 차려보니 나는 Express를 많이 썼고, VueJS도 썼고, 지금은 React-Native에 전력을 다하고 있는 것을 보니 일단은 Javascript를 주력으로 사용하는 개발자인 것 같다. 보면 다 Node 환경에서 개발한다. 따라서 자연스럽게 친해진 친구가 생겼으니, Node Pacakage Manager. 바로 그 **NPM**{: .middle-big}이다.

![Heaviest object](https://i.postimg.cc/MKxyzWCZ/np.png)  
사실 이거랑 관련있는 글은 아닙니다.
{: .center}

솔직히 말해서 NPM은 편한데, 불편하다. `package.json`과 `package-lock.json`의 차이는 항상 헷갈리고, 어느 순간 의존성이 꼬였는지 "`--force` 옵션이나 `--legacy-peer-deps` 옵션을 안붙이면 당신의 설치 명령에 따르지 않겠다"고 으름장을 놓기 일쑤다. 게다가, 물론 이건 Node 자체의 문제인데, `node_modules` 폴더의 끔찍함. 일전에 VSCode의 ssh 기능으로 클라우드 인스턴스에 위치한 작업공간에 접속한 적이 있었는데, 클릭 미스로 `node_modules` 폴더를 선택한 순간 연결이 뻗고 인스턴스는 혼수상태에 빠져버리더라.

[![디노](https://i.postimg.cc/T3jbSB7L/deno.jpg)  
잠시 광고](https://deno.land/)
{: .center}

쓰다보니 감정몰입이 되가지고, 좋은 말씀 하나 전해야겠다. [Deno](https://deno.land/)는 Node의 최초 개발자가 Node가 가진 몇 가지 태생적 한계를 개선하기 위해 새로 진행하고 있는 프로젝트이다. 와 라이언 달 선배님 NoDe를 DeNo로 완전히 뒤집어 놓으셨다. 아무튼 이거 쓰면 `node_modules` 안봐도 됨! 좋아보이는데 아직 발전중인 단계라서 정보 찾기가 어렵더라. 다들 장난감 용도라도 써가며 필요하면 스택 오버플로우에 질문글도 좀 올려보고 그래보자.

이 정도로 내 개발 환경을 개벽할 정도는 아니더라도, NPM이 가진 단점을 해결하기 위한 시도 또한 존재한다. 알만한 사람들은 다 알 [Yarn](https://yarnpkg.com/), 이건 심지어 이미 많이들 쓰고 있다. NPM보다 좀 더 빠르고, 보안 문제에 있어서도 장점이 있다고 하더라. 근데 또 NPM이 자리를 너무 잘 잡아놓은 상황이고, NPM 자체도 계속 개선되면서 막 엄청난 차이가 있다는 것 같진 않다. 비교글을 검색해보면 대부분 그 결말이 "취향껏 고릅시다"라서...

아무튼 정리하자면, 여전히 NPM을 쓰는 사람은 많을 것이고, 앞으로도 계속 생길 것이고, 나도 아마 지금 당장은 딱히 이 친구와 멀어질 것 같진 않다.

### 근데 왜이렇게 느린거야

![참으려고 해도](https://i.postimg.cc/xCqSJJcv/image.jpg)
{: .center}

NPM에 대한 변호는 여기까지. 작년부터 내가 겪고 있던 문제였다. 특정 상황에서 NPM install이 너무 느려! 이게 느린건지 안되는건지 확실하진 않는데, 일단 거의 무한 로딩에 가까웠다. 또 요상한게 설치를 취소했다가 다시 시작하면 간헐적으로 설치가 되긴 되더라. 근데 그건 사실상 운의 영역이었다. NPM에서 뱉어주는 에러 로그도 영 시원찮았다. NPM 입장에서는 아주 느리게 설치가 진행되는 것 처럼 보였다. 지금이야 해결 했으니 그때 당시의 악감정을 억지로 끄집어내서 글을 써가는 느낌이지만, 진짜 답답해 미치는줄 알았다.

관련 정보를 꽤 오래 찾았는데, 애초에 정보를 찾으려는 방향성이 틀렸던 것 같다. 당시 느꼈던 그 특정 상황을 정리해보자면 다음과 같았다.

- 와이파이 사용
- 랜선 연결하면 잘 되더라
- 카페 와이파이는 될 때도 있고 안 될 때도 있었다
- 집 와이파이는 잘 되더라
- 휴대폰 핫스팟으로 연결해도 잘 되더라

그래서 [이런 내용의 글](https://stackoverflow.com/questions/29395211/npm-install-extremely-slow-on-windows)을 계속 찾아봤다. 뭐 npm 설정 중에서 registry를 바꾸라고 하고, 윈도우 방화벽 설정을 바꾸라고 하고, 캐시를 지우라 하고... 별 수확은 없었고. 그러다가 시간이 지나면서 자연스럽게 이 문제는 잊혀졌다. 사실 그 순간 순간은 정말 답답하긴 했는데, 그냥 설치할 때만 핫스팟 잠깐 키면 되는 거였으니까. 잠시 랜선을 빌려 사용하거나. 그리고 결국 그 환경 자체도 변하는 바람에.

그렇게 그냥 특정 네트워크마다 내부적으로 해놓은 어떤 설정 때문에 그런 거구나라고 생각만 해놓은 상황이었다. 근데 올해 3월, 내가 개인 프로젝트 개발 공간으로써 새로 스터디 카페를 등록하면서 이 문제를 다시 마주치게 되었다. 여기도 와이파이가 아주 빵빵한데, 유독 NPM만 느렸다. 다행히 자리마다 랜선 포트가 있더라. 그렇게 며칠을 랜선 포트를 보며 아 내일은 랜선 가져와야지 생각만 하다가 집에 가면 까먹기를 반복(생각보다 NPM install을 자주 하는 상황이 아니었다.), 마침내 랜선을 연결하고 설치를 시도하였으나! 여전히 문제가 계속 발생하더라. 이때부터 다시 그 답답함이 몰려오기 시작했다.

![나는 바보다](https://i.postimg.cc/SNVDB4gv/image.png)
{: .center}

그리고 뭔가 하나 내가 빼먹은게 있다는 생각이 들었다. 어... 이거 WSL이잖아? WSL 또 너야?

### WSL은 VM이다.

![성](https://i.postimg.cc/kXwD85W1/image.jpg)  
WSL은 격리된 환경이다.
{: .center}

물론 이걸 VM이라고 하면 고개를 갸우뚱 할 사람들이 있을 것이다. 엄밀히 따지자면 VMware, VirtualBox 따위의 도구들과는 분명히 다른 특징이 있다. 하고싶은 이야기는, VM 으로써 다루자는 말이다. 내가 겪은 문제의 원인에 대해 [이 글](https://robin2.tistory.com/351)에서 아주 깔끔하게 설명해 주셨다.

> 간혹 랜카드 추가나 네트워크 환경 변화로 인해 WSL2의 DNS가 먹통이 되는 경우가 생깁니다.  
> 이를 해결하기 위해 외부에서 DNS를 불러오지 않고 WSL2에 DNS서버를 설정해서 내부적으로 처리하도록 합니다.

사실 글을 점점 진행하면서 이걸 어떻게 마무리해야하지 고민이 스멀스멀 피어오르고 있었는데, 이 두 문장이 그 답이다. 네트워크 환경 변화로 인해 DNS가 고장난 것이었고, 따라서 NPM install에 문제가 생긴 것이었다. 아마 비슷한 사유로 `apt-get` 또한 제대로 동작하지 않는 사람도 있을 것이다. 나도 그랬던 것 같은데, 정확히 기억이 안난다.

### 해결책📖

방법 자체는 [이 레딧 글](https://www.reddit.com/r/bashonubuntuonwindows/comments/nt8asc/npm_install_extremely_slow_on_wsl2/hk7zpbw/)에서부터 먼저 접하였다. 사담이지만 이때까지 스택오버플로우가 구글링의 전부였던 나에게 레딧도 있다는 사실을 일깨워준 귀한 글이다. 아무튼 Works like a charm. 약발 아주 잘 든다.

```shell
sudo rm /etc/resolv.conf
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
sudo chattr +i /etc/resolv.conf
```

이왕 이렇게 글도 쓰는거 그냥 나열하지 말고 하나하나 분석해보자.

1) `/etc/resolv.conf` 파일을 삭제한다.

```shell
sudo rm /etc/resolv.conf
```

`resolv.conf` 파일은 무엇인가? [위키피디아에도 등록된](https://en.wikipedia.org/wiki/Resolv.conf) 이 파일은, OS에서 시스템의 DNS resolver를 설정하기 위해 사용하는 파일이다. Resolve의 의미가 많은데, 여기서는 해석, 분석 등을 뜻하고 있다고 생각하면 될 것 같다. [Resolver(해석기)는 DNS 서버에 대한 엑세스를 수행하는 어플리케이션이다.](http://www.ktword.co.kr/test/view/view.php?m_temp1=1487) 즉, 그런 어플리케이션에 대한 설정 정보를 우리가 직접 수정하기 위해 기존 파일을 삭제하는 것이다.

2) `/etc/resolv.conf` 파일에 DNS 서버의 주소를 입력한다.

```shell
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf
```

[`8.8.8.8`](https://ko.wikipedia.org/wiki/%EA%B5%AC%EA%B8%80_%ED%8D%BC%EB%B8%94%EB%A6%AD_DNS)은 왠만하면 다들 알텐데, 구글에서 운영하는 퍼블릭 DNS 서버다. 아무튼 DNS 서버가 우리가 원하는 서버로 고정되도록 설정 파일을 작성한다.

3) `/etc/wsl.conf` 파일에 내용을 추가한다.

```shell
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
```

`wsl.conf` [파일은 무엇인가?](https://docs.microsoft.com/ko-kr/windows/wsl/wsl-config) 이름에서 유추 가능하듯이 WSL에 대한 설정을 위한 파일이다. `wsl.conf` 파일에서 `[network]` 레이블 안의 `generateResolvConf` 옵션을 `false`로 설정했다. 사람이 쓰는 말로 바꾸자면, WSL이 Resolver 설정 파일을 생성하지 않도록 설정을 바꿨다.

4) `/etc/resolv.conf` 파일 속성을 변경한다.

```shell
sudo chattr +i /etc/resolv.conf
```

`/etc/resolv.conf` 파일에 `immutable` 속성을 추가한다. 이로써 `/etc/resolv.conf` 파일은 `sudo` 명령어로도 삭제/변경할 수 없다.

## 내가 배운 것

문제 자체는 정말 오랫동안 안고 살았는데, 생각보다 해결책은 맥빠진다. 아마 내가 적극적으로 검색을 할 만큼 불편하지는 않았나보다. 근데 해결 되니까 앓던 이가 빠진 것 처럼 시원하긴 하더라.

- 네트워크 환경의 변화에 따라 WSL 내부의 DNS 설정이 오작동 할 수 있다.
- NPM에 화를 내긴 했지만 사실 NPM 문제는 아니었다. 쏘리 마이 프렌드.
