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 를 쓰라고 했는데... 이건 어떻게 쓰는지 다음에 찾아봐야겠다.
'프로그래밍 > Scala' 카테고리의 다른 글
[Slick] DateTime 로딩 시 오류. (0) | 2020.04.05 |
---|---|
Scala 로 뭔가 만들기 위해 필요한 것. (0) | 2020.03.18 |
akka 초반 간략정리. (0) | 2020.02.09 |
Typing Rules for Functions (0) | 2020.02.02 |
Covariant, Contravariant 그림으로 다시 정리 (0) | 2020.02.02 |
Covariant, Contravariant 정리 (0) | 2020.02.02 |
scala implicit keyword 관련 - 파라미터 (0) | 2019.11.17 |
[스칼라] 커링(Currying) - 아마도 첫번째 글. (0) | 2017.02.26 |