Scala 란?
Scala 란, JVM (Java Virtual Machine) 에서 수행이 가능한 함수형 프로그래밍 언어이다. 이 언어는 Java 언어 대부분과 호환되는 장점이 있다. 즉, 함수형 프로그래밍 언어이지만, 객체 지향을 추구할 수도 있는 언어이다. 여기에 더불어 기존 Java 언어를 대체할 Scala 만의 간편한 문법이 존재하기 때문에, Java 개발자들 사이에서 쓰이고 있다.
Hello World 코드를 보면 Java 개발자는 왠지 모를 친숙함을 느낄 수 있다.
object HelloWorld { def main(args: Array[String]) { println("Hello, world!") } }
Scala 의 특징은 다음과 같다.
- Scala 은 Scalable Language 를 말한다. 따라서 언어 확장을 통한 도메인 특화 언어 (DSL) 을 만들 수 있는 특징이 있다.
- Java 의 interface 개념과 비슷한 trait 을 지원한다. 하지만 인터페이스와 달리 트레잇은 구현부를 포함할 수 있다.
- Java 보다 코드가 짧아진다. 그러면서 JVM 위에 수행되고 기존 Java 코드 호환도 된다.
Slick 은 뭘까?
Slick (Scala Language-Integrated Connection Kit) 은 ‘Reactive Functional Relational Mapping for Scala’ 이라고 한다.
여기서 키워드는 Functional Relational Mapping 이다. 우리가 흔히 아는 Object-Relational Mapping (ORM) 과 비슷한 개념이라고 생각하면 된다.
Slick 예제 코드를 보면, SELECT SQL 로 조회한 데이터를 마치 함수 결과로 반환하는 것을 볼 수 있다.
val limit = 10.0 // Your query could look like this: ( for( c <- coffees; if c.price < limit ) yield c.name ).result // Equivalent SQL: select COF_NAME from COFFEES where PRICE < 10.0
Slick 이 필요한 이유
앞서 말했듯, Scala 는 Java 와 호환되므로 기존 JDBC 라이브러리를 이용해서 데이터베이스에 접속, 쿼리를 수행할 수 있을 것이다. 하지만, 보통은 함수형 언어에서 함수 값으로 데이터를 다뤄야 할 일이 많기 때문에 코딩이 굉장히 편해진다.
JDBC 의 쿼리 수행 코드보다 훨씬 간단해 지기 때문이다.
많은 데이터베이스 회사가 Slick 을 지원하도록 프로파일 (Profile) 을 제공하는 이유이다.
준비 : Linux
사용 환경은 CentOS 7 이지만, 리눅스에서는 응용해서 준비할 수 있을 것이다.
jdk
scala 를 사용하기 위해서는 JDK 1.8 이상이 필요하다. CentOS 에서는 아래와 같이 OpenJDK 를 설치할 수 있다.
sudo yum install java-1.8.0-openjdk.x86_64
그리고, 사용자 profile 에 $JAVA_HOME / $JRE_HOME 추가한다.
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk export JRE_HOME=/usr/lib/jvm/jre
연결된 OS 세션을 재접속하거나, source 명령어로 profile 을 다시 불러온다.
scala with sbt
리눅스에서는 sbt 를 사용해서 scala 를 사용할 수 있다. 아래 명령어로 Repository 를 추가한 다음 sbt 를 설치할 수 있다.
curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo sudo yum install sbt
준비 : Windows
윈도우는 좀 더 간편하다. Intellij IDEA 를 설치하면 되기 때문이다.
jdk
Oracle Java SE 를 설치하거나, 아래 페이지를 통해서 OpenJDK Installer 를 내려받아 설치해도 된다.
scala with Intellij IDEA
Java/Scala 용 IDE 이다. 설치 후 플러그인/테마 설정을 하게 되는데, 마지막 단계에 Scala 설치를 물어본다.
이 때 설치해주면 된다. (아래는 설치가 완료된 화면이다.)


설치 이후 'Start using Intellij IDEA' 를 눌러 실행하면 준비는 끝났다.
시작
Github 에서 소스코드 다운로드
git clone https://github.com/MACHBASE/scala-slick
sbt 로 이뤄져 있는데, Intellij IDEA 역시 이 프로젝트를 인식할 수 있다.
Linux
Repository Directory 로 이동해 다음을 수행한다.
조금 시간이 걸린다.
sbt compile
Windows
Intellij IDEA 시작화면 에서, 다운로드 받은 Repository Directory 를 'Open Folder...' 로 열어 본다.
자동으로 'dump project structure from sbt' 라는 메시지가 뜨며 sync 작업을 진행한다.
역시, 조금 시간이 걸린다. 아니 이건 오래 걸린다... 덤핑에 5분 인덱싱에 1분이나 걸려...
구동
이제 MachbaseSlickDriverTest.scala 파일의 main() 함수를 실행하는 일만 남았다.
확인 : IP / Port 확인
먼저, MachbaseSlickDriverTest.scala connection string 을 확인해야 한다.
val confString = """ | machbase { | dataSourceClass = "slick.jdbc.DatabaseUrlDataSource" | properties { | url = jdbc:machbase://127.0.0.1:5656/mhdb" | user = "SYS" | password = "MANAGER" | } | numThreads = 1 | connectionTimeout = 10000 | } """.stripMargin
마크베이스 서버의 IP 주소나 Port 번호가 다를 경우, 구동 전에 url 부분을 수정해야 한다.
Linux
sbt run
Linux 의 경우, log4j 의 영향인지 로그가 좀 더 많이 출력되는 걸 볼 수 있다.
$ sbt run [info] Loading project definition from /home/interp/scala-slick/project [info] Loading settings from build.sbt ... [info] Set current project to MachbaseSlickDriverTest (in build file:/home/interp/scala-slick/) [warn] Multiple main classes detected. Run 'show discoveredMainClasses' to see the list Multiple main classes detected, select one to run: [1] MachbaseSlickDriver [2] TypeTest Enter number: 1 [info] Running achbaseSlickDriver Creating table tag_data. Table tag_data created. Inserting 5 rows. Insert success. Select all records from tag_data. 2019-05-07 16:20:57.182 Pressure2 9.99 2019-05-07 16:20:57.182 Temperature3 18.99 2019-05-07 16:20:57.182 Temperature2 19.99 2019-05-07 16:20:57.182 Pressure1 8.99 2019-05-07 16:20:57.182 Temperature1 17.99 Select success. Drop table tag_data. Drop success. Disconnected. [success] Total time: 3 s, completed 2019. 5. 7 오후 4:20:58>
Windows
Intellij IDEA 에서 프로젝트를 연 상태로 Run -> Run
을 수행하면 된다. 구동할 어플리케이션 목록에서 MachbaseSlickDriverTest
를 선택한다.


Linux 와 같은 결과가 아래 출력 창에 나타난다. 탭 들여쓰기가 좀 엉망인 것만 빼면 똑같다.
마치며
Scala 언어에서 FRM 을 지원하는 Slick 을 이용해, 마크베이스 데이터베이스에 접근하는 방법을 알아봤다. 데이터베이스에 연결하고 테이블을 만들어 데이터를 입력했고, 데이터를 조회해서 객체로 받아 처리할 수 있는 일련의 과정을 MachbaseSlickDriverTest 를 통해서 알 수 있었다.
함수형 언어는 코드의 복잡도를 줄여주고 객체와 함수 변수 자체에 집중할 수 있기 때문에, 기존 JDBC 를 통한 데이터베이스 접근 방법이 있다 하더라도 크게 매력적인 방법이 아니었을 것이다. 이번 기회를 통해 Scala Slick 을 지원하는 것을 확인했으며, 프로파일에서 지원되지 않는 몇몇 기능도 빠르게 보완해 나가야 할 것이다.