Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 연동] Scala Slick

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 를 내려받아 설치해도 된다.

https://github.com/ojdkbuild/ojdkbuild

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 을 지원하는 것을 확인했으며, 프로파일에서 지원되지 않는 몇몇 기능도 빠르게 보완해 나가야 할 것이다.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을