Elm은 안정적인 웹 애플리케이션을 만들기 위한 즐거운 언어예요. 친절한 오류 메시지, 뛰어난 성능, 작은 에셋, 그리고 런타임 예외가 없다는 점이 특징이에요.
아마 Elm에서 가장 유명하고 널리 모방된 부분은 The Elm Architecture일 거예요. 웹 애플리케이션을 구조화하는 단순한 패턴이며, 모든 Elm 웹 애플리케이션이 이 방식으로 작성돼요.
핵심 아이디어는 애플리케이션 상태를 나타내는 Model, 모델을 update하는 방법, 모델을 view하는 방법을 중심으로 코드를 구성한다는 거예요.
Model은 애플리케이션의 상태, 즉 애플리케이션에 필요한 모든 데이터를 담고 있어요.
텍스트 상자와 그 텍스트를 뒤집어서 보여 주는 텍스트가 있는 간단한 애플리케이션을 상상해 보면, 모델은 아래와 같아요.
이 예제는 Elm Guide에서도 볼 수 있어요.
type alias Model =
{ text : String
}
update는 변경이 있을 때(예를 들어 사용자가 버튼을 클릭할 때) Msg와 함께 호출되는 함수예요.
Msg와 현재 Model을 받아서 새로운 Model을 반환해요.
type Msg
= TextChanged String
update : Msg -> Model -> Model
update msg model =
case msg of
TextChanged newText ->
{ model | text = newText }
view는 브라우저에서 사용자에게 보여 줄 HTML을 반환하는 함수예요.
현재 Model을 받아서 Html Msg(Elm이 HTML을 나타내기 위해 사용하는 타입)를 반환해요.
view : Model -> Html Msg
view model =
Html.div []
[ Html.input
[ Html.Attributes.placeholder "Text to reverse"
, Html.Attributes.value model.text
, Html.Events.onInput TextChanged
]
[]
, Html.div [] [ Html.text (String.reverse model.text) ]
]
친구 Paula는 십자말풀이 단서를 푸는 실력을 키우려고 해요. 어떤 단서는 답이 회문이라는 것을 보여 준다는 글을 읽었어요. 회문은 앞에서 읽으나 뒤에서 읽으나 똑같은 단어나 문장이에요.
Paula는 자신의 추측이 맞는지 확인할 수 있도록, 문자열이 회문인지 아닌지를 검사해 주는 아주 간단한 웹사이트를 만들어 달라고 부탁해요.
이번에는 Elm [샌드박스][browser-sandox] 애플리케이션으로 만들어 보기로 해요.
애플리케이션에는 Paula가 추측을 입력할 수 있는 텍스트 상자와, 그 상자 안의 텍스트가 회문인지 아닌지를 알려 주는 텍스트가 있어요. 텍스트 상자의 내용이 바뀔 때마다 이 텍스트도 함께 갱신돼요.
Model과 Msg 타입을 정의하고 init 함수를 작성해요애플리케이션 Model에는 검사할 문자열이 필요하고, 이 필드는 content라고 불러야 해요.
애플리케이션에는 텍스트 상자의 텍스트가 바뀌었다는 것을 나타내는 Msg가 필요해요.
이를 위한 variant는 Change라고 불러요.
init 함수는 content 필드가 비어 있는 초기 Model 값을 반환해야 해요.
update 함수는 Msg와 Model을 매개변수로 받아서 새로운 Model을 반환해야 해요.
Msg는 사용자가 입력한 텍스트를 담고 있고, 새로운 Model은 그 텍스트를 포함해야 해요.
Elm에서는 view 함수가 Html msg 타입을 반환해야 해요. 즉, view 함수에서 요소들의 배열이 아니라 단일 요소를 반환해야 하죠.
이 루트 요소 안에는 input 요소(텍스트 상자)와, input 안의 텍스트가 회문인지 아닌지를 알려 주는 text 내용을 담은 div가 있어야 해요.
이 텍스트는 "This is a palindrome" 또는 "Not a palindrome"이어야 해요.
main 함수는 init, update, view 함수를 담은 레코드를 매개변수로 넘기면서 Browser.sandbox를 호출해야 해요.
이 연습 문제가 Exercism 온라인 에디터에서 동작하도록, 코드와 함께 가짜 Browser.sandbox를 사용해요.
이 연습 문제를 풀기 위해 작성하는 코드에는 아무런 차이가 없어요.
Exercism에 가입하고 Elm 트랙을 개념 28개연습 문제 110개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.