플레이 프레임워크
1. 개요
플레이 프레임워크는 Zengularity SA의 기욤 보르에 의해 개발된 오픈 소스 웹 애플리케이션 프레임워크이다. 루비 온 레일스와 장고의 영향을 받아 Java 환경에서 동작하며, REST 기반의 무상태 프로토콜, 통합 유닛 테스트, 비동기 I/O, 모듈형 아키텍처 등의 특징을 가진다. 2007년 초기 릴리스 이후, 2021년 Lightbend의 개발 철수 및 2023년 3.0 버전 출시까지 다양한 버전으로 발전해왔으며, Akka에서 포크된 Apache Pekko를 사용한다. 깃허브에서 스칼라 프로젝트 중 높은 인기를 얻었으며, Coursera, LinkedIn 등 다양한 기업에서 사용되고 있다.
| 이름 | Play Framework |
|---|---|
| 종류 | 웹 애플리케이션 프레임워크 |
| 개발 시작 | 2007년 |
| 라이선스 | 아파치 라이선스 2.0 |
| 웹사이트 | Play Framework 공식 웹사이트 |
| 깃허브 저장소 | Play 저장소 |
| 개발자 | 커뮤니티 (2021년 10월 20일까지 Lightbend) |
|---|---|
| 프로그래밍 언어 | 스칼라 |
| 버전 | 3.0.0 |
|---|---|
| 날짜 | 2023년 10월 25일 |
-
스칼라로 작성된 자유 소프트웨어 -
스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다. -
스칼라로 작성된 자유 소프트웨어 -
아파치 스파크
아파치 스파크는 대규모 데이터 처리를 위한 오픈 소스 분산 처리 시스템으로, 빠른 속도와 다양한 API 지원을 통해 빅데이터 분석, 머신 러닝, 스트리밍 처리 등 여러 분야에서 활용되며 아파치 소프트웨어 재단의 핵심 프로젝트 중 하나이다. -
자바 플랫폼 -
블루레이
블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다. -
자바 플랫폼 -
자바 플랫폼, 마이크로 에디션
자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다. -
아파치 라이선스 소프트웨어 -
안드로이드 (운영체제)
구글이 개발한 리눅스 커널 기반의 모바일 운영체제인 안드로이드는 오픈소스 플랫폼으로 다양한 기기에서 활용되며 세계적으로 널리 사용되지만, 개인정보 보호 문제와 독점적 지위 남용 논란 등의 비판도 존재한다. -
아파치 라이선스 소프트웨어 -
쿠버네티스
쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링, 관리하는 오픈 소스 시스템으로, 구글의 Borg 시스템에서 영감을 받아 설계되었으며 파드, 서비스 등의 기능을 제공하여 클라우드 네이티브 환경에서 중요한 역할을 한다.
2. 역사
Play 프레임워크는 버전 1.x에서 2.x를 거쳐 3.x에 이르기까지 큰 변화를 겪었다. 각 버전별 주요 변경 사항은 다음과 같다.
| 버전 | 날짜 | 비고 |
|---|---|---|
| 1.3 | 2015년 1월 15일 | 라이브러리 업그레이드 (Netty, Hibernate 등), 다중 데이터베이스 지원 추가, 사용자 정의 가능한 템플릿 이름 확인 기능 포함. |
| 1.4 | 2015년 10월 30일 | Java 7 호환, Java 6 지원 제거, 활성화된 SSL 프로토콜 정의 기능 추가. |
| 1.5 | 2017년 9월 29일 | Hibernate 5.x로 업그레이드, Java 8 이전 버전 지원 중단. |
| 1.6 | 2021년 3월 15일 | Java 14 호환, 라이브러리 업그레이드. |
| 1.7 | 2022년 4월 3일 | Java 17 호환, 라이브러리 업그레이드, Java 11 이전 버전 지원 중단, Play 스크립트 Python 3으로 업그레이드. |
| 2.0 | 2012년 3월 13일 | 사데크 드로비(Sadek Drobi)가 Typesafe Stack 2.0과 함께 Play 2.0을 만들기 위해 기욤 보르에 합류. |
| 2.1 | 2013년 2월 6일 | Scala 2.10으로 업그레이드, 모듈화, 새로운 JSON API, 필터 및 RequireJS 지원 등 새로운 기능 도입. |
| 2.2 | 2013년 9월 20일 | SBT 지원 0.13으로 업그레이드, 버퍼링 개선, gzip 기본 지원, OS X (DMG), Linux (RPM, DEB), Windows (MSI) 및 zip 파일 등 여러 플랫폼에서 네이티브 패키징 지원하는 새로운 `stage` 및 `dist` 작업 추가. |
| 2.3 | 2014년 5월 30일 | Activator 명령 도입, 정적 자산 툴링 개선, Java 8 및 Scala 2.11 지원, 성능 향상, 웹 서비스 향상, 액터 및 웹 소켓 통합 지원. |
| 2.4 | 2015년 5월 26일 | 의존성 주입 즉시 사용 가능, Play를 다른 애플리케이션 내부에 포함 가능, Java 8 지원 향상, 기본 연결 풀로 HikariCP 사용, 테스트 API 개선. |
| 2.5 | 2016년 3월 29일 | Iteratees에서 Akka Streams로 전환 (모든 비동기 IO 및 스트리밍), 사용자 지정 기능 유형을 Java 8 유형(예: `CompletionStage` 및 `Optional`)으로 대체, 필터 및 사용자 지정 본문 파서 구현 등 이전 Scala API에만 존재했던 기능에 대한 동등한 Java API 도입, 20% 성능 향상. |
| 2.6 | 2017년 6월 23일 | 기본 서버 백엔드로 Akka HTTP 사용, 실험적 HTTP/2 지원, Scala 2.12 지원, 내부적으로 전역 상태 제거, 쿠키에 대한 JSON Web Token 형식, 보안 및 구성 개선. |
| 2.7 | 2019년 2월 1일 | Scala 2.13 지원, 기본 캐시 구현으로 Caffeine 지원, HikariCP 및 Guice 버전 업데이트, 양식 유효성 검사 및 파일 업로드 기능 개선. |
| 2.8 | 2019년 12월 13일 | Java 11 지원, Akka, Jackson 업데이트, 범위 결과에 대한 사전 검색 소스 지원 |
| 2.9 | 2023년 10월 25일 | Scala 3, Java 17 및 Java 21 지원. |
| 3.0 | 2023년 10월 25일 | Akka가 더 이상 오픈 소스가 아니기 때문에 Play는 Akka에서 Apache Pekko로 전환. |
2.1. 초기 개발 및 릴리스 (2007년 ~ 2010년)
Play 프레임워크는 젠귤래리티(Zengularity SA, 이전의 Zenexity)에서 근무하던 소프트웨어 개발자 기욤 보르(Guillaume Bort)가 만들었다. 초기 릴리스는 현재 온라인에서 사용할 수 없지만, 2007년 5월까지 Play가 존재했다는 증거가 있다. 2007년에는 프로젝트의 사전 릴리스 버전을 Zenexity 웹사이트에서 다운로드할 수 있었다.
| 버전 | 날짜 | 비고 |
|---|---|---|
| 1.0 | 2008년 5월 | 1.0의 최초 공개 코드는 Launchpad에 공개되었다. 이후 2009년 10월에 1.0 정식 버전이 출시되었다. |
| 1.1 | 2010년 11월 | Launchpad에서 GitHub로 이전 후 릴리스되었다. Apache MINA에서 JBoss Netty로 마이그레이션, Scala 지원, 기본 GlassFish 컨테이너, 비동기 웹 서비스 라이브러리, OAuth 지원, HTTPS 지원 등이 추가되었다. |
| 1.2 | 2011년 4월 | Apache Ivy를 사용한 의존성 관리, WebSocket 지원, 통합 데이터베이스 마이그레이션 (되돌리기 미구현), 기본 개발 데이터베이스로 H2 데이터베이스 전환 등이 이루어졌다. |
2.2. GitHub 이전 및 Play 1.x 발전 (2010년 ~ 2015년)
Play는 2007년 기욤 보르(Guillaume Bort)에 의해 만들어졌다. 2008년 5월, Launchpad에 1.0 버전의 초기 공개 코드가 공개되었고, 2009년 10월에 1.0 정식 버전이 출시되었다.
2010년 11월, Launchpad에서 GitHub로 이전한 후 Play 1.1이 출시되었다. 이 버전에서는 Apache MINA에서 JBoss Netty로 마이그레이션되었고, Scala 지원, 기본 GlassFish 컨테이너, 비동기 웹 서비스 라이브러리, OAuth 지원, HTTPS 지원 등이 추가되었다.
2011년 4월에는 Play 1.2가 출시되었다. 이 버전에서는 Apache Ivy를 사용한 의존성 관리, WebSocket 지원, 통합된 데이터베이스 마이그레이션 (되돌리기 미구현), 기본 개발 데이터베이스로 H2 데이터베이스로 전환 등이 이루어졌다.
이후 Play 1.x 버전의 발전은 다음과 같다.
| 버전 | 날짜 | 비고 |
|---|---|---|
| 1.3 | 2015년 1월 15일 | 라이브러리 업그레이드 (netty, hibernate 등), 다중 데이터베이스 지원, 사용자 정의 가능한 템플릿 이름 확인 기능 |
| 1.4 | 2015년 10월 30일 | Java 7 호환, Java 6 지원 제거, 활성화된 ssl 프로토콜 정의 기능 |
| 1.5 | 2017년 9월 29일 | Hibernate 5.x로 업그레이드, Java 8 이전 버전 지원 중단 |
| 1.6 | 2021년 3월 15일 | Java 14 호환, 라이브러리 업그레이드 |
| 1.7 | 2022년 4월 3일 | Java 17 호환, 라이브러리 업그레이드, Java 11 이전 버전 지원 중단, Play 스크립트 Python 3으로 업그레이드 |
2.3. Play 2.x의 등장과 발전 (2012년 ~ 2019년)
2011년 후반, 사데크 드로비(Sadek Drobi)가 Play 2.0 개발을 위해 기욤 보르에게 합류했다. 2012년 3월 13일, Typesafe Stack 2.0과 함께 Play 2.0이 출시되었다.
2013년 2월 6일에 출시된 Play 2.1에서는 Scala 2.10으로 업그레이드되었으며, 모듈화, 새로운 JSON API, 필터 및 RequireJS 지원과 같은 새로운 기능이 도입되었다.
2013년 9월 20일에 출시된 Play 2.2에서는 SBT 지원이 0.13으로 업그레이드되었고, 버퍼링에 대한 더 나은 지원, gzip에 대한 기본 지원, OS X (DMG), Linux (RPM, DEB), Windows (MSI) 및 zip 파일과 같은 여러 플랫폼에서 네이티브 패키징을 지원하는 새로운 `stage` 및 `dist` 작업이 추가되었다.
2014년 5월 30일 출시된 Play 2.3에서는 Activator 명령 도입, 정적 자산에 대한 더 나은 툴링, Java 8 및 Scala 2.11 지원, 성능 향상, 웹 서비스 향상 및 액터와 웹 소켓 통합 지원이 이루어졌다.
2015년 5월 26일 출시된 Play 2.4에서는 의존성 주입을 즉시 사용할 수 있으며, Play를 다른 애플리케이션 내부에 포함할 수 있는 가능성, 향상된 Java 8 지원, 기본 연결 풀로 HikariCP 사용, 테스트 API 개선이 이루어졌다.
2016년 3월 29일 출시된 Play 2.5에서는 모든 비동기 IO 및 스트리밍을 위해 Iteratees에서 Akka Streams로 전환하고, 사용자 지정 기능 유형을 Java 8 유형(예: `CompletionStage` 및 `Optional`)으로 대체했으며, 필터 및 사용자 지정 본문 파서 구현과 같이 이전에 Scala API에만 존재했던 기능에 대한 동등한 Java API를 도입했으며, 20%의 성능 향상을 보였다.
2017년 6월 23일 출시된 Play 2.6에서는 기본 서버 백엔드로 Akka HTTP 사용, 실험적 HTTP/2 지원, Scala 2.12 지원, 더 이상 내부적으로 전역 상태 없음, 쿠키에 대한 JSON Web Token 형식, 보안 개선 및 구성 개선이 이루어졌다.
2019년 2월 1일 출시된 Play 2.7에서는 Scala 2.13 지원, 기본 캐시 구현으로 Caffeine 지원, HikariCP 및 Guice 버전 업데이트, 양식 유효성 검사 및 파일 업로드 기능 개선이 이루어졌다.
2019년 12월 13일 출시된 Play 2.8에서는 Java 11 지원, Akka, Jackson 업데이트, 범위 결과에 대한 사전 검색 소스 지원이 이루어졌다.
2.4. Lightbend의 개발 철수 및 Play 3.x (2021년 ~ 현재)
2021년 10월 20일, Lightbend는 플레이 프레임워크 개발에서 철수한다고 발표했다.
2023년 10월 25일, 플레이 프레임워크 3.0.0이 릴리스되었다. 플레이 프레임워크는 2.x까지 Lightbend가 개발하던 Akka를 사용했지만, Akka가 2022년 9월부터 오픈 소스가 아니게 됨에 따라, Akka에서 포크된 오픈 소스인 Apache Pekko로 전환되었다.
3. 특징
ASP.NET MVC, Ruby on Rails, Django에 큰 영향을 받아 이 계열의 프레임워크와 유사하다. Play 웹 애플리케이션은 Java 또는 Scala로 작성할 수 있으며, 자바 엔터프라이즈 에디션 중심 환경보다 덜 제약적인 환경에서 개발할 수 있다. Play는 자바 EE 제약을 사용하지 않아 다른 자바 중심 플랫폼에 비해 더 간단하게 개발할 수 있다.
Play 1.x는 표준 자바 EE 애플리케이션 서버에 배포하기 위해 WAR 파일로 패키징할 수도 있었지만, Play 2.x 애플리케이션은 내장된 Akka HTTP 또는 Netty 웹 서버를 독점적으로 사용하여 실행하도록 설계되었다.
다른 자바 프레임워크와 비교하면 다음과 같은 특징을 가진다.
* 무상태: 플레이 2는 완전한 REST 기반이다. 즉, 연결당 자바 EE 세션이 없다.
* 통합 유닛 테스트: JUnit 및 셀레늄 지원이 코어에 포함되어 있다.
* API는 대부분의 필수 요소를 내장하고 제공된다.
* 비동기 I/O: Akka HTTP를 웹 서버로 사용하기 때문에, 플레이는 서블릿 3.0에서 제공하는 비동기 지원을 사용하지 않는 자바 EE 프레임워크처럼 HTTP 스레드를 비즈니스 로직에 묶어두는 대신, 비동기적으로 긴 요청을 처리할 수 있다.
* 모듈형 아키텍처: 루비 온 레일즈 및 장고와 마찬가지로, 플레이는 모듈 개념을 가지고 있다.
* 네이티브 스칼라 지원: 플레이 2는 내부적으로 스칼라를 사용하지만, 스칼라 API와 자바 관례에 맞게 의도적으로 약간 다르게 설계된 자바 API를 모두 제공하며, 자바와 완벽하게 상호 운용 가능하다.
* 정적 메서드: 컨트롤러의 모든 시작점은 static(Scala의 경우 function)으로 선언한다. 단, Play 2.1 이후부터는 이 외의 형식도 지원된다.
* 비동기 입출력: 웹 서버로 Netty를 사용하기 때문에 Play는 비동기적으로 큰 요청을 처리할 수 있다. 이로 인해 HTTP 스레드 수 이상의 처리를 실행할 수 있다. Jakarta EE에서는 Servlet 3.0까지 이러한 비동기 처리가 지원되지 않았다.
Play는 Scala 및 Java 애플리케이션 모두에 대한 단위 테스트 및 기능 테스트를 위한 테스트 프레임워크와의 통합을 제공한다. Scala의 경우 Scalatest 및 Specs2와의 통합이 즉시 제공되며, Java의 경우 JUnit 4와의 통합이 제공된다. 두 언어 모두 Selenium (소프트웨어)와의 통합도 제공된다. SBT는 테스트를 실행하고 보고서를 생성하는 데 사용된다. 또한 [https://github.com/scoverage/sbt-scoverage scoverage] 또는 [https://github.com/sbt/jacoco4sbt jacoco4sbt]와 같은 sbt 플러그인을 사용하여 코드 커버리지 도구를 사용할 수도 있다.
Play Framework는 루비 온 레일스와 장고 (웹 프레임워크)로부터 큰 영향을 받은, 이들과 유사한 종류의 프레임워크이다. Play의 웹 애플리케이션은 Java 환경에서 동작하지만, Java 표준의 웹 애플리케이션 사양인 자카르타 EE의 핵심 기능은 필요로 하지 않는다. Play는 자카르타 EE의 사양에 준거하지 않지만, 그 대신 자카르타 EE 준거 플랫폼과 비교하여 간단하게 개발을 수행할 수 있다。
Play Framework의 애플리케이션은 내장된 Netty (software)영어 웹 서버를 사용하여 실행하도록 설계되었다. 그러나 개발한 애플리케이션을 WAR 패키지로 묶어, 자카르타 EE의 애플리케이션 서버에서 동작시키는 것도 가능하다。
4. 구성 요소
플레이 프레임워크 2.0은 다음과 같은 자바 라이브러리들을 사용한다.
* Netty: 웹 서버
* Anorm (스칼라), Ebean (자바): 데이터베이스 접근. (단, O/R 매핑은 필수가 아님)
* 스칼라: 템플릿 엔진
* 내장 핫 리로딩
* sbt: 의존성 관리
플레이 프레임워크는 다음과 같은 기능을 포함한다.
* REST 프레임워크.
* CRUD: 모델 객체를 간단하게 업데이트하기 위한 모듈.
* Secure: 단순한 사용자 인증을 실현하는 모듈.
* 애노테이션 기반 유효성 검사 프레임워크.
* 작업 스케줄러.
* 간단하게 사용할 수 있는 SMTP 메일러.
* JSON 및 XML 파싱.
* JPA 기반 영속화 계층.
* 빠른 배포/테스트를 위한 내장 DB.
* 완벽하게 내장된 테스팅 프레임워크.
* 자동 파일 업로드 기능.
* 다중 환경 설정을 위한 기능.
* 기능을 쉽게 추가하기 위한 모듈식 구조.
* OpenID 및 웹 서비스 클라이언트.
5. 도입 사례
2011년 8월, 헤로쿠(Heroku)는 자사의 클라우드 컴퓨팅 플랫폼에서 플레이 애플리케이션에 대한 네이티브 지원을 발표했다. 이는 구글 앱 엔진에서 플레이 1.0에 대한 모듈 기반 지원과 아마존 웹 서비스에 대한 문서화된 지원에 이은 것이었다.
2013년 10월, 플레이 프레임워크는 깃허브에서 가장 인기 있는 스칼라 프로젝트였다.
2015년 7월, 플레이는 64,562개의 라이브러리를 기준으로 깃허브에서 3번째로 인기 있는 스칼라 라이브러리였다. 상위 스칼라 프로젝트의 21.3%가 플레이를 프레임워크로 선택했다.
플레이 프레임워크의 기업 사용자는 다음과 같다.
Play Framework 메일링 리스트에는 9,000명이 넘는 구독자가 등록되어 있다. Play는 지방 정부나 기업의 인트라넷, 모바일 웹사이트, 그리고 OSS와 같은 폭넓은 프로젝트에서 사용되고 있다.
2013년 10월, 플레이 프레임워크는 GitHub에서 가장 인기 있는 Scala 프로젝트였다.
또한, 몇몇 유명한 웹사이트가 플레이 프레임워크를 사용하고 있음을 밝히고 있다.
2013년 7월에는 클라우드 컴퓨팅 플랫폼인 젤라스틱(Jelastic)도 Play 2를 해당 환경에서 사용하기 위한 튜토리얼을 공개했다.