# Erlang 핫 코드 업데이트의 활용 방법

> Clean Markdown view of GeekNews topic #17876. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17876](https://news.hada.io/topic?id=17876)
- GeekNews Markdown: [https://news.hada.io/topic/17876.md](https://news.hada.io/topic/17876.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-11-21T10:08:36+09:00
- Updated: 2024-11-21T10:08:36+09:00
- Original source: [underjord.io](https://underjord.io/how-i-use-erlang-hot-code-updates.html)
- Points: 12
- Comments: 3

## Summary

Erlang의 핫 코드 업데이트는 다른 런타임에서는 거의 불가능한 독특한 기능으로, Elixir에서도 이를 지원하지만 표준적인 Elixir 릴리스에서는 기본적으로 지원하지 않습니다. 핫 코드 업데이트는 간단한 코드 리로드와 더 복잡한 응용으로 나뉘며, Nerves 프로젝트에서는 이를 통해 펌웨어 업로드 없이 디바이스의 모듈을 수정하거나 상태를 초기화하는 등의 작업을 수행합니다. 핫 코드 업데이트를 구현할 때는 데이터베이스 마이그레이션처럼 세심한 주의가 필요하며, 종속성들이 어떻게 반응하는지 이해하는 것이 중요합니다.

## Topic Body

- Erlang 생태계의 강력한 기능 중 하나는 핫 코드 업데이트임  
- 이 기능은 거의 다른 런타임에서는 불가능하며 매우 독특함  
- Elixir는 Erlang 위에서 빌드되었으며 동일한 기능을 지원함  
  
#### Elixir에서 핫 코드 업데이트 적용  
  
- 표준적인 Elixir 릴리스(`mix release`) 방식은 Erlang 핫 코드 업데이트를 기본적으로 지원하지 않음  
- 핫 코드 업데이트를 구현하려면 여러 블로그 포스트를 참고하거나 Erlang 공식 문서를 세부적으로 연구해야 함  
- 관련 자료:  
  - **Learn You Some Erlang**: [Relups 문서](https://learnyousomeerlang.com/relups)  
  - **AppSignal**: [Elixir 핫 코드 리로딩 가이드](https://blog.appsignal.com/2021/07/27/a-guide-to-hot-code-reloading-in-elixir.html)  
  
#### 핫 코드 업데이트의 실제 활용 사례  
  
- 핫 코드 업데이트는 실무에서 크게 두 가지로 나뉨:  
  1. 간단한 코드 리로드  
     - 예: 개발 중 `IEx`에서 `r MyModule` 또는 `recompile` 명령을 실행하는 것  
     - 이는 간단하고 유용하지만, 새로운 컴파일러나 빌더의 일부처럼 느껴짐  
  2. 더 복잡한 응용  
     - **Nerves** 프로젝트에서 핫 코드 업데이트를 자주 활용:  
       - 내장 Elixir 디바이스에서 숫자를 튜닝하거나 모듈을 수정할 때, 펌웨어 업로드 및 재부팅을 기다리는 대신 `IEx`로 업데이트  
       - 애플리케이션의 특정 부분을 시작/중지하거나, `GenServer`를 종료하여 상태를 초기화  
     - **NervesHub**를 통해 원격 디바이스에 핫 코드 업데이트 적용:  
       - 예: 실시간 클럭 디버깅 시 I2C 호출을 직접 실행하며 문제를 빠르게 파악  
  
#### 핫 코드 업데이트의 도구 및 주의사항  
  
- Elixir의 `mix release`나 기존 `distillery` 도구 위에 핫 코드 업데이트를 지원하는 툴링이 늘어나길 희망  
- 핫 코드 업데이트는 데이터베이스 마이그레이션처럼 세심한 주의가 필요:  
  - 종속성들이 핫 코드 업데이트에 어떻게 반응하는지 이해해야 함  
  - 기타 고려해야 할 다양한 주제 존재

## Comments



### Comment 31571

- Author: bus710
- Created: 2024-11-22T02:26:19+09:00
- Points: 1

이 내용은 국내 유일 엘릭서 번역서인 처음 배우는 엘릭서 프로그래밍에 자세히 실려 있기도 합니다.

### Comment 31558

- Author: papillon
- Created: 2024-11-21T12:32:55+09:00
- Points: 1

멋지고 강력한 기능이긴 합니다만,   
실시간 디버깅 및 확인 용으로만 사용하는게 좋을거 같습니다

### Comment 31552

- Author: neo
- Created: 2024-11-21T10:08:36+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42187761) 
- Discord에서 BEAM 핫 코드 로딩을 사용하여 긴 배포 주기를 단축하고 긴급 업데이트에 활용했음
  - 여러 모듈을 동시에 패치할 수 있는 도구를 개발하여 클러스터에 업데이트를 전파했음
  - Erlang의 내장 분배 기능을 통해 핫 패치를 배포했음

- Nerves 장치에서 코드 리로딩이 유용하며, 실시간으로 수정 사항을 테스트할 수 있어 통합 테스트에 좋음
  - 원격에서 새로운 펌웨어를 테스트하고 업데이트하여 고객을 만족시켰음
  - 파일을 `/tmp`에 복사한 후 `Code.compile`을 사용하는 것이 더 나은 오류 메시지를 제공함
  - 모든 코드를 컴파일하고 삭제하는 헬퍼 함수를 작성하는 것이 간단함

- Elixir 프로젝트에서 핫 코드 업데이트를 사용할 수 없었지만, 고객에게 도움이 되었을 것이라고 생각함
  - 복잡한 변경 사항에는 핫 코드 업데이트가 문제를 더 일으킬 수 있음
  - 간단한 변경 사항에는 최소한의 영향을 주는 것이 좋음

- kosmi.io에서 핫 코드 업그레이드를 성공적으로 사용하고 있음
  - 빠른 개발과 수정, 업데이트 배포가 가능함
  - Distillery와 커스텀 스크립트를 사용하지만 표준화되었으면 좋겠음

- Nerves와 핫 코드 리로딩을 통해 Erlang에 관심을 가지게 되었음
  - 생산 환경에서 실용적이지는 않지만, 신뢰할 수 있는 시스템 구축에 유용한 도구임

- 릴업 준비 시 매우 주의해야 하며, Linux에서는 새로운 서버를 실행하고 세션 데이터를 전송하는 방법도 있음
  - 핫 패칭은 동일한 VM을 계속 실행하기 때문에 만족스럽지 않을 수 있음

- Elixir를 임베디드 Linux에 배포하며, Nerves가 systemd를 대체하고 BEAM VM을 프로세스 1로 부팅함
  - Elixir를 하드웨어에 가깝게 배치함

- WhatsApp은 과거에 SSH 스크립트를 사용하여 모든 노드에서 핫 리로딩을 수행했음

- 핫 코드 업데이트는 유용하지만 쉽게 실수를 유발할 수 있으며 지원이 부족함
  - 핫 코드 업데이트의 이점은 신중한 롤링 재시작을 통해 얻을 수 있음
  - Erlang의 코드 리로딩 기능을 활용하여 실시간 문제 진단 도구를 만들 수 있음

- 핫 코드 업데이트는 많은 클라이언트가 연결된 상황에서 코드 변경을 수행할 때 유리함
  - GNU Make를 사용하여 코드를 프로덕션에 동기화하고 디버그 셸을 통해 모듈을 로드했음
