336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Play framework 버전 2.5.x 에서 구현한 내용입니다. 




Play Framework 로 DB 연동할 때 주로 사용하는 도구 Slick


에러 처리 관련하여 API 문서를 뒤져 알아낸 사실들 정리


로그인 처리를 위해 Account 테이블에 쿼리를 날리는 함수 등록 


def verifyPassword[A, B](account : String, password : String) = {

  db.run {

    accounts

      .filter(record => record.account === account && record.password === password)

      .map(_.userName)

      .result

  }

}


그리고 Controller 에서 verifyPassword 호출


val loginData = request.body

ac.verifyPassword(loginData.account, loginData.password).map {

  a => if (a.nonEmpty) Ok(a.toString) else Ok("NoUser")

}


에러사항 없이 잘 돌아간다.... 근데 항상 좋은일만 생길일은 없는 법


PK 가 겹칠수도 있고

DB 서버가 맛이 가, 커넥션이 끊길수도 있고

트래픽이 많이 몰려 타임아웃이 날 수도 있고 

테이블 이름을 잘못 써 오류가 날 수도 있다.


그때마다 Play framework 는 에러를 적나라하게 보여준다. 



에러 발생 시, 적나라하게 보여준다.


 쪽팔림을 막고, 행여나 터질 보안이슈를 대비해 저런 에러들을 수정해보자.


 일단 구글에서 Slick error handling 으로 검색, 


http://slick.lightbend.com/doc/3.1.0/dbio.html  여기를 보면 아래와 같이 써있다. 


Note

For even more flexible error handling use asTry and failed. Unlike with andFinally and cleanUp the resulting actions cannot be used for streaming.


좀 더 유언하게 에러 처리를 하려면 asTry 랑 failed 를 사용해라...


일단 asTry 부터, asTry는 맨 마지막에 .asTry만 추가해주면 된다. 자세한 내용으 API 문서 참고 바람.


def verifyPassword[A, B](account : String, password : String) = {

  db.run {

    accounts

      .filter(record => record.account === account && record.password === password)

      .map(_.userName)

      .result

      .asTry

  }

}


그리고 호출부에서 결과 처리부분을 추가한다. 


val loginData = request.body

ac.verifyPassword(loginData.account, loginData.password).map {

  _ match {

    case Success(a) => if (a.nonEmpty) Ok(a.toString) else Ok("NoUser")

    case Failure(t) => Ok("Failure!!")

  }

}


테스트... 해보면 의도했던 화면들이 나온다.... 


마지막으로, 


에러처리를 위해 failed 를 쓰라고 했는데... 이건 어떻게 쓰는지 다음에 찾아봐야겠다.










블로그 이미지

캡틴토마스

그저 걷고 있는거지...

,