코틀린으로 리액트 프로그래밍하기

Jaychy·2021년 7월 4일
4

알아가는 것

목록 보기
11/11
post-thumbnail

Github 코틀린으로 리액트 프로그래밍하기

개요

코틀린은 바이트코드뿐만 아니라 자바스크립트로도 컴파일할 수 있습니다.
이를 이용해 리액트 라이브러리가 구현되어 있으며
이를 통해 리액트 프로그래밍이 가능합니다.

오늘은 Kotlin/JS를 이용하여 To-Do-List를 만들면서
느꼈던 생각들에 대해서 공유하고자 합니다.

코틀린으로 리액트 프로그래밍 방법은 위 Github에서 보실 수 있습니다.

Kotlin으로 굳이 리액트 프로그래밍을?

코틀린은 어떤 한 분야에 특화되어 있는 언어가 아닙니다.
따라서 안드로이드, 서버 개발을 넘어 프론트엔드 개발에도 힘쓸 수 있다고 생각합니다.
그러면 코틀린으로 프론트엔드 개발을 하면 생기는 장점이 무엇이 있을까요?

1. 안 되는 걸 안 되게 할 수 있다.

코틀린은 타입 안전성이 있는 정적 타입 언어입니다.
이를 DSL로 이용하여 HTML 태그들을 구현한다면
태그 간의 상하관계를 확실하게 할 수 있습니다.

예를 들어 td 태그 안에 tr 태그가 들어가는 불상사를 방지할 수 있습니다.
또한 스타일을 적용할 때 backgroundcolor 라고 작성해서
스타일이 적용되지 않는 불상사도 방지할 수 있습니다.

2. 클라이언트와 서버를 같은 언어로 개발할 수 있다.

이는 자바스크립트로 구성할 때와 같은 장점이지만,
서버를 코틀린으로 작성해야 할 때 다른 선택의 여지를 가질 수 있다는 점에서
큰 장점이라고 생각합니다.

코드 변경될 때마다 그 느린 컴파일을 다시?

처음 코틀린으로 리액트 프로그래밍을 할 때 가장 궁금했던 점은
코드를 변경할 때마다 그 느린 컴파일을 다시 해줘야 하냐는 것이었습니다.
실제로 처음 프로젝트를 만들고 실행을 시키면서 변경할 때는
다소 느린 컴파일이 인내심을 건드리곤 했습니다.

하지만 Kotlin/JS에서는 IR 컴파일러를 내세워 이를 해결합니다.
IR 컴파일러를 사용하게 되면 코틀린 코드를
바로 자바스크립트 코드로 변경하는 것이 아니라
중간 단계의 언어로 변경하여 공격적인 최적화를 시도할 수 있습니다.
이에 대한 자세한 내용은 이 글을 참조해주세요.

동적 언어 흉내내기

실제로 리액트 프로그래밍을 하다보면 자바스크립트가 동적 타입 언어라
쉽게 가능했던 일이 있을 것입니다.

물론 정적 타입 언어로 불가능한 것은 아니지만,
굳이 정적 타입으로 해서 돌려돌려 구현하는 것보다는
직관적인 게 필요할 때가 있습니다.

그럴 때를 위해서 Kotlin/JS에서는 dynamic 이라는 타입을 지원합니다.
dynamic 타입은 동적 타입 언어의 타입처럼 타입을 강제하지 않고,
타입의 결정을 런타임까지로 미루도록 도와줍니다.

이렇게 Kotlin/JS
자신의 부족한 점을 극복하기 위해 여러 대책을 마련하고 있습니다.

코드가 아름답습니다.

이건 매우 주관적인 내용이지만 코틀린으로 작성한 클라이언트 코드는 아름답습니다.

data class ToDoListState(
    val toDoMessages: List<String>,
) : RState

@JsExport
class ToDoList : RComponent<RProps, ToDoListState>() {

    init {
        state = ToDoListState(listOf("test", "test2", "test3"))
    }

    override fun RBuilder.render() {
        styledDiv {
            css {
                +MainStyles.todoListBody
            }
            state.toDoMessages.forEachIndexed { messageNumber, m ->
                toDo {
                    attrs {
                        index = messageNumber + 1
                        message = m
                        toDoListReference = this@ToDoList
                    }
                }
            }
            toDoInsertion {
                attrs {
                    toDoListReference = this@ToDoList
                }
            }
        }
    }
}

fun RBuilder.toDoList(): ReactElement {
    return child(ToDoList::class) {}
}

솔직히 라이브러리를 개발하는 입장이 아니라
백엔드 개발을 하는 제 입장으로써는
수신 객체 지정 람다를 저렇게 사용하여 예쁘게 만들 수 있을지도,
프로퍼티 위임을 통해 스타일 시트를 구성하게 만들 생각도,
+ 연산자 오버로딩을 저렇게 이용할 것이라고는 생각 못했을 것입니다.

이렇게 여러 코틀린의 아름다운 문법을 이용하여 만들어진 라이브러리가
아름답지 않을 수가 없다고 생각합니다.

profile
아름다운 코드를 꿈꾸는 백엔드 주니어 개발자입니다.

0개의 댓글

관련 채용 정보