[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