Scala/Play framework 11

Let's Encrypt로 인증서 발급받고 적용하기

https는 추가적인 암호화 과정이 필요해 메모리를 더 사용하고 페이지 로딩이 느려지는 경향이 있다. 그럼에도 이제 대부분의 사이트는 https를 사용한다. https에 사용되는 인증서는 SSL 인증서를 구매해야 하는데, 이전 검색해 보았을 때 COMODO의 가장 싼 인증서가 1년에 3만원이었던 것 같다. 비싼 가격은 아니지만 결제해야 된다는 것 자체가 부담스럽다. 그런 인증서를 Let's Encrypt를 통해 무료로 발급받아 사용할 수 있다. 물론 이런저런 제한과 90일마다 갱신해야한다는 귀찮은 점은 감수해야 한다. Play framework에서 Let's Encrpy로 발급받은 인증서를 적용하려면 몇 가지 과정이 필요하다. 이전 Netty 서버에 적용할때도 한참 고생했던 기억이 있다. 발급받는 곳마다..

Play Framework 2.5. Http 서비스 호출을 위한 WSClient

AJAX의 크로스도메인 제약을 넘어서기 위해 CORS가 제시되었지만 여러 이유로 아직까지 서버에서 다른 서버로 요청하고 그 결과를 클라이언트에게 전달하는 방법을 주로 구현한다. 그 구현에 사용되는 라이브러리도 다양한데, JSOUP같은 범용적인 라이브러리도 있지만 Spring에서 주로 RestTemplate를 사용해 Java Bean으로 결과를 매핑해 사용한다.Play Framework에서는 JSOUP와 유사한 WSClient를 사용하는 것을 권장하고 있다. 1. 기본WSClient를 사용하려면 먼저 디펜전시를 추가해야 한다.libraryDependencies ++= Seq(ws) 디펜전시를 추가하면 WSClient 객체를 주입 받아 바로 사용 할 수 있다.import play.api.mvc._ impor..

Play Framework 2.5. Action을 위한 Results Object

Play Framework의 컨트롤러의 함수는 RequestHeader를 입력받아 Result를 반환하는 함수인 Action을 전달받는다. 반환하는 Result는 Spring의 ResponseEntity 클래스의 객체와 마찬가지로 HttpStatus 코드를 담고있는 객체다. Play Framework에서는 Results Object에 구현되어 있는 함수를 이용하거나 직접 Result 객체를 만들 수 있다. Results Object에서 자주 사용되는 함수는 아래와 같다. Results 함수 Status내용 OK 200정상 BadRequest 400 잘못된 요청 Unauthorized 401 권한이 없음 Forbidden 403 요청 거부됨 NotFound 404 서버에 없는 페이지 InternalServ..

Play Framework 2.5. Json 변환

어노테이션으로 객체를 간편하게 Json 문자열로 바꿀 수 있는 Spring과 달리 Play Framework는 객체를 Json으로 바꾸는 암시적 함수를 구현해 두어야한다. 1. 기본먼저 Play Framework에서 사용되는 관련 구현체들을 이해할 필요가 있다. 1) JsValueJson 값을 위한 Trait이다. JsValue는 암시적으로 선언된 Writeable 클래스를 통해 String으로 변환되므로 Action에서 Results.Ok(jsValue)와 같이 반환 할 수 있다. JsValue는 Json을 표현하기 위한 다양한 하위 자료형을 가지는데, JsValue를 상속해 구현된 타입은 아래와 같다. JsObject "Key" -> "JsValue"를 가지고 있는 Map. JsArray Json에서..

Play Framework 2.5. Built-in Filters, CSRF Filter, Custom Filter

Filter는 특정 URL에 영향을 미치는 Action과 달리 Gzip을 이용한 HTTP 압축이나 로깅, 보안 헤더 등 사이트 전체에 필요한 요소를 정의한다. 공식 문서에서는 모든 경로에 필요한 작업이 아니라면 ActionBuilder를 이용해 만든 Action을 사용하는 것이 더 좋다고 소개하고 있다. 0. Dependency 추가filter를 사용하려면 build.sbt 파일의 libraryDependencies 항목에 filters를 추가해야 한다. 1. Built-in Http FiltersPlay Framework는 4개의 필터를 기본으로 제공한다. 기본으로 제공되는 필터들은 DefaultHttpFilters 클래스를 상속받은 필터 클래스에 주입 받아 DefaultHttpFilters 클래스의 ..

Play Framework 2.5. Action, Security Object (로그인/보안)

대부분의 웹 사이트에는 인증된 유저만 사용 가능한 '보안' 기능을 구현한다. Spring Framework에서는 AOP를 기반으로 한 Spring Security을 통해 보안뿐 아니라 다양한 기능을 지원한다. Play Framework는 Spring Security같은 자체 라이브러리는 없지만 Security Object나 ActionBuilder를 이용해 간단하게 구현할 수 있다. 하지만 session이나 header의 토큰 인증을 넘어 더 다양한 기능이나 Spring Security에서처럼 URL(routes)에 기반한 인증이 필요하다면 Deadbolt2같은 외부 라이브러리를 쓰는 것을 고려해야 한다. 1. Controller의 Action먼저 컨트롤러에서 사용되는 Action Object에 대해 알..

Play Framework 2.5. Actor 만들고 주입하기, 스케쥴링

Play Framework를 쓰는 이유 중 하나는 Akka Actor를 사용하기 위해서일 것이다. 물론 Spring에서도 쓸 수는 있지만 어플리케이션 생명 주기를 따르는 내부적인 Actor System을 기본적으로 가지고 있다는 것은 큰 장점이다. 덕분에, Akka Actor Depengency를 따로 추가할 필요도 없다. Play Framework에서 Actor를 만드는 방법은 크게 두 가지가 있다. ActorSystem을 주입받아 액터를 만들고 사용하는 방법과 AkkaGuiceSupport를 구현한 모듈을 통해 싱글톤 액터를 만드는 방법이다. 예제를 위해 간단한 액터 클래스를 정의해 두자.import akka.actor._ case object PING case object PONG class Pin..

Play Framework 2.5. Singleton과 Inject

Play Framework는 2.0 버전부터 @Singleton과 @Inject 어노테이션을 기반으로 한 DI가 추가되었다. Spring과 다르게 Play Framework에서는 DI가 강제적인 요소가 아니다. 하지만 싱글톤 패턴은 객체간의 결합성을 떨어뜨리고 테스트를 용이하게 하기 때문에 대부분의 경우 유용하게 사용할 수 있다. 1. 기본적인 사용@Singleton 어노테이션을 이용해 간단하게 싱글톤 클래스를 설정한다.import javax.inject.{Named, Singleton}@Singleton @Named("s1") // Spring의 Qualifier와 같은 역할 class Something{ val message = "hello" } @Inject 어노테이션을 이용해 객체를 주입한다.im..

Play Framework 2.5 + Play Slick 2.1.0. 외래 키, 조인

외래키를 작성하고 조인해 결과를 얻어내 보자. 1. Foreign Key 함수 작성외래 키를 가진 테이블을 만들기 위해서는 기본 값 테이블의 테이블쿼리가 필요하다. 코드를 보면 이해하기 쉽다.case class Article(articleSeq: Long, userSeq: Long, title: String, createDate: Timestamp) class ArticleTable(tag: Tag) extends Table[Article](tag, "ARTICLE") { def articleSeq = column[Long]("article_seq", O.PrimaryKey, O.AutoInc) def userSeq = column[Long]("user_seq") def title = column[Str..

Play Framework 2.5 + Play Slick 2.1.0. 연동, 기본적인 쿼리

Slick은 ORM이 아닌 FRM이라고 부른다. 객체 그래프를 탐색하는 방식이 아니라 함수형 프로그래밍에서 친숙한 map이나 filter같은 고차함수로 쿼리하기 때문이다. (실제로는 고차함수를 SQL문으로 변경시켜 쿼리해준다) 그래서 ORM 프레임워크들과는 색다른 사용감을 느낄 수 있다. 하지만 테이블의 연관관계를 설정해 놓는 것이 아니라 기존 SQL문처럼 조인 구문을 사용해야 하기 때문에 때론 ORM보다 불편함을 느낀다. 자바로 만들어진 인메모리 DB H2와 Play Framework 2.5.13, Play Slick 2.1.0 버전을 이용해 테이블 작성과 기본적인 쿼리 몇가지를 해보자. 1. libraryDependency 추가Play framework에서 사용되는 Slick은 Play Slick이라..