ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Project, Application
    Elixir 프로그래밍 2019. 7. 31. 00:36

    이번 글에서는 Project 생성과 컴파일 및 실행하는 방법과  Elixir Application에 대한 내용을 적겠습니다. 

     

    iex를 실행한 후,  Application.loaded_applications 를 실행해보면 다음과 같은 내용이 나옵니다.

    이는 현재 수행중인 Elixir Application 들의 목록을 보여주는 것입니다. 

     

    Elixir는 Erlang VM(Virtual Machine)에서 수행됩니다. 그리고, 하나의 Erlang VM에는 복수개의 Application이 실행됩니다. 

    Erlang VM은 하나의 OS(Operation System)이며,  하나의 OS상에 동시에 여러 개의 Application이 실행되는 것처럼 하나의 Erlang VM에는 여러 개의 Application이 실행됩니다. 

     

    Elang VM에서는 하나의 Appliation이 다른 Application의 함수를 호출할 수 있습니다. 

    • 하나의 Erlang VM에는 복수개의 Application이 실행된다. 
    • 하나의 Application은 복수개 Module의 모임이다. (Module 이외에 Application 정보도 가집니다. 위의 그림에서 보이는 버젼,설명등이 Appliation 정보입니다.)
    • 하나의  Module은 복수개 Function의 모음입니다. 

    즉, Application은 Module 들의 묶음으로 생각할 수 있습니다. 

    위의 그림에서는 현재 메모리에 탑재된 Application들의 목록을 보여줍니다. 

     

    우리가 새로운 Elixir 프로젝트를 만들면, 그것은 하나의 새로은 Elixir Application이 됩니다. 새로 만든 우리 Elixir Application은 다른 Application들과 함께 Erlang VM에서 실행됩니다. 

     

    그리고, 나중에 프로세스 설명에서 적겠지만, 하나의 어플리케이션은 동시에 실행되는 복수개의 프로세스를 생성할 수 있습니다. 이는 마치 하나의 웹브라우저에서 복수개의 창을 여는 것과 비교할 수 있을 겁니다. 프로세스에 대해서는 다른 글에 다시 적겠습니다. 

     

    Project 생성하기 

     

    우리의 Project (Application)은 mix 라는 Elixir 명령어로 만듭니다. 

     

    Shell에서 "mix new my_app" 을 실행하면, mix를 실행한 현재 폴더에 my_app이라는 이름의 새로운 프로젝트를 만듭니다. 

    생성된 폴더의 구조는 다음과 같습니다. 

     

    my_app 폴더아래의 mix.exs 가 프로젝트 관리 파일입니다.  Makefile과 같은 역할을 한다고 보면 됩니다.

    config/config.exs은 우리 Application이 참조할 설정 내용을 저장하는 파일입니다. 

     

    우리가 작성한 소스파일는 lib 폴더 아래에 위치시키면 됩니다.  

    당연히 lib 폴더아래에 서브 폴더를 만들어 소스 파일을 위치시킬 수 있습니다. 

     

    mix.exs 는 사실 Elixir 소스 파일입니다. defmodule 과 def를 이용하여 module과 function을 정의한 Elixir 소스 파일입니다.

    Elixir는 프로젝트 관리 자체를 Elixir 소소코드로 합니다. 

    project 함수는 우리 Application의 구성 정보를 Keyword List (두 개의 항목을 가지며, 첫 번째 항목이 애텀인 튜플의 리스트 - https://elixirschool.com/ko/lessons/basics/collections/#%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8  ) 로 지정하게 됩니다. 

     

    여기서 지정된 정보가, 위의 iex에서 "Application.loaded_applications " 했을때 나타나는 내용입니다. 

     

    application 함수는 우리 애플리케이션이 실행될 때, 같이 실행되어야 하는 application을 지정합니다.

     

    Dependency 찾기 및 추가 하기 

    mix.exs 의 deps 함수에는  우리 application의 개발에 필요한 dependency application들을 적습니다. (library 라 생각해도 됩니다.)

    Elixir는 수많은 library들을 제공하고 있으며, 우리가 필요한 library application들은 

     

    https://hex.pm/  에서 검새하면 됩니다. 

     

    시험적으로 http client library를 검색하여, 추가하면 다음과 같습니다. 

    httpoison이라는 http client libaray를 사용할 것입니다.

    우측의  

    에서 , ,  

    버튼을 누르면,  mix.exs에 붙여 넣을 수 있도록 libray 정보가 복사됩니다. 이를 mix.exs에 적용하면 다음과 같습니다. 

     

    Dependency 가져오기 

    Elixir에서 dependency는 로컬 폴더 또는 인터넷에서 자동으로 받을 수 있습니다. 

     

    프로젝트 폴더에서 "mix deps.get"을 실행하면.

    와 같이 우리가 지정한 dependency와 필요한 dependency들을 가져옵니다.   

    가져온 dependency는 다음의 그림과 같이 deps 폴더에 저장됩니다. 

    Project 실행하기  

    project를 실행하기 위해서는 우선 compile을 해야 합니다. "mix compile"은 프로젝트를 compile 합니다.

    위의 그림에서는 dependency를 가져온 후 처음 compile 하여서 , dependency 들도 모두 compile 하였습니다.

    compile은 수정된 파일만 알아서 합니다. dependency 들도 한번 compile 한 이후 내용이 변경되지 않으면 다시 compile 하지 않습니다. 

     

    프로젝트의 실행은  "iex -S mix"로 하면 됩니다. 

    "iex -S mix" 를 한 후, 다시 Application.loaded_applications 해보면, 아까보다 훨씬 많은 애플리케이션들이 탑재된 것을 확인하실 수 있습니다. 

     

    그중에는 우리가 만든 my_app 도 보입니다.   이렇게 많은 애플리케이션이 탑재된 것은 위에 가져온 dependency들이 모두 application이 기 때문입니다.   위의 내용을 보시면,  ssl, asn1 , mime 등 http를 사용하기 위해 필요한 모든 application들이 탑재된 것을 알 수 있습니다. 

     

    현재 우리 Application 은

    로, MyApp이라는 모듈에 hello라는 함수만 존재합니다. 

     

    이를 실행해보겠습니다. 

    예상 대로, :world라는 애텀이 출력되어, 우리 애플리케이션이 실행된 것을 확인할 수 있습니다. 

     

    사실 "iex -S mix"는 우리 프로젝트를 iex 상에 interactive mode로 실행시키라는 명령입니다.  

    iex 가 실행되어 있으니, 우리 Application 말고 메모리에 있는 모든 Application의 함수들을 실행시키는 것이 가능합니다. 

     

    라고 입력해보시죠... 

     

    방금 가져온 web client인 HTTPoison의 get 함수를 이용하여 웹에서 콘텐츠를 가져온 것입니다. 

     

    HTTPPoison.get 은 {:ok , %HTTPioson.Response{}}    ( %HTTPioson.Response{} 는 그냥 맵이라고 생각하시면 됩니다.)

    으로 가져온 콘텐츠 정보를 반환합니다. 

     

    위에 my_app.ex를 수정해서, HTTP의 status code와 header 정보들 만을 정보만을 출력하도록 해보겠습니다. 

    이는 앞장에 설명한 패턴 매칭을 사용합니다. 

     

    코드를 위와 같이 수정한 후, 

     

    iex에서  recompile을 입력하면, 프로젝트를 다시 컴파일합니다.  이때, 당연히 수정된 파일만 컴파일됩니다.  

    이후 다시. 실행을 시켜보면,, 

    와 같이 변경된 내용의 결과를 볼 수 있습니다. 

     

    위와 같이, "iex -S mix"로 실행을 하면, 바로 재 컴파일과 실행을 시킬 수 있고, Erlang VM에 탑재된 Application 들의 코드도 실행해 볼 수 있으므로 개발 편의성이 매우 높아지게 됩니다. 

     

    사실 프로젝트를 실행하는 방법은 "iex -S mix" 이외 "mix run"으로도 할 수 있습니다. 

    "mix run"은 iex 없이 애플리케이션만 실행하고자 할 때 사용합니다. 

     

    지금은 mix run을 하게 되면, 우리 애플리케이션의 시작점이 지정되어 있지 않아서 바로 빠져나오게 됩니다. 

    이에 대한 것은 application 시작점 지정 방법에서 설명하도록 하겠습니다. 

     

     

    Elixir 용 Editor 

    저는 Elixir 개발할 때 , 툴을 VSCode 를 사용합니다. 

    무료이며, 위의 그림처럼, 명령어창(메뉴 Termincal/New Terminal) 도 지원해서,  명령어창에는 iex 를 실행시켜 놓고, 코딩을 합니다.

    그리고, VSCode는 git 도 내장되어 있으며, 

    와 같이. Elixir 관련 Plug-in 도 지원해서, 여러모로 사용하기 편리 합니다. 

Designed by Tistory.