스칼라, 당신이 생각하는 것 만큼 어렵지 않아요. Scala, Not as Hard as You Think
View: 606
0
0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2023-11-07
수정
2024-06-21
안녕하세요. 달빛제이크입니다.
1. 스칼라 언어의 현황
스칼라 언어는 스위스 로잔 연방 공과대학교 마틴 오더스키 (Martin Odersky) 교수님이 2001년부터 설계한 범용 프로그래밍 언어입니다. 2004년도에 최초로 공식 릴리스가 이루어졌고, 2006년 3월에 v2.0이 발표되어 2018년까지 주목받는 언어로 성장했으나, Java의 개선과 Kotlin의 탄생으로 현재는 그 인기가 다소 감소하였습니다. 그러나 2012년 12월 6일 첫 커밋(commit)을 시작으로 장장 8년에 걸친 노력 끝에 2021년 5월 14일 금요일 Scala 3.0이 마침내 모습을 드러냈고, 그 동안 지적되었던 여러 문제들이 개선됨과 동시에, 탄탄하게 매니아 층을 형성하고 있는 충성도 높은 스칼라 사용자들과, SNS를 통해 지속적으로 유입되고 있는 뉴비(Newbie)들로 인해 그 영향력이 서서히 증가하고 있습니다.
출처: TIOBE Index
TIOBE Index와 Stack Overflow Developer Survey에서와 같이 아직까지 스칼라가 차지하는 프로그래밍 언어 생태계에서의 위상은 Other language로 분류가 되지만, 모든 스칼라 사용자가 동의하듯이 스칼라는 프로그래밍 언어로서 매우 설계가 잘 된 훌륭한(brilliant) 언어입니다. 기술의 성숙도를 보여주는 하이프 사이클에서 환멸단계 (Trough of Disillusionment)를 이제 막 지나서 계몽단계 (Slope of Enlightment)를 거침없이 오르고 있는 중이며, 스칼라 3로의 전환이 마무리 되면 가지고 있는 포텐셜을 가감없이 보여주리라 기대하고 있습니다.
출처: Wikipedia - Gartner Hype Cycle
2. 스칼라 언어의 특징
그렇다면, 어떤 특징들을 가지고 있길래 스칼라 사용자들이 스칼라 언어를 그토록 훌륭한 언어라고 생각하고 좋아할까요? 사실 Scala 2 시절에는 대중적인 인기가 증가하면서 스파크 데이타 분석 엔진을 필두로 다양한 프로젝트에 채택되어 사용되었는데요, 스칼라의 언어적 장점이 십분 활용되었지만, 반대로 그 한계도 많이 드러내었습니다. 그 중 가장 문제가 되었던 부분이 컴파일 속도인데, 스칼라가 엔터프라이즈 애플리케이션 개발에 많이 활용되다 보니 당연히 소스 코드의 규모도 상당하고 프로젝트를 진행하는 데 컴파일 소요시간이 큰 부담으로 지적되었습니다. 이 외에도 개발자들 사이에서 스칼라 언어가 가파른 학습 곡선(Steep learning curve)을 가지고 있는 것으로 소개되곤 했는데 Scala 3.0에서 이 모든 문제에 대해 개선이 이루어지고 Python의 문법 체계를 도입하면서 매우 긍정적인 평가를 받고 있습니다.
-
멀티 패러다임 언어 (객체지향 언어, 함수형 언어)
첫 번째로 소개할 스칼라 언어의 특징은 객체지향 언어이면서 함수형 언어라는 점입니다. 스칼라 관련 책과 기사에서 참 많이도 다룬 내용인데요, 그럴 수 밖에 없는 것이 스칼라 언어의 창시자 마틴 오더스키 교수님이 Programming in Scala 책에서 제일 먼저 언급한 특징입니다. 스칼라(Scala) 언어는 그 이름 처럼 Scalable Language로서 다양한 사용자들의 요구를 만족시키도록 설계되었습니다. 그리고 이를 실현하기 위해 채택한 컨셉이 객체지향과 함수형 프로그래밍의 조합입니다. 함수형 프로그래밍 방식으로 도메인에 집중하여 코드를 구현할 수 있으며, 객체지향 프로그래밍 방식을 통해 큰 규모의 시스템을 개발하는 데 용이하고 새로운 요구에 대한 확장성을 제공할 수 있게 되었습니다. 다만 안타까운 점은 이 두 방식을 프로그래밍에 대한 패러다임의 변화로서 마치 대립하는 개념으로 설명하는 글이나 영상이 많다는 점입니다. 아무래도 객체 지향 프로그램의 세부 구현이 절차 지향 방식을 따르다 보니 절차 지향과 객체 지향을 묶어서 하나의 패러다임으로 보기 때문인 것 같습니다. 사실 객체 지향만 놓고 본다면 함수형 프로그래밍 방식과 반대되는 개념을 가졌다고 생각하기에는 좀 무리가 있어 보입니다. 객체 지향 콘셉으로 프로그램의 구조를 책임지고, 함수형 프로그래밍 방식으로 세부 구현을 담당한다면, 이 두 패러다임은 구조와 구현에 있어서 최상의 결과물을 내기 위해 프로그래밍 언어가 선택할 수 있는 최고의 조합이 될 수 있을 것입니다. 그리고 이 두 패러다임을 아주 훌륭하게 내재화 시킨 프로그래밍 언어가 바로 스칼라 언어입니다. 인공지능, IOT, 멀티버스, 블록체인으로 하루가 다르게 기술 발전이 이루어지고 있는 시대에서 다양한 사용자 요구를 만족시킬 수 있는 프로그래밍 언어로서 스칼라를 추천하는 이유입니다.
-
강력하고 유연한 범용 프로그래밍 언어
두 번째로, 스칼라가 객체지향 프로그래밍과 함수형 프로그래밍 방식을 채택하고 다양한 프로그래밍 언어의 특징들을 흡수하여 개발되었기 때문에 간단한 스크립트에서 부터 엔터프라이즈 웹 어플리케이션까지 그 적용 범위가 매우 넓고 그 구현 방식 또한 유연합니다. 일반적으로 범용 프로그래밍 언어가 실행 속도, 메모리 제어 방식, 객체 지원 여부, 동시성과 병렬성 지원 여부 등에 따라 주력으로 사용하는 분야가 정해진다면, 스칼라는 JVM의 안정된 자원을 바탕으로 객체와 함수형 프로그래밍 방식을 지원하고 동시성과 병렬성을 고려한 안정된 프로그램을 작성할 수 있기 때문에 거의 모든 분야에서 활용이 가능하다고 할 수 있습니다. 더욱이 그 구현 방식의 유연함은 스칼라의 또다른 강점일 수 있는데 그것은 절차형 프로그래밍에서 부터 함수형 프로그래밍까지 개발자가 원하는 방식의 프로그래밍 형태로 구현이 가능하다는 점입니다. 초보자는 기본적인 문법만 공부하면 스크립트 언어 수준의 간단한 프로그램을 작성할 수 있고 고급자는 다양한 프레임워크와 라이브러리를 사용하여 부작용 (Side Effect) 을 제어하며 거의 결점없는 함수형 프로그래밍 코드를 작성할 수 있습니다. 이 부분은 스칼라의 양날의 검으로 작용할 수 있는데, 그 이유는 구현의 유연함이 너무 다양한 코딩 스타일을 양산해서 코드를 이해하는 데 어려움을 줄 수 있기 때문입니다. 또한 akka, cats, zio와 같은 함수형 프로그래밍 방식이 스칼라 사용자로서 가야할 최종 종착지로 인식되고 있기 때문에 초급과 고급의 격차가 매우 크게 인식되어지는 경향이 있습니다. 그러나 모든 사용자가 함수형 프로그램을 작성할 필요가 없고 모든 사용자가 대규모 프로젝트를 진행하지는 않습니다. 필요에 의해 그 기능들을 익혀서 개발에 반영해나가다 보면 스칼라를 통해 양질의 프로그램을 작성할 수 있고 본인에게 필요한 훌륭한 도구로 활용할 수 있을 것입니다. 다른 프로그래밍 언어를 사용하듯이 스칼라 언어를 사용하는 것은 쉽습니다. akka, catz, zio를 사용하지 않아도 스칼라 언어의 자체 기능 만으로도 훌륭한 프로그램을 작성할 수 있습니다. 그리고 궁극적으로 함수형 프로그래밍을 포함해서 스칼라의 모든 기능들, 프레임워크들을 적절하게 사용할 수 있는 고수가 되는 길 또한 스칼라 사용자로서 갈 수 있는 즐거운 여행이 될 것입니다. 명검을 능숙하게 다루기 위해서는 그 만큼의 시간이 필요한 법이죠.
-
체계적이고 합리적인 언어 설계
세번째로, 스칼라는 일관되고 군더더기 없는 문법 체계를 가지고 있습니다. 자바는 객체(object)와 기본형(primitive type)으로 자료형을 구분하지만, 스칼라는 모든 자료형을 객체로 구현하였습니다. +, -, *, /, %의 기본 연산자를 포함해서 모든 연산자를 객체화하였습니다. 따라서 연산자 오버로딩이 가능하기 때문에 도메인(Domain)에 특화된 언어 개발이 가능합니다. 언어 문법의 기본이 객체와 함수이기 때문에 규칙이 명확합니다. 따라서 언어 문법을 공부할 때 암기보다는 원리만 이해하면 쉽게 습득하고 활용할 수 있습니다. 각 문법들이 명쾌한 규칙을 가지고 있고 예외가 적어 이해하기 쉽고, 개발자가 의도한 대로 코드가 실행이 되며, 컴파일 단에서 대부분의 오류를 찾아 줍니다. 또한 스칼라 언어는 불필요한 코드 작성을 지양하기 때문에 문법 설탕 (Syntactic Sugar)을 활용하여 코드를 간결하게 만들 수 있습니다.
/**
* Syntactic Sugar 예시
**/
val list = List(1,2,3,4)
//list.foreach(elem => println(elem))
//list.foreach(println(_))
list.foreach(println)
스칼라 언어는 정적 타입 언어(Statistically Typed Language)로서 타입 시스템을 가지고 있고 타입에 대한 다양한 기능들을 제공합니다. 그 중 가장 대표적이고 기본적인 기능이 타입 추정 (Type Inference)으로 스칼라 언어를 마치 동적 타입 언어(Dynamically Typed Language)처럼 사용할 수 있도록 유연성(Flexibility)을 제공합니다.
/**
* Type Inference 예시
* Type을 명시하지 않아도 컴파일러가 알아서 타입을 구분합니다.
**/
val num = 1 // Int type
val str = "This type is String." // String type
val list = List(1,2,3,4) // List[Int] type
뿐만 아니라 Subtype, Parameterized type, Type variance, Type bounds, Enumerations, Opaque types 등 많은 기능들을 제공해 주기 때문에 프로그래밍에 있어 강력하고 유연한 설계를 가능하게 해 줍니다. 스칼라 언어가 타입 시스템에 있어서 매우 발전된 모습을 보여주고 있기 때문에 이러한 기능들을 하나하나 공부해 나가다 보면 어느 덧 스칼라 언어를 더 막강하게 사용할 수 있게 될 것 이고, 다른 언어를 사용하는 데에도 큰 도움이 될 것입니다.
3. 스칼라 언어의 학습 난이도
스칼라 언어는 어렵지 않습니다. 마틴 오더스키 교수님이 2022년 가을 Scalacon에서 강연하신 Simply Scala 영상에서 지적하신 것처럼 스칼라 언어는 복잡하다라는 인식이 개발자 커뮤니티 사이에 퍼져있는데, 실제로는 주류 범용 프로그래밍 언어와 문법 규모를 비교 시 함수형 프로그래밍 언어인 하스켈 (Haskell)을 제외하고 파이썬(Python) 다음으로 작은 규모를 가지고 있습니다. 이러한 인식을 야기한 여러 원인들 중 하나가 순수 함수형 프로그래밍 방식을 고집하는 일부 커뮤니티 유저들의 적극적인 홍보 활동과 cats, zio와 같은 함수형 프레임워크의 접근성 및 난이도로 보여집니다. 실제로 스칼라를 공부하면서 스칼라 자체에서 제공하는 함수형 프로그래밍 방식은 함수형 프로그래밍의 기본기 정도로 이해하는 데 크게 어려움이 없었으나 cats, zio 등 함수형 프레임워크에서 보여주는 디자인패턴 수준의 적용 방식은 접근하기가 쉽지 않았습니다. 더우기 스칼라 타입 시스템의 많은 기능들을 익히고 프로젝트에 적용하는 것도 현업에서 라이브러리를 개발하지 않는 이상 어느 정도의 시간이 필요한 부분인데 순수 함수형 프로그래밍 방식을 공부해야하는 부담감은 스칼라 언어를 더욱 어렵게 느끼게 할 수 있습니다. 스칼라는 스칼라가 제공하는 기능 전부를 반드시 알아야지만 사용할 수 있는 언어가 아닙니다. Scala는 'Scalable Language'입니다. 이 확장 가능한 언어라는 의미가 프로그래밍 설계에만 적용되는 것이 아니고 언어 자체에도 해당하는 의미입니다. 스칼라 언어의 기본 문법을 익히고 나면 Python 수준의 프로그래밍이 가능하게 됩니다. 프로그래밍의 수준이 높아지고 그에 따라 필요한 언어적 기능들이 생기게 되면 스칼라에는 그에 적합한 기능들이 이미 존재하기 때문에 선택해서 사용하기만 하면 됩니다. 함수형 프로그래밍을 주로 하는 개발자들은 현재 본인의 프로젝트에 필요하기 때문에 함수형 프로그래밍 방식으로 프로젝트를 진행하는 것일 뿐입니다. 간단한 웹사이트를 만들거나 스크립트를 작성하는 데 고급 함수형 기술을 사용할 필요는 없습니다. 앞서 소개드렸던 스칼라 언어의 교본인 Programming in Scala 책에서도 순차적으로 필요한 문법이나 코드를 소개하며 개발자들을 빌드업(build-up) 시키고 있으며 순서를 바꾸어 고급 스킬을 먼저 하용하거나 함수형 프로그래밍 방식을 강요하지 않습니다.
4. Simply Scala 소개
Simply Scala의 선도적인 인물을 꼽자면 Hands-on Scala Programming의 저자이자 Ammonite의 개발자 리 하오이(Li Haoyi) 입니다. 그는 mill (Scala build tool), Ammonite (scala repl), OS-Lib (library manipulating fils and processes) 등 유용한 Scala Library 들을 개발하며 스칼라 생태계에 많은 도움을 주고 있습니다. 그의 블로그, 'The Death of Hype: What's Next for Scala'에서 언급한 주목할 만한 내용으로, 많은 조직들에서 함수형 프로그래밍 방식을 전면 도입하여 사용하였으나, 그들 중 일부는 그들의 문제해결에 함수형 프로그래밍 방식이 적합하지 않다는 것을 알고 투자를 철회했다는 부분입니다.
""" Even on a technical level, not all was well. While many organizations used these techniques successfully in their respective niches, others have regretted going all-in on actors and all-in on functional programming. They were finding that these techniques don't fit their problem as well as they would have liked, and had to spend some time backing out of their all-in investment in a particular programming paradigm. I personally know many organizations who have had to make this adjustment. """
함수형 프로그래머들의 대다수가 필드에서 활동하는 고급 개발자들이고, 이러한 실력있는 개발자들이 주요 스칼라 행사의 연사이자 에반젤리스트(evangelist)로 왕성하게 활동하면서 함수형 프로그래밍 방식이 문제 해결에 있어 최고의 솔루션이고 스칼라 언어가 가야할 최종 목적지로 소개되어 왔습니다. 이러한 환경에서 거의 모든 Framework와 Library, Build tool 에 함수형 프로그래밍 방식이 도입되었고, 많은 기업에서 이 방식을 문제 해결 솔루션으로 채택하였으며, 뉴비에게는 스칼라 언어를 사용하기 위해 해야하는 방대한 양의 또다른 공부거리가 되었습니다. 다행히도 함수형 프로그래밍 방식에 열광하고, 함수형 프로그래밍 방식으로만 문제를 해결하려했던 시도가 예외적인 결과들을 보여주면서 많은 인식의 변화가 이루어지고 있는 듯이 보입니다. 스칼라 3가 발표된 후 스칼라 3에 대한 전환이 활발하게 이루어지고 있는 시점에서 마틴 오더스키 교수님이 Simply Scala에 대해 강연하신 것은 스칼라가 가야할 방향을 명확히 제시했다는 점에서 큰 의미가 있을 것입니다. 문제를 해결하기 위한 다양한 방법이 존재하고 그 중에 반드시 함수형 프로그래밍 방식을 고집할 필요는 없습니다. 문제를 해결하는데 효율적인 최적의 방법을 찾아 적용하면 됩니다.
5. 스칼라 언어의 대중화를 위한 다양한 노력들
sbt를 대신할 mill이라는 scala build tool이 사용되기 시작했고, scala-cli를 통해 command line에서 더욱 쉽게 compile, run, test, packaging을 할 수 있어 script를 활용한 작업이 더욱 다양하고 활발하게 이루어질수 있게 되었습니다. 또한 Scala Toolkit이 발표되었는 데, 스칼라에서 많이 사용하는 라이브러리들을/ 모아서 하나의 도구 모음으로 만든 라이브러리 집합으로 toolkit 하나만 프로젝트에 포함시키면 되기 때문에 라이브러리 접근성이 매우 쉬워집니다. 현재는 OS-Lib, uPickle, sttp, MUnit가 포함되어 있으며 계속 유용한 라이브러리들을 포함시킬 계획입니다. 이렇듯 Simply Scala에 대한 다양한 노력들이 진행되고 있고 점차 많은 사람들이 스칼라 언어를 사용할 것으로 기대하고 있습니다.
6. 스칼라 언어의 전망
스칼라 3 발표를 기점으로해서 커뮤니티를 중심으로 스칼라 언어에 대한 긍정적인 변화들이 많이 일어나고 있습니다. 함수형 프로그래밍 진영에서도 일방적으로 함수형 프로그래밍 방식만 고집하는 자세에서 객체지양의 장점을 인정했고 (John De Goes - What Functional Programming Can Learn From Object-Oriented Programming 강연), 개발자들의 대다수가 함수형 프로그래밍 방식이 문제 해결에 대한 전부가 아닌 다양한 방식들 중 하나임을 인식하고 있습니다. 스칼라 언어를 만드신 마틴 오더스키 교수님이 마음먹고 스칼라 언어 생태계를 확장하고자 Simply Scala를 주창하고 계시고, 스칼라 커뮤니티에서 지속적으로 활동하고 있는 스칼라 공헌자들(Contributors)과 새로 영입된 능력있는 개발자들이 새로운 컨셉으로 다양한 프레임워크와 라이브러리들을 개발 중입니다. 이러한 지속적인 노력들이 모여 결국 스칼라 생태계를 확장하고 스칼라 언어를 Other language가 아닌 주류 언어로 발돋움 시킬 것입니다.
스칼라 언어는 어렵지 않습니다. 문제를 해결하기 위한 다양한 방법을 제공해 줄 뿐입니다. 스칼라 언어가 초보자부터 고급 개발자에 이르기 까지 유용하고 친숙한 언어로 자리매김 하기 위해 커뮤니티에서 올바르고 일관된 방향으로 생태계를 확장시키기 위한 노력이 필요합니다.
-. 참고자료
Wikipedia - Scala (Programming language)
TIOBE Index
Stack Overflow Developer Survey
The Death of Hype: What's Next for Scala
Wikipedia - Gartner Hype Cycle
Apache Spark
Programming in Scala Fifth Edition (Martin Odersky, Lex Spoon, Bill Venners, Frank Sommers) - publisher artima
Simply Scala by Martin Odersky @ Youtube
Martin Odersky DIRECT STYLE SCALA Scalar Conference 2023 @ Youtube
Hands-on Scala Programming
Ammonite
Haoyi's Programming Blog
The Death of Hype: What's Next for Scala written by Li Haoyi
Scala mill
scala-cli
Scala Toolkit
What Functional Programming Can Learn From Object-Oriented Programming by John De Goes @ Youtube
There is no article.
