리액트를 빌드하던 중 위와 같이 멈추고 더 이상 진행되지 않는 경우가 있다.
메모리가 부족하게 되면 위 현상이 나타나게 된다.
특히 AWS 프리티어를 쓰는 경우 t2.micro 사양을 사용하게 되는데 램이 1기가밖에 되지 않는다.
조금만 빌드 규모가 커져도 위와 같은 증상을 발견하게 된다.
해결 방법은 여러가지가 있다.
1. 빌드시 GENERATE_SOURCEMAP 옵션을 꺼준다.
위와 같이 package.json 파일을 열면 build 부분에 GENERATE_SOURCEMAP를 false로 설정해준다.
어짜피 프로덕션시에는 결국 이 옵션은 꺼주는게 맞기는 하다.
노출되지 않아야 하는 코드들을 보호해주는 역할도 해주기 때문이다.
그리고 해당 속성이 켜져있을 경우 디버깅 정보가 포함되어 빌드되기 때문에 빌드 용량이 커지게 되며,
이는 곧 메모리 부족으로 이어지므로 꺼주게 되면 어느정도 메모리 부족 현상도 해결해주게 된다.
2. 메모리 스왑을 통한 메모리 부족 현상 처리
위의 GENERATE_SOURCEMAP 옵션을 끄더라도 결국 빌드 규모가 커질 경우 메모리를 많이 차지할 수 밖에 없다.
즉, 1번 방법으로도 해결되지 않을 경우 이 메모리 스왑 방법을 써볼 수 있다.
메모리 스왑은 간단히 설명하면 메모리의 부족한 부분을 디스크의 일부를 사용하여 대신 사용할 수 있는 기능이다.
메모리에 비해 디스크가 속도가 훨씬 느리기 때문에 스왑 사용시 속도가 느려진다는 단점은 있다.
AWS에서 프리티어는 써야하고 메모리 부족 현상은 해결해야 할 때 써볼만 할 것이다.
위 스크린샷은 SSH를 통해 AWS의 메모리 현황을 표시해본 것이다.
보면 기본적으로 AWS 인스턴스는 스왑 메모리가 지정되어있지 않아서 0으로 표시된다.
(1) sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
(2) sudo mkswap /mnt/swapfile
(3) sudo swapon /mnt/swapfile
위 세 명령어를 입력하여 스왑 메모리를 생성해준다.
위와 같이 메모리를 확인해보면 스왑 메모리가 2기가가 잡혀있는 것을 확인할 수 있다.
그리고 다시 빌드하면 메모리 부족 현상으로 인한 빌드 멈춤 문제는 해결될 것이다.
하지만 이처럼 가상 메모리를 쓰게 되면 퍼포먼스의 문제가 발생하므로 임시 방편으로 쓰고 사양을 올릴 것을 추천한다.
※ 스왑메모리 해제 방법
sudo swapoff -v /mnt/swapfile
sudo rm /mnt/swapfile
위 두 명령어로 스왑메모리를 해제할 수 있다.
이상 리액트 빌드시 멈춤 현상을 해결하는 방법에 대해 설명하였다.
이 외에도 다른 방법들도 있기는 하다. 빌드 규모를 줄이기 위한 코드 스플리팅이나,
위 메모리 스왑 이전에 캐시 메모리가 많이 존재한다면 캐시 메모리를 초기화해주는 방법 등이 있다.
필자 또한 임시적으로 문제를 해결해야 했기 때문에 위에 언급한 2가지 문제로 충분히 해결이 가능했다.