b

Slick MultiDatasource, TableName, CRUD trait... 본문

카테고리 없음

Slick MultiDatasource, TableName, CRUD trait...

dev.bistro 2014. 8. 1. 19:08


원하는거 : 부끄럽지 않은 코드를 만들고 싶다. 중복을 줄이고싶다-_-;;


요구사항

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))

}



Comments