앞서서 포스팅한 대로, 이번 학기에는 내가 배우고 학습하고 정리한 모든 내용을 포스팅하려 한다. 그래서 복습 겸, 퀴즈, Mid-term, Final exam 그리고 인터뷰 대비까지 한방에 해결해 보려는 욕심이 있기 때문이다. 과연 잘 될까? ㅋㅋㅋ
Term4에 들어서서 들은 첫 수업은 알버트 행님의 Concurrent Programming이다. 이 Concurrent Programming이라는 단어가 아직은 매우 생소하기 때문에 내 스타일대로 일단 정의부터 먼저 살펴보고 들어가본다.
Concurrent Programming(병렬 프로그래밍)은 여러 작업을 동시에 처리하는 프로그래밍 패러다임이다. 여기서 '동시에'는 물리적으로 동시에 처리되거나, 또는 논리적으로 동시에 처리되는 것을 의미할 수 있다. 본질적으로는 여러 프로세스나 스레드를 활용해서 작업을 나누고, 이를 효율적으로 조율하는 것이 중요하다.
Concurrent Programming과 다른 프로그래밍 패러다임과의 차이
- Functional Programming
- 함수형 프로그래밍은 상태를 변경하지 않고, 불변성(immutability)을 중시하는 프로그래밍 스타일이다. 함수형 언어에서는 상태 변경이 없기 때문에 병렬 처리가 상대적으로 쉽다. 그러나 함수형 프로그래밍 자체가 병렬 처리를 목적으로 하는 것은 아니다.
- Imperative Programming
- 명령형 프로그래밍은 상태 변경에 중점을 둔다. 이러한 상태 변경이 여러 스레드에서 동시에 발생할 경우 문제가 생길 수 있어, 병렬 프로그래밍에서는 이를 잘 관리해야 한다.
- Object-Oriented Programming
- 객체 지향 프로그래밍은 데이터와 그 데이터를 조작하는 메소드를 하나의 오브젝트 안에 묶는다. 병렬 프로그래밍과 객체 지향 프로그래밍은 서로 배타적이지 않고, 종종 함께 사용되기도 한다.
- Concurrent Programming
- 성능 향상, 빠른 응답 시간, 자원 최적화 등을 목적으로 사용되며, 웹 서버, 데이터베이스, 실시간 시스템 등 다양한 분야에서 활용된다.
이번 학기 이 과목의 전반부는 Elixir를 배우고, 나머지 후반부는 Go를 배우게 된다. 따라서 Elixir에 대해서 큰 그림을 그려야 하겠다. 우선, Elixir를 설치하기 위해서는 Erlang 패키지를 먼저 설치하라고 가이드가 나온다. 즉, Erlang과 Elixir는 뭔가 서로 관계가 있다는 얘기이다. 그래서 우선은 Erlang이 뭔지에 대해서 알아보고, 그 이후에 이 둘 사이의 관계를 먼저 살펴보는 것이 순서라 하겠다.
Erlang이란?
Erlang은 병렬처리, 분산시스템, 고가용성을 목표로 만들어진 functional programming language이자, concurrent programming language이다. Ericsson에서 처음 개발되었고, 주로 통신 시스템에서의 높은 동시성(concurrency)과 빠른 응답 시간, 그리고 신뢰성을 요구하는 어플리케이션 개발에 사용된다.
주요 특징
- Concurrency(병렬성)
- Erlang은 가벼운 프로세스를 생성하고 관리하는 기능을 제공한다. 이 프로세스는 OS 스레드보다 훨씬 가볍고, 상호간에 메시지를 주고받아서 동시성을 구현한다.
- Fault-Tolerance(고장 내성)
- 하나의 프로세스가 실패하더라도 다른 프로세스에 영향을 미치지 않는다. 이를 통해 높은 수준의 안정성을 보장한다.
- Hot Code Swapping(핫 코드 스와핑)
- 실행 중인 시스템을 중단하지 않고도 코드를 업데이트할 수 있다. 이는 통신 시스템과 같이 높은 가용성이 요구되는 시스템에서 매우 중요하다.
- Functional Programming(함수형 프로그래밍)
- Erlang은 함수형 프로그래밍 패러다임을 따르며, 이는 병렬 처리와 잘 맞아떨어진다. 상태가 없기 때문에, 여러 프로세스가 동시에 데이터를 변경하는 문제를 쉽게 피할 수 있다.
- Distributed Computing(분산 컴퓨팅)
- Erlang은 분산 컴퓨팅을 네이티브로 지원한다. 이는 여러 노드에서 동시에 실행되는 어플리케이션 개발을 쉽게 해준다.
Erlang과 Elixir의 관계
Erlang과 Elixir는 모두 병렬처리와 분산시스템에 강점을 가진 프로그래밍 언어이다. 두 언어의 관계를 쉽게 이해하기 위해 몇 가지 핵심 포인트를 뽑아보자.
- 공통 실행 환경
- Elixir는 Erlang의 BEAM(Bogdan's Erlang Abstract Machine)이라는 가상 머신 위에서 실행된다. 즉, Elixir는 Erlang의 기존 라이브러리나 프레임워크를 그대로 활용할 수 있다.
- 문법과 스타일 차이
- Elixir는 루비와 같은 현대적인 문법과 도구를 제공하는 반면, Erlang은 약간 구식인 문법을 가지고 있다. 이로 인해 Elixir는 특히 웹 개발이나 도메인 특화 언어(DSL) 작성 등에서 더 직관적으로 느껴질 수 있다.
- 상호 운용성
- 두 언어 사이에는 높은 수준의 상호 운용성이 있다. Elixir에서는 Erlang 함수를 쉽게 호출할 수 있고, 그 반대도 마찬가지다.
- 라이브러리와 프레임워크
- Elixir는 Phoenix라는 웹 프레임워크를 제공하는데, 이는 Erlang의 Cowboy HTTP 서버 위에 구축되어 있다. 이처럼 Elixir는 Erlang의 강점을 그대로 이어받으면서도, 추가적인 기능과 편의성을 제공한다.
- 커뮤니티와 생태계
- Erlang은 통신, 분산 시스템, 고성능 서버 등을 주로 개발하는데 사용되고, Elixir는 웹 개발과 데이터 처리 등 다양한 분야에서 사용되기 시작했다.
이제 대략 느낌이 온다. 그렇다면, 보다 강한 동기부여를 위해서 Elixir가 실제로 어느 곳에 활용이 되며, 이 Elixir를 가지고 만든 유명한 프로그램들이 뭐가 있는지 대략적으로 알아보자.
Elixir 활용처
Elixir는 Erlang VM에서 실행되는 함수형 프로그래밍 언어로, 분산 시스템, 동시성, 고가용성 등에 강점을 가지고 있다. 다양한 도메인과 산업에서 사용되며, 몇몇 유명한 프로젝트에서도 활용되고 있다.
Phoenix Framework: 웹 개발을 위한 Elixir의 주요 프레임워크로, Ruby on Rails와 비슷한 디자인을 가지고 있다. 하지만 동시성과 분산 처리에 더 강하다.
- Nerves Project
- 하드웨어 및 임베디드 시스템 개발을 위한 프레임워크로, Elixir로 작성된다. 이 프레임워크는 IoT 디바이스에서 널리 사용된다.
- 원래 Erlang을 사용해 개발되었지만, 일부 서비스에서는 Elixir도 사용한다. 이는 고가용성과 대규모 트래픽을 처리하는 데 Elixir가 얼마나 강력한지 보여준다.
- Discord
- 대규모 실시간 통신 플랫폼으로, Elixir를 활용해 고성능 백엔드 서비스를 구현한다.
- Financial industry
- 금융 분야에서도 실시간 데이터 처리, 고가용성이 필요하기 때문에 Elixir가 사용된다. 예를 들어, Brex라는 미국의 테크 회사가 있다.
- Telecom
- Erlang이 원래 텔레콤 분야에서 만들어진 것을 고려하면, Elixir도 이 분야에서 잘 적용된다. 통신 규모가 크고, 빠른 응답 시간이 필요한 시스템에서 사용된다.
- Logistics and Transport
- 로지스틱스와 운송 분야에서도 실시간 트래킹, 라우팅 같은 복잡한 연산을 처리할 필요가 있어 Elixir가 사용된다.
- Content Management Systems
- 대형 컨텐츠 관리 시스템에서도 Elixir는 고성능 백엔드로 사용될 수 있다. 예를 들어, Oban이라는 큐잉 라이브러리는 백그라운드 작업을 효율적으로 처리한다.
이런 예시들로 봤을 때, Elixir는 다양한 분야에서 그 성능과 신뢰성, 확장성 때문에 선택받고 있다고 한다.
여기까지 일단 입문용 백그라운드 지식 차원에서 한번 조사한 내용이며, 이 Elixir를 공부하면서 동기부여가 떨어질 때쯤 한번씩 다시 읽어볼 용도로도 좋은것 같다.
댓글 없음:
댓글 쓰기