This page covers Elm 0.18

커맨드

Elm 에서 커맨드 (Cmd) 란, 외부에 사이드 이펙트를 포함하는 어떤 동작을 요청하는 것입니다. 예:

  • 랜덤한 수 생성
  • http 요청
  • 로컬 스토리지에 무언가를 저장

Cmd 는 하나일 수도 있고 여럿의 묶음일 때도 있습니다. 우리는 외부에서 발생시킬 일들을 커맨드로 묶어 런타임에 전달하고 런타임은 외부에서 이를 실행하여 결과를 우리 어플리케이션에 돌려줍니다.

사실 Elm 과 같은 함수형 언어에서는 모든 결과를 리턴으로만 전달하고, 몇몇 언어에서 볼 수 있는 함수 내부에서의 사이드 이펙트의 유발은 허용하지 않으며 커맨드는 이런 동작을 처리하기 위한 것입니다. Elm 아키텍쳐에서, Html.program 은 이런 커맨드의 최종 수신자라고 볼 수 있습니다.

커맨드를 사용하는 예제 앱을 만들어 봅시다:

module Main exposing (..)

import Html exposing (Html, div, button, text, program)
import Html.Events exposing (onClick)
import Random


-- MODEL


type alias Model =
    Int


init : ( Model, Cmd Msg )
init =
    ( 1, Cmd.none )



-- MESSAGES


type Msg
    = Roll
    | OnResult Int



-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ button [ onClick Roll ] [ text "Roll" ]
        , text (toString model)
        ]



-- UPDATE


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Roll ->
            ( model, Random.generate OnResult (Random.int 1 6) )

        OnResult res ->
            ( res, Cmd.none )



-- MAIN


main : Program Never Model Msg
main =
    program
        { init = init
        , view = view
        , update = update
        , subscriptions = (always Sub.none)
        }

실행하면 클릭할 때마다 랜덤한 수를 생성하는 버튼을 볼 수 있습니다.


중요한 부분을 살펴보겠습니다:

메시지

type Msg
    = Roll
    | OnResult Int

메시지는 두가지입니다. Roll 는 새로운 수를 요청합니다. OnResultRandom 라이브러리에서 생성한 수를 돌려받습니다.

Update

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        Roll ->
            ( model, Random.generate➊ OnResult (Random.int 1 6) )

        OnResult res ->
            ( res, Cmd.none )

Random.generate 는 랜덤한 수를 생성하도록 요청하는 커맨드를 만듭니다. 첫 인자는 메시지 생성자인데, 우리 어플리케이션에 돌아오도록 하기 위한 것입니다. 이 경우는 OnResult 입니다.

커맨드가 처리되고 나면 Elm 은 OnResult 에 생성된 수를 담아 메시지를 생성합니다. (예: OnResult 2) 이후 Html.program 이 메시지를 다시 어플리케이션으로 가져옵니다.


많은 컴포넌트가 중첩된 거대한 어플리케이션에서는 다양한 커맨드를 한 번에 Html.program 로 보낼 필요도 있습니다. 이 다이어그램을 참조하세요:

Flow

여기서는 세 레벨에 걸쳐 커맨드를 조합하고 있습니다. 최종적으로 모든 커맨드는 program 으로 전달됩니다.

results matching ""

    No results matching ""