This page covers Elm 0.18

플레이어 커맨드

이제 서버에 요청할 커맨드를 작성해야 합니다. src/Players/Commands.elm 를 만듭니다:

module Players.Commands exposing (..)

import Http
import Json.Decode as Decode exposing (field)
import Players.Models exposing (PlayerId, Player)
import Players.Messages exposing (..)


fetchAll : Cmd Msg
fetchAll =
    Http.get fetchAllUrl collectionDecoder
        |> Http.send OnFetchAll


fetchAllUrl : String
fetchAllUrl =
    "http://localhost:4000/players"


collectionDecoder : Decode.Decoder (List Player)
collectionDecoder =
    Decode.list memberDecoder


memberDecoder : Decode.Decoder Player
memberDecoder =
    Decode.map3 Player
        (field "id" Decode.string)
        (field "name" Decode.string)
        (field "level" Decode.int)

코드를 살펴봅시다.

fetchAll : Cmd Msg
fetchAll =
    Http.get fetchAllUrl collectionDecoder
        |> Http.send OnFetchAll

어플리케이션에 사용할 커맨드입니다.

  • Http.get리퀘스트 를 만듭니다.
  • 이 리퀘스트를 Http.send 에 전달하여 커맨드로 만듭니다.
collectionDecoder : Decode.Decoder (List Player)
collectionDecoder =
    Decode.list memberDecoder

이 디코더는 리스트의 각 멤버를 memberDecoder 로 처리합니다.

memberDecoder : Decode.Decoder Player
memberDecoder =
    Decode.map3 Player
        (field "id" Decode.string)
        (field "name" Decode.string)
        (field "level" Decode.int)

memberDecoderPlayer 를 리턴하는 JSON 디코더입니다.


디코더 개념을 이해하기 위해 Elm repl 을 사용하겠습니다.

터미널에 elm repl 을 실행합니다. Json.Decoder 모듈을 임포트합니다:

> import Json.Decode exposing (..)

Json 문자열을 하나 선언합니다:

> json = "{\"id\":99, \"name\":\"Sam\"}"

id 를 추출할 디코더를 하나 만듭니다:

> idDecoder = (field "id" int)

Json 문자열을 파싱해서 id 를 정수형으로 가져오는 디코더입니다.

디코더를 사용해 봅시다:

> result = decodeString idDecoder  json
Ok 99 : Result.Result String Int

Ok 99 는 디코딩에 성공했고 얻은 값은 99 라는 의미입니다. (field "id" Decode.int) 는 단일 키를 파싱하는 디코더를 만든 겁니다.

한 단계는 넘었습니다. 이제 타입을 하나 선언해 봅니다:

> type alias Player = { id: Int, name: String }

Elm 에서 레코드 타입은 함수처럼 사용 가능합니다. Player 1 "Sam" 와 같은 식으로 플레이어 레코드를 만들 수 있습니다. 인자의 순서는 속성의 순서를 따라갑니다.

직접 해 봅시다:

> Player 1 "Sam"
{ id = 1, name = "Sam" } : Repl.Player

이제 두가지 원리를 알았으니 완전한 디코더를 만들 수 있습니다:

> nameDecoder = (field "name" string)
> playerDecoder = map2 Player idDecoder nameDecoder

map2 는 함수를 첫째 인자로 받고 (이 경우는 Player) 이후 디코더 둘을 인자로 받습니다. 내부적으로는 각 디코더를 실행하고 결과를 함수 (Player) 의 인자로 전달합니다.

써 봅시다:

> result = decodeString playerDecoder json
Ok { id = 99, name = "Sam" } : Result.Result String Repl.Player

커맨드가 program 에 전달되기 전까지는 실제 실행되는 것은 없다는 걸 기억하세요.

results matching ""

    No results matching ""