[Elm] ์ƒํƒœ ๊ด€๋ฆฌ

[์›๋ณธ ๋งํฌ]

๊ฐ•ํ•œ ํƒ€์ž…๊ณผ ํ•จ์ˆ˜ํ˜•๋งŒ ํ•ด๋„ ๊ฝค ํ›Œ๋ฅญํ•œ ์žฅ์ ์ด์ง€๋งŒ, elm์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊น”๋”ํ•œ ์ƒํƒœ๊ด€๋ฆฌ์— ์žˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ๋ฅผ ํ•œ๋ฒˆ ๋ถ„์„ํ•ด๋ณด์ž.

Elm์€ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์„ ์žฌํ• ๋‹นํ•˜๋Š” ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ ค๋ฉด ์ด๋ฒคํŠธ์™€ ๋ชจ๋ธ์˜ ํƒ€์ž…์„ ์ •์˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ด๋ฒคํŠธ ํƒ€์ž… Message๋Š” ์ฆ๊ฐ€(Increment)์™€ ๊ฐ์†Œ(Decrement) ์ด๋ฒคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์—ด๊ฑฐ ํ˜•์‹์œผ๋กœ ์ •์˜ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ธ ํƒ€์ž… Model์€ ์ฆ๊ฐ๋˜๋Š” ์ˆซ์ž๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ ˆ์ฝ”๋“œ๋กœ ์ •์˜ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ทฐ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฒ ๋‹ค. html์„ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋งํ•  ๊ฒƒ์ธ์ง€๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
๋ชจ๋ธ ๊ฐ์ฑ„๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , 'Html ์ด๋ฒคํŠธํƒ€์ž…' ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

div, button ๋“ฑ์˜ Html ํ•จ์ˆ˜๋“ค์€ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์†์„ฑ๊ฐ’์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ innerHtml์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค.
์ด๋ฒคํŠธ๋Š” ์†์„ฑ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ  onClick ํ•จ์ˆ˜๋กœ ๋งค์นญ๋  ์ด๋ฒคํŠธ๊ฐ’์„ ๋„ฃ์–ด์คฌ๋‹ค.
๊ทธ๋ฆฌ๊ณ  text ํ•จ์ˆ˜๋กœ ๋ชจ๋ธ ๋‚ด์˜ ์ˆซ์ž๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฟŒ๋ ค์ฃผ๋„๋ก ํ–ˆ๋‹ค.\

๋‹ค์Œ์—” ์ € onClick์œผ๋กœ ๋ฐœ์ƒํ•  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„, ๊ฐฑ์‹  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.
์ด๋ฒคํŠธ์™€ ๋ชจ๋ธ์„ ๋ฐ›๊ณ , ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜ํ™˜๋  ๋ชจ๋ธ์€ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค.
ํŒจํ„ด๋งค์นญ ๊ตฌ๋ฌธ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๊น”๋”ํ•˜๊ณ  ์ข‹๋‹ค.

๋‚œ ๊ฐ๊ฐ ์ˆซ์ž๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ์‹œํ‚ค๋„๋ก ํ–ˆ๋‹ค.

์ž ๊ทธ๋Ÿผ, main ํ•จ์ˆ˜์—์„œ๋Š” ์œ„์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ๋“ค์„ ํ†ตํ•ด SandBox ๊ฐ’์„ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์ด๊ฒŒ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ฒซ๋ฒˆ์งธ ์ธ์ž init์œผ๋กœ๋Š” ๋ชจ๋ธ์˜ ์ดˆ๊ธฐ๊ฐ’, ๋‘๋ฒˆ์งธ ์ธ์ž update๋Š” ๊ฐฑ์‹  ํ•จ์ˆ˜, ์„ธ๋ฒˆ์งธ ์ธ์ž view๋Š” ๋ทฐ ํ•จ์ˆ˜๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋‹ค.

--ํ˜„์žฌ ๋ชจ๋“ˆ ์ „๋ถ€ ๋‚ด๋ณด๋‚ด๊ธฐ
module Main exposing(..)

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

--์ง„์ž…์ 
main: Program () Model Message
main =
  Browser.sandbox { init = {number=0}, update = update, view = view }

-- ์ด๋ฒคํŠธ ํƒ€์ž…
type Message = Increment | Decrement

-- ๋ชจ๋ธ ํƒ€์ž…
type alias Model = 
  {
    number: Int
  }

-- ๊ฐฑ์‹  ํ•จ์ˆ˜. ์ด๋ฒคํŠธ๊ฐ€ ๋˜์ ธ์กŒ์„ ๋•Œ ๋ชจ๋ธ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๊ณ  ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
update: Message -> Model -> Model
update message model =
  case message of
    Increment -> {model | number = model.number+1}
    Decrement -> {model | number = model.number-1}

-- ๋ทฐ ํ•จ์ˆ˜. html ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ๋‹ค. 
view: Model -> Html Message
view model =
  div []
    [ 
      button [ onClick Increment ] [ text "+" ],
      div [] [ text (String.fromInt model.number) ],
      button [ onClick Decrement ] [ text "-" ]
    ]

์ด๋Œ€๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋Œ๋ฆฌ๋ฉด

๊ธฐ๋Œ€ํ•œ๋Œ€๋กœ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.


์ฐธ์กฐ
https://guide.elm-lang.org/
https://package.elm-lang.org/packages/elm/browser/latest/Browser#sandbox
https://package.elm-lang.org/packages/elm/html/latest/Html