일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- enablekafkastreams
- scala 2.10
- kafka streams
- avo
- schema registry
- spring-cloud-stream
- RabbitMQ
- 카프카
- Logstash
- Kafka
- Slick
- confluent
- kafkastreams
- play framework
- reactive
- kafkastream
- Elk
- Spring
- kafka interactive query
- 한빛미디어
- gradle
- statestore
- spring-batch
- 플레이 프레임워크
- springboot
- spring-kafka
- scala
- aws
- coursera
- Elasticsearch
- Today
- Total
b
Slick MultiDatasource, TableName, CRUD trait... 본문
원하는거 : 부끄럽지 않은 코드를 만들고 싶다. 중복을 줄이고싶다-_-;;
요구사항
1. Oracle, Mysql 2개Datasource에 접근해야함 => local import
2. 테이블명이 각각 다름 -> class 생성자
3. CRUD의 중복을 줄이고 싶음 trait사용...
삽질한것.
1. dirver.simple._를 분리해야 한다. 아니면 oracle, mysql의 ddl 코드가 제네레이션 될때 문제가 발생한다. (오라클용 insert가 mysql에서 사용될려는 등)
2. extends CRUD 부분. 좀 더 깔끔하게 할 방법이 없을까? tableName과 driver, TableQuery 3개를 DI해야하는데 좋은 방법이 떠오르지 않아서 implicit로 처리했다. 좀 더 좋은게 있을듯 한데?
ps. 리팩토링 관련 조언 좀 부탁드려요.
trait CRUD[T] {
implicit val driver: JdbcProfile
import driver.simple._
implicit val tableName:String
implicit val prop:TableQuery[_<: Table[T]]
def drop(implicit session:Session) = if ( MTable.getTables(tableName).list().nonEmpty) prop.ddl.drop
def create(implicit session:Session) = if ( MTable.getTables(tableName).list().isEmpty) prop.ddl.create
def count(implicit session:Session) = prop.length.run
def findAll(implicit session:Session) = prop.list
def insert(obj:T)(implicit session:Session) = prop += obj
def insert(obj:List[T])(implicit session:Session) = prop.insertAll(obj: _*)
}
case class City ( synId:Int, cityId:String, citySynonym:String, moddttm:String, regdttm:String, status:String, datahubstatus:String )
class CityDao (val driver: JdbcProfile, val tableName:String) extends CRUD[City] {
import driver.simple._
class HubSynCity(tag: Tag, tableName: String) extends Table[City](tag, tableName) {
def synId = column[Int]("CITY_SYN_ID")
def cityId = column[String]("CITY_ID")
def citySynonym = column[String]("CITY_SYNONYM")
def moddttm = column[String]("MOD_DTTM")
def regdttm = column[String]("REG_DTTM")
def status = column[String]("STATUS")
def datahubstatus = column[String]("DATAHUBSTATUS")
def * = (synId, cityId, citySynonym, moddttm, regdttm, status, datahubstatus) <>(City.tupled, City.unapply)
}
val prop = TableQuery[HubSynCity]((tag:Tag) => new HubSynCity(tag, tableName))
}