오늘 회사에서 안드로이드 개발을 하시는 팀원분이 코틀린 기반의 프레임워크인 ktor를 알려주셨고, 팀 채팅에 올려주셔서 프로젝트 홈페이지를 들어가봤다.
홈페이지에 접속하면 메인 페이지에서 아래와 같은 글을 볼 수 있다.
가장 눈에 띄는 문구는asynchronous server and client connect system 이라는 문구이다. ktor 프레임워크로 비동기 서버와 클라이언트 프로그래밍이 가능하다는 문구이다. 사내에서 안드로이드 개발은 코틀린으로 개발하고 있기 때문에, 해당 프레임워크를 사용하여 서버와 클라이언트 모두 코틀린으로 개발한다면 코틀린 천하통일이 이루어지는 것이다.
코틀린으로 언어가 통일되고 IDE가 통일된다면, 각기 다른 영역에서 개발하고 있지만 코드는 모두 코틀린 코드이기 때문에 손쉽게 코드 리뷰가 가능하고 코드 컨벤션 또한 쉽게 통일 시킬 수 있다는 장점이 있다.
하지만 이를 위해서는 코틀린을 배워야 한다는 단점이 있다.. (난 Java 와 Typescript로 서버개발을 하기에, 코틀린 문법이 그렇게 어렵게 느껴지진 않았다.)
각설하고, Ktor를 손쉽게 사용하기 위해서는 Intellij를 사용하는 것이 좋다. Gradle, Docker, Mavne 등의 여러 방법을 지원하지만, Intellij의 경우 공식 플러그인이 나와있기 때문에 플러그인을 단순히 설치하는 것으로 ktor 프레임워크를 사용하는 환경을 잡을 수 있다.
플러그인을 설치하고 Intellij를 재시작한 뒤에, New Project 버튼을 눌러 프로젝트 생성화면을 켜보자.
그러면 다음과 같이 ktor 프레임워크 탭이 새로 추가된 것을 볼 수 있다. 데모를 프로젝트를 만들기 위해 HTML DSL과 CSS DSL, Apache HttpClient Engine 등을 선택한 뒤에 프로젝트명을 입력하고 프로젝트를 켜보자!
프로젝트 구조를 보면 각종 리소스 파일들이 저장되는 resources 폴더와 코드가 작성되는 src 폴더 등 기존 Java 기반으로 Spring Boot 프로젝트를 구성했을 시 구조와 거의 차이가 없다. logback.xml 파일이 따로 생성되어있다는 점과 application 프로퍼티 파일이 conf 확장자를 가진것 이외에는 모두 같다.
Application.kt 파일을 보면 메인 함수가 있고, io.ktor.server.netty.EngineMain.main(args) 코드를 보아 Netty 서버로 해당 어플리케이션이 실행됨을 알 수 있다. Scala 를 조금 공부했었는데 kotlin 코드가 Scala 느낌이 많이 나는것에 대해 조금 놀라웠다.
routing 부분을 보면 get 키워드와 소괄호 사이에 request url이 맵핑되어있다.
routing {
get("/") {
call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain)
}
}
딱 봐도 위에 코드는 / URL로 GET Request가 들어왔을때 Respond Text로 "HELLO WOLRD!" 를 내보낸다는 것과 Response 의 Content-Type은 ContentType.Text.Plain으로 한다는 것을 알 수 있다.
그럼 프로젝트를 실행 시켜 실제로 "HELLO WORLD!" 가 찍히는지 한번 보자.
기본 라우팅 코드만 들어있긴 하지만, 구동이 매우 빨랐다. Netty 서버를 사용해서 그런지 빠른 구동 속도가 마음에 들었다. 프로젝트에 여러 기능이 들어가고 사이즈가 커졌을때도 저런 성능을 보장하는지는 한번 확인해 볼 필요가 있다.
어플리케이션을 구동시키면 로그에 현재 구동되는 포트 정보가 나타나는데 기본포트인 8080 포트를 사용하고 있었다.
http://localhost:8080 포트로 접속하니 HELLO WOLRD! 문구가 제대로 나타났고, chrome console에서 network 탭을
확인해 보니 Response Header의 ContentType이 text/plain으로 되어있음을 확인 할 수 있었다.
프로젝트 환경을 구축해보고 간단하게 구동해봤는데, 매우 느낌이 좋았다. 간단한 사이드 프로젝트에 적용해보면서 실무에 사용가능한지 한번 확인해봐야겠다.