관리 메뉴

HAMA 블로그

예제로 보는 아카(akka) - 14. Slick 으로 PostgreSQL 사용하기 본문

Akka

예제로 보는 아카(akka) - 14. Slick 으로 PostgreSQL 사용하기

[하마] 이승현 (wowlsh93@gmail.com) 2016. 10. 21. 12:00

- Scala 2.11.8 기반 

- Akka 2.4.11 기반 

- Java 8  (akka 2.4 부터는 java 8 요구함. scala 2.11 은 java 7도 괜찮지만~) 

참고 : 

http://queirozf.com/entries/scala-slick-simple-example-on-connecting-to-a-postgresql-database
http://slick.lightbend.com/doc/2.1.0/sql-to-slick.html#insert
https://github.com/lucperkins/spray-akka-slick-postgres

Akka 에서 PostgreSQL 사용하기

1. Scala 로 PostgreSQL 사용하기 (with Slick) 

의존성 추가 

libraryDependencies ++= Seq(
"org.postgresql" % "postgresql" % "9.3-1100-jdbc4",
"com.typesafe.slick" %% "slick" % "2.1.0",
"org.slf4j" % "slf4j-nop" % "1.6.4"
)

테이블 스키마  

CREATE TABLE users3
(
id bigserial NOT NULL,
username character varying,
age int,
date timestamp
)

SELECT 예제

//라이브러리 임포트 import scala.slick.driver.PostgresDriver.simple._
// 모델 정의
class Users3(tag: Tag) extends Table[(Int, String, Int, String)](tag, "users3") {
def id = column[Int]("id")
def username = column[String]("username")
def age = column[Int]("age")
def date = column[String]("date")
def * = (id, username, age, date)
}

object managementMain extends App {

val connectionUrl = "jdbc:postgresql://192.168.1.169/EV-IOT?user=postgres&password=pws"

Database.forURL(connectionUrl, driver = "org.postgresql.Driver") withSession {
implicit session =>
val users = TableQuery[Users3]

// * FROM users
users.list foreach { row =>
println("id :" + row._1 + " / username : " + row._2 + " / age : " + row._3 + " / date: " + row._4)
}

// * FROM users WHERE username='brad'
users.filter(_.username === "brad").list foreach { row =>
println("id :" + row._1 + " / username : " + row._2 + " / age : " + row._3 + " / date: " + row._4)
}
}
}

 -  테이블로 매칭되는 클래스 하나 만들고 (tag 이름이 테이블명과 동일) 
 -  전체 출력 / 선택 (filter 활용) 출력 해줍니다.

INSERT

val date = new java.util.Date()
val ts = new java.sql.Timestamp(date.getTime)
// INSERT
users.map(p => (p.username, p.age, p.date))
.insert(("M Odersky",33,ts))

-  map 으로 컬럼을 매핑하고 insert 를 통해서 새 데이터를 입력해줍니다.

UPDATE

// UPDATE
users.filter(_.username === "M Odersky")
.map(p => (p.age))
.update((54321))

- filter 가 where 의 역할을 하고
- map 을 통해 업데이트 할 컬럼을 매핑해서
- update 해줍니다.

DELETE

// DELETE
users.filter(p => p.username === "M Odersky")
.delete

filter 가 where 의 역할을 하고
- delete 로 삭제합니다.

커넥션 풀 

  커넥션을 풀링하여 좀 더 효율적으로 디비연결을 해보자. 여기선 C3P0 를 이용한다.

  먼저 의존성 추가하고 

libraryDependencies += "c3p0" % "c3p0" % "0.9.1.2"

  데이터소스 임포트 

import com.mchange.v2.c3p0.ComboPooledDataSource

 커넥션 풀링 기능이 있는 디비접속 객체 변수(database) 를 만든다. 

val connectionUrl = "jdbc:postgresql://192.168.1.169/MYDB?user=postgres&password=pwd"

val database = {
val ds = new ComboPooledDataSource
ds.setDriverClass("org.postgresql.Driver")
ds.setJdbcUrl(connectionUrl)
Database.forDataSource(ds)
}

 database를 사용하여 똑같이 활용합니다.  

def checkCardID(cardid : String) : Int ={

database withSession {
implicit session =>
val users = TableQuery[Card]

users.filter(_.id === cardid).list foreach { row =>
println("card_id :" + row._1 + " / state : " + row._2)
return row._2
}
}

return 0
}

2. Akka 로 PostgreSQL 사용하기(with Slick) 


 정리중..


Comments