1. 개요
이 소개 사용방법(예제)의 목적은 Play 프레임워크를 탐색하고 이를 사용하여 웹 애플리케이션을 만드는 방법을 파악하는 것입니다.
Play는 주로 Java 및 Scala와 같은 JVM에서 코드가 컴파일되고 실행되는 프로그래밍 언어를 위한 생산성이 높은 웹 애플리케이션 프레임워크입니다. 최신 웹 애플리케이션 개발에 필요한 구성 요소와 API를 통합합니다.
2. 플레이 프레임워크 설정
Play 프레임워크의 공식 페이지 로 이동 하여 최신 버전의 배포판을 다운로드해 보겠습니다. 이 예제 당시 최신 버전은 2.7입니다.
Play Java Hello World 사용방법(예제) zip 폴더를 다운로드하고 편리한 위치에 파일의 압축을 풉니다. 이 폴더의 루트 에서 응용 프로그램을 실행하는 데 사용할 수 있는 sbt 실행 파일을 찾을 수 있습니다. 또는 공식 페이지 에서 sbt 를 설치할 수 있습니다 .
다운로드한 폴더에서 sbt 를 사용하려면 다음을 수행하십시오.
cd /path/to/folder/
./sbt run
현재 디렉토리에서 스크립트를 실행하고 있으므로 ./ 구문을 사용합니다.
sbt 를 설치 하면 대신 사용할 수 있습니다.
cd /path/to/folder/
sbt run
이 명령을 실행하면 "(서버가 시작되었습니다. Enter를 사용하여 중지하고 콘솔로 돌아가십시오...)"라는 명령문이 표시됩니다. 이는 애플리케이션이 준비되었음을 의미하므로 이제 http://localhost:9000 으로 이동하여 Play 시작 페이지가 표시될 수 있습니다.
3. 플레이 애플리케이션 분석
이 섹션에서는 Play 애플리케이션의 구조와 해당 구조의 각 파일 및 디렉토리가 사용되는 방식을 더 잘 이해할 수 있습니다.
바로 간단한 예제에 도전하고 싶다면 다음 섹션으로 건너뛰십시오.
일반적인 Play Framework 애플리케이션에서 찾을 수 있는 파일 및 폴더는 다음과 같습니다.
├── app → Application sources
│ ├── assets → Compiled Asset sources
│ │ ├── javascripts → Typically Coffee Script sources
│ │ └── stylesheets → Typically LESS CSS sources
│ ├── controllers → Application controllers
│ ├── models → Application business layer
│ └── views → Templates
├── build.sbt → Application build script
├── conf → Configurations files and other non-compiled resources (on classpath)
│ ├── application.conf → Main configuration file
│ └── routes → Routes definition
├── dist → Arbitrary files to be included in your projects distribution
├── lib → Unmanaged libraries dependencies
├── logs → Logs folder
│ └── application.log → Default log file
├── project → sbt configuration files
│ ├── build.properties → Marker for sbt project
│ └── plugins.sbt → sbt plugins including the declaration for Play itself
├── public → Public assets
│ ├── images → Image files
│ ├── javascripts → Javascript files
│ └── stylesheets → CSS files
├── target → Generated files
│ ├── resolution-cache → Information about dependencies
│ ├── scala-2.11
│ │ ├── api → Generated API docs
│ │ ├── classes → Compiled class files
│ │ ├── routes → Sources generated from routes
│ │ └── twirl → Sources generated from templates
│ ├── universal → Application packaging
│ └── web → Compiled web assets
└── test → source folder for unit or functional tests
3.1. 앱 디렉토리 _
이 디렉토리에는 Java 소스 코드, 웹 템플릿 및 컴파일된 자산 소스(기본적으로 모든 소스 및 모든 실행 가능한 리소스)가 포함되어 있습니다.
앱 디렉토리에는 몇 가지 중요한 하위 디렉토리가 포함되어 있으며 각 하위 디렉토리 는 MVC 아키텍처 패턴의 한 부분을 패키징합니다.
- 모델 – 이것은 애플리케이션 비즈니스 계층입니다. 이 패키지의 파일은 아마도 데이터베이스 테이블을 모델링하고 지속성 계층에 액세스할 수 있도록 합니다.
- views – 브라우저에 렌더링할 수 있는 모든 HTML 템플릿이 이 폴더에 포함됩니다.
- 컨트롤러 – 컨트롤러가 있는 하위 디렉토리. 컨트롤러 는 각 API 호출에 대해 실행할 작업이 포함된 Java 소스 파일입니다. 액션 은 HTTP 요청을 처리하고 HTTP 응답과 동일한 결과를 반환하는 공개 메서드입니다.
- 자산 – CSS 및 javascript와 같은 컴파일된 자산이 포함된 하위 디렉토리입니다. 위의 명명 규칙은 유연하며 app/utils 패키지와 같은 패키지를 만들 수 있습니다 . 패키지 이름 app/com/baeldung/controllers 를 사용자 정의할 수도 있습니다.
또한 특정 응용 프로그램에서 필요로 하는 선택적 파일과 디렉터리도 포함합니다.
3.2. 공개 디렉토리 _
공용 디렉터리 에 저장된 리소스 는 웹 서버에서 직접 제공하는 정적 자산입니다.
이 디렉토리에는 일반적으로 이미지, CSS 및 JavaScript 파일에 대한 세 개의 하위 디렉토리가 있습니다. 모든 Play 애플리케이션의 일관성을 위해 이와 같이 자산 파일을 구성하는 것이 좋습니다.
3.3. conf 디렉토리 _
conf 디렉토리에는 애플리케이션 구성 파일이 포함되어 있습니다 . application.conf 는 Play 애플리케이션에 대한 대부분의 구성 속성을 저장하는 곳입니다 . route 에서 앱의 엔드포인트를 정의합니다 .
응용 프로그램에 추가 구성 파일이 필요한 경우 이 디렉터리에 넣어야 합니다.
3.4. lib 디렉토리 _
lib 디렉터리는 선택 사항 이며 관리되지 않는 라이브러리 의존성을 포함합니다. 빌드 시스템에 지정되지 않은 jar가 있으면 이 디렉토리에 넣습니다. 애플리케이션 클래스 경로에 자동으로 추가됩니다.
3.5. build.sbt 파일 _
build.sbt 파일 은 애플리케이션 빌드 스크립트입니다. 테스트 및 지속성 라이브러리와 같이 애플리케이션을 실행하는 데 필요한 의존성을 나열하는 곳입니다.
3.6. 프로젝트 디렉토리 _
SBT를 기반으로 빌드 프로세스를 구성하는 모든 파일은 프로젝트 디렉토리에 있습니다.
3.7. 대상 디렉토리 _
이 디렉토리에는 빌드 시스템에서 생성된 모든 파일(예: 모든 .class 파일)이 포함됩니다.
방금 다운로드한 Play Framework Hello World 예제의 디렉토리 구조를 보고 탐색했으므로 이제 예제를 사용하여 프레임워크의 기본 사항을 살펴볼 수 있습니다.
4. 간단한 예
이 섹션에서는 웹 애플리케이션의 매우 기본적인 예제를 생성합니다. 이 애플리케이션을 사용하여 Play 프레임워크의 기본 사항에 익숙해질 것입니다.
예제 프로젝트를 다운로드하고 빌드하는 대신 sbt new 명령 을 사용하여 Play Framework 애플리케이션을 만들 수 있는 다른 방법을 살펴보겠습니다 .
명령 프롬프트를 열고 선택한 위치로 이동한 후 다음 명령을 실행합니다.
sbt new playframework/play-java-seed.g8
이를 위해서는 섹션 2 에서 설명한 대로 이미 sbt 를 설치해야 합니다 .
위의 명령은 먼저 프로젝트 이름을 묻는 메시지를 표시합니다. 다음으로 패키지에 사용될 도메인(역순으로 Java의 패키지 명명 규칙)을 묻습니다. 대괄호 안에 주어진 기본값을 유지하려면 이름을 입력하지 않고 Enter 키 를 누릅니다 .
이 명령으로 생성된 응용 프로그램은 이전에 생성된 응용 프로그램과 동일한 구조를 갖습니다. 따라서 이전과 마찬가지로 애플리케이션을 계속 실행할 수 있습니다.
cd /path/to/folder/
sbt run
위의 명령은 실행 완료 후 포트 번호 9000 에서 서버를 생성하여 API를 노출 하며 http://localhost:9000 을 통해 액세스할 수 있습니다 . 브라우저에 "Welcome to Play" 메시지가 표시되어야 합니다.
새 API에는 이제 브라우저에서 차례로 시도할 수 있는 두 개의 엔드포인트가 있습니다. 방금 로드한 첫 번째 항목은 "Welcome to Play!"가 포함된 인덱스 페이지를 로드하는 루트 엔드포인트입니다. 메세지.
두 번째는 http://localhost:9000/assets에 있으며 파일 이름을 경로에 추가하여 서버에서 파일을 다운로드하기 위한 것입니다. http://localhost:9000/assets/images/favicon.png 에서 애플리케이션과 함께 다운로드한 favicon.png 파일 을 가져와서 이 엔드포인트를 테스트할 수 있습니다 .
5. 액션과 컨트롤러
요청 매개 변수를 처리하고 클라이언트에 보낼 결과를 생성하는 컨트롤러 클래스 내부의 Java 메서드를 작업이라고 합니다.
컨트롤러는 클라이언트에 대해 생성하는 결과와 관련될 수 있는 작업을 논리적으로 함께 그룹화하는 play.mvc.Controller 를 확장하는 Java 클래스입니다 .
이제 app-parent-dir/app/controllers 로 이동하여 HomeController.java 에 주목해 보겠습니다 .
HomeController 의 색인 작업은 간단한 환영 메시지가 있는 웹 페이지를 반환합니다.
public Result index() {
return ok(views.html.index.render());
}
이 웹 페이지는 보기 패키지 의 기본 색인 템플릿입니다.
@main("Welcome to Play") {
<h1>Welcome to Play!</h1>
}
위와 같이 인덱스 페이지는 메인 템플릿을 호출합니다. 그런 다음 기본 템플릿은 페이지 헤더 및 본문 태그의 렌더링을 처리합니다. 페이지 제목에 대한 문자열 과 페이지 본문에 삽입할 Html 개체의 두 가지 인수 를 사용합니다.
@(title: String)(content: Html)
<!DOCTYPE html>
<html lang="en">
<head>
@* Here's where we render the page title `String`. *@
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
</head>
<body>
@* And here's where we render the `Html` object containing
* the page content. *@
@content
<script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script>
</body>
</html>
인덱스 파일 의 텍스트를 약간 변경해 보겠습니다 .
@main("Welcome to Baeldung") {
<h1>Welcome to Play Framework Tutorial on Baeldung!</h1>
}
브라우저를 다시 로드하면 굵은 제목이 표시됩니다.
Welcome to Play Framework Tutorial on Baeldung!
일반 텍스트 또는 HTML 텍스트를 직접 반환할 수 있도록 HomeController 의 index() 메서드 에서 렌더링 지시문 을 제거하여 템플릿을 완전히 없앨 수 있습니다.
public Result index() {
return ok("REST API with Play by Baeldung");
}
위와 같이 코드를 편집한 후에는 브라우저에 텍스트만 표시됩니다. HTML이나 스타일이 없는 일반 텍스트입니다.
REST API with Play by Baeldung
헤더 <h1></h1> 태그에 텍스트를 래핑한 다음 HTML 텍스트를 Html.apply 메서드에 전달하여 HTML을 출력할 수도 있습니다. 마음껏 가지고 놀아보세요.
경로 에 /baeldung/html Endpoints을 추가해 보겠습니다 .
GET /baeldung/html controllers.HomeController.applyHtml
이제 이 엔드포인트에서 요청을 처리하는 컨트롤러를 생성해 보겠습니다.
public Result applyHtml() {
return ok(Html.apply("<h1>This text will appear as a heading 1</h1>"));
}
http://localhost:9000/baeldung/html 을 방문하면 HTML 형식의 위 텍스트를 볼 수 있습니다.
응답 유형을 사용자 지정하여 응답을 조작했습니다. 이후 섹션에서 이 기능에 대해 자세히 살펴보겠습니다.
Play 프레임워크의 다른 두 가지 중요한 기능도 보았습니다.
첫째, 브라우저를 다시 로드하면 코드의 최신 버전이 반영됩니다. 코드 변경 사항이 즉시 컴파일 되기 때문 입니다.
둘째, Play는 play.mvc.Results 클래스의 표준 HTTP 응답에 대한 도우미 메서드를 제공합니다. 예를 들어 ok() 메서드는 매개 변수로 전달하는 Response body과 함께 OK HTTP 200 응답을 반환합니다. 우리는 이미 브라우저에 텍스트를 표시하는 방법을 사용했습니다.
결과 클래스 에는 notFound() 및 badRequest( )와 같은 더 많은 도우미 메서드가 있습니다 .
6. 결과 조작
우리는 자신도 모르는 사이에 Play의 콘텐츠 협상 기능을 통해 혜택을 받아왔습니다 . Play는 Response body에서 응답 콘텐츠 유형을 자동으로 유추합니다. 이것이 우리가 ok 메소드에서 텍스트를 반환할 수 있었던 이유입니다.
return ok("text to display");
그런 다음 Play는 자동으로 Content-Type 헤더를 text/plain 으로 설정합니다 . 대부분의 경우 작동하지만 콘텐츠 유형 헤더를 제어하고 사용자 지정할 수 있습니다.
Text/html 에 대한 HomeController.customContentType 작업에 대한 응답을 사용자 지정해 보겠습니다 .
public Result customContentType() {
return ok("This is some text content").as("text/html");
}
이 패턴은 모든 종류의 콘텐츠 유형에 적용됩니다. ok 도우미 메서드에 전달하는 데이터 형식에 따라 text/html 을 text/plain 또는 application/json 으로 바꿀 수 있습니다 .
헤더 설정과 비슷한 작업을 수행할 수 있습니다.
public Result setHeaders() {
return ok("This is some text content")
.as("text/html")
.withHeader("Header-Key", "Some value");
}
7. 결론
이 기사에서는 Play 프레임워크의 기본 사항을 살펴보았습니다. 또한 Play를 사용하여 기본 Java 웹 애플리케이션을 만들 수 있었습니다.
늘 그렇듯이 이 예제의 소스 코드는 GitHub 에서 사용할 수 있습니다 .