자바 플랫폼에서 스크립트 언어 지원의 추가에 따라 Groovy와 같은 웹 애플리케이션 스크립트 언어, Java Persistence API(JPA)와 같은 자바 기술 및 MySQL과 같은 데이터베이스의 결합에 많은 관심이 집중되었습니다. 작년에 저는 애완동물의 온라인 카탈로그를 보여주는 애플리케이션을 생성하기 위해 JavaServer Faces 기술, Spring 및 JPA를 사용하는 방법을 보여주는 JSF 기술, Spring과 JPI의 결합이라는 제목의 테크팁을 쓴 적이 있습니다. 본 팁에서는 Groovy 언어, Grails 프레임워크, MySQL 데이터베이스 및 Java Persistence API를 사용하여 온라인 카탈로그 애플리케이션을 만드는 방법을 보여줍니다.
본 팁에는 샘플 애플리케이션 코드가 수록된 패키지가 함께 제공됩니다. 이 팁의 코드 예제는 해당 패키지에 포함된 샘플의 소스 코드에서 추출한 것입니다. 본 팁에서는 애플리케이션을 구축하고 GlassFish 애플리케이션 서버에 배포하기 위해 NetBeans IDE 6.5 Milestone 1을 사용합니다. NetBeans IDE는 자바 프로그래밍 언어로 작성된 모듈식 표준 기반 통합 개발 환경(IDE)입니다. 최신 NetBeans IDE 서비스인 NetBeans IDE 6.5 Milestone 1(M1)은 Groovy 및 Grails에 대한 지원을 포함한 여러 가지 새로운 기능을 제공합니다. GlassFish는 자바 EE 5 플랫폼에서 최신 기능을 구현하는 무료 오픈 소스 애플리케이션 서버입니다.
샘플 애플리케이션의 언어, 기술 및 프레임워크 요약
Groovy, Grails, MySQL 또는 JPA에 익숙하지 않은 경우를 위해 간략하게 설명하겠습니다.
- Groovy는 자바 가상 머신(JVM)1을 위한 민첩하고 동적인 언어입니다. 자바 바이트 코드를 컴파일하며 Smalltalk, Python 및 Ruby와 같은 언어의 인기 있는 기능을 결합했습니다.
- Grails는 Groovy 언어를 활용하며 자바 웹 배포를 보완하는 오픈 소스 웹 애플리케이션 프레임워크이며 Groovy에 "규칙에 따른 코딩" 패러다임을 적용하는 것을 목적으로 합니다. Grails는 모델-뷰-컨트롤러(Model-View-Controller) 기반 프레임워크로서 구성 파일의 필요성을 줄이고 데이터베이스 지원 웹 애플리케이션에서 필요한 것들을 생성하여 웹 애플리케이션 개발을 단순화합니다.
- MySQL은 세계적으로 가장 널리 사용되는 오픈 소스 데이터베이스입니다. 지속적으로 빠른 성능과 높은 신뢰성, 사용상의 편이성을 제공합니다.
- JPA(Java Persistence API)는 자바 EE 및 자바 SE 애플리케이션을 위해 POJO(plain old Java object) 기반의 지속성 모델을 제공합니다. 이것은 관계형 데이터가 Java 개체에 매핑되는 방식에 대한 모든 세부사항을 다루며 개체/관계 매핑(O/R)을 표준화합니다.
샘플 애플리케이션
샘플 애플리케이션에서는 애완동물 가게에서 판매하는 애완동물의 온라인 카탈로그를 표시합니다. 그림 1은 사용자가 상점의 제품 목록을 페이지별로 볼 수 있는 카탈로그 목록 페이지를 보여줍니다.
|
|
애플리케이션 검사
앞에서 언급했듯이 Grails는 웹 애플리케이션 개발을 단순화하는 모델-뷰-컨트롤러(Model-View-Controller) 기반 프레임워크입니다. 온라인 카탈로그 애플리케이션은 Grails를 사용하며 애플리케이션은 사용자 인터페이스인 "뷰(View)"와 모델과 뷰 사이의 통신을 관리하는 코드인 "컨트롤러(Controller)"에서 데이터인 "모델(Model)"을 격리하는 MVC 패턴을 따릅니다. 애플리케이션에 대한 모델을 먼저 살펴 보겠습니다.
모델
모델은 애플리케이션의 데이터를 나타낼 뿐만 아니라 애플리케이션의 수명이 끝나더라도 지속되는 영구적 데이터도 나타냅니다. 다시 말해, 모델은 애플리케이션의 영구적 비즈니스 도메인 개체를 나타냅니다. 애플리케이션은 지속성 관리를 위해 JPA를 사용합니다. JPA에서 엔터티 개체의 인스턴스인 엔터티 인스턴스는 데이터베이스 테이블의 데이터 행을 나타냅니다.
애플리케이션의 소스 코드를 검토하면 model 디렉토리에서 Item과 Address의 두 가지 클래스를 볼 수 있습니다. Item은 일반적인 JPA 엔터티 개체인 엔터티 클래스로서 데이터베이스의 item 테이블에 매핑합니다. 테이블은 카탈로그의 항목에 대한 정보를 저장합니다. 다음은 Item 클래스에 대한 소스 코드의 일부입니다.
package model;
import java.io.Serializable;
...
@Entity
@Table(name = "item")
public class Item implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
private String name;
private String description;
private String imageurl;
private String imagethumburl;
private BigDecimal price;
@ManyToOne(optional = false)
@JoinColumn(name = "address_id")
private Address address;
// getters and setters
...
}
Address는 데이터베이스의 address 테이블에 매핑하는 엔터티 클래스입니다. 테이블은 카탈로그의 항목에 연관된 주소를 저장합니다. 다음은 Address 클래스에 대한 소스 코드의 일부입니다.
package model;
import java.io.Serializable;
...
@Entity
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
private String street1;
private String street2;
private String city;
private String state;
private String zip;
private BigDecimal latitude;
private BigDecimal longitude;
private BigInteger version;
@OneToMany(fetch = FetchType.EAGER,
cascade = { CascadeType.ALL },
mappedBy = "address")
private Collection<Item>items = new ArrayList();
// getters and setters
...
}
Item 클래스는 Address 클래스와 다대일 관계를 가지며 이는 동일한 주소와 연관된 카탈로그에 여러 개의 항목이 있을 수 있지만 여러 개의 주소는 동일한 항목과 연관될 수 없음을 의미합니다. 이 관계는 Item 클래스의 @ManyToOne 주석과 Address 엔터티 클래스의 @OneToMany(mappedBy = "address") 주석으로 지정됩니다.
Grails 및 MySQL과 함께 JPA 엔터티 사용
애플리케이션에 Grails 및 MySQL과 함께 JPA 엔터티를 사용하려면 먼저 Grails 애플리케이션을 생성한 다음, Grails 애플리케이션 디렉토리 구조에서 일부 파일을 수정해야 합니다.
NetBeans IDE 6.5 M1을 사용하여 Grails 애플리케이션을 생성합니다. 아직 없는 경우, NetBeans IDE 6.5 Milestone 1 다운로드와 Grails 다운로드를 받으십시오.
NetBeans IDE 6.5 Milestone 1을 시작합니다. File 메뉴에서 New Project를 선택합니다. 그 다음, 그림 2에 나온 것처럼 Categories 창에서 Groovy를, Projects 창에서 Grails를 선택합니다.
|
그림 2. NetBeans IDE 6.5 M1에서 Grails 프로젝트 생성 |
Next 버튼을 클릭하고 프로젝트의 이름을 지정합니다(예: MyGrailsApp). 기본 프로젝트 위치를 허용하거나 탐색하여 다른 위치를 선택합니다. Set as Main Project 확인란을 선택된 상태로 두고 Finish 버튼을 클릭합니다.
그 결과, NetBeans는 Grails 프로젝트와 Grails 애플리케이션에 대한 표준 디렉토리 구조를 생성합니다. 그림 3은 온라인 카탈로그 애플리케이션에 대한 Grails 디렉토리 구조를 보여줍니다.
|
|
디렉토리 구조를 제 위치로 한 후에 다음을 수행합니다.
- 엔터티 파일을 app_name\src\java 디렉토리에 놓습니다. 여기에서 app_name은 Grails 애플리케이션의 이름입니다. 온라인 카탈로그 애플리케이션에 대한
Item및Address엔터티 파일은catalog\src\java\model디렉토리에 있습니다. - MySQL jdbc 드라이버 mysql-connector-java-5.1.6-bin.jar을 찾아
app_name\lib디렉토리에 놓습니다. 온라인 카탈로그 애플리케이션에 대한mysql-connector-java-5.1.6-bin.jar파일은catalog\lib디렉토리에 있습니다. - MySQL을 데이터베이스로 사용하도록
app_name\grails-app\conf디렉토리의DataSource.groovy파일을 수정하고 JPA 엔터티의 주석을 사용하도록GrailsAnnotationConfiguration구성 클래스를 지정합니다. 다음 코드 예제에 굵은 글꼴로 표시된 코드는 온라인 카탈로그 애플리케이션에 대한DataSource.groovy파일에 추가 및 수정한 부분입니다.import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration dataSource { configClass = GrailsAnnotationConfiguration.class pooled = false driverClassName = "com.mysql.jdbc.Driver" username = "root" password = "" dialect = "org.hibernate.dialect.MySQL5InnoDBDialect" } hibernate { cache.use_second_level_cache=true cache.use_query_cache=true cache.provider_class='com.opensymphony.oscache.hibernate.OSCacheProvider' } // environment specific settings environments { development { dataSource { dbCreate = "create-drop" // one of 'create', 'create-drop','update' url = "jdbc:mysql://localhost/petcatalog" } } test { dataSource { dbCreate = "update" url = "jdbc:mysql://localhost/petcatalog" } } production { dataSource { dbCreate = "update" url = "jdbc:mysql://localhost/petcatalog" } } }
- Grails가 JPA 엔터티를 도메인 클래스로 인식하도록 하려면
app_name\grails-app\conf\hibernate디렉토리에hibernate.cfg.xml파일을 추가해야 합니다. 다음은 온라인 카탈로그 애플리케이션에 대한hibernate.cfg.xml파일입니다. 이 파일은catalog\grails-app\conf\hibernate디렉토리에 있습니다.<?xml version=""1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <mapping package="model" /> <mapping class="model.Item" /> <mapping class="model.Address" /> </session-factory> </hibernate-configuration>
컨트롤러
NetBeans IDE 6.5 M1에서는 도메인 클래스와 컨트롤러를 생성할 수 있지만 컨트롤러 생성을 위한 메뉴 옵션을 찾을 수 없어서 여기에서는 컨트롤러 생성을 위해 다음 명령줄을 사용합니다.
- 명령 프롬프트를 열고 Grails 애플리케이션의 프로젝트 디렉토리를 찾습니다. 위치를 잊은 경우에는 프로젝트의 Properties 대화 상자에서 확인할 수 있습니다.
- 다음 명령을 입력하여 도메인 클래스의 컨트롤러를 생성합니다.
grails generate-controller domain-class
여기에서 domain-class는 도메인 클래스 이름입니다. 예를 들어,Item도메인 클래스의 컨트롤러를 생성하려면 다음과 같이 입력합니다.grails generate-controller model.Item
그 결과, 명령은
grails-app/controllers디렉토리에domain-classController.groovy파일을 생성합니다.Item클래스의 경우, 생성된 컨트롤러는grails-app/controllers/ItemController.groovy에 위치합니다.
그림 4는 NetBeans IDE 6.1 M1 Groovy 편집기 창에 ItemController.groovy 컨트롤러를 보여줍니다.
|
그림 4. 온라인 카탈로그 애플리케이션용 Grails 디렉토리 구조에 표시된 컨트롤러 |
컨트롤러는 수신되는 HTTP 요청을 처리하고 데이터 수신 및 요청 처리를 위해 모델과 상호 작용하며 올바른 뷰를 호출하고 표시를 위해 도메인 데이터를 뷰로 전송합니다. Grails에서 HTTP 요청은 요청 시 실행되는 하나 이상의 액션 메소드를 포함하는 컨트롤러 클래스가 처리합니다. 액션 메소드는 GSP(Groovy Server Page)를 렌더링하거나 다른 작업으로 전달합니다. Grails는 요청에 대한 URL 매핑에 해당하는 컨트롤러 작업으로 요청을 라우팅합니다. Grails에서, URL에서 액션 메소드로의 기본 매핑은 http://host/app_name/controller/action/id 규칙을 따릅니다. 여기에서 host는 호스트 이름, app_name은 Grails 애플리케이션 이름, controller는 컨트롤러 클래스, action은 액션 메소드, id는 전달된 매개 변수의 id입니다. 예를 들어, http://host/catalog/item/list URL은 항목 컨트롤러 클래스의 list 액션 메소드를 호출합니다. 다음은 list 메소드를 보여주는 ItemController.groovy 코드 일부입니다.
import model.Item
class ItemController {
def index = { redirect(action:list,params:params) }
// the delete, save and update actions only accept POST requests
def allowedMethods = [delete:'POST', save:'POST', update:'POST']
def list = {
if(!params.max) params.max = 10
[ itemList: Item.list( params ) ]
}
Grails 스케폴딩(scaffolding)은 클래스의 개체 나열, 생성, 업데이트 및 삭제를 위한 일련의 표준화된 컨트롤러 액션 메소드를 제공합니다. 이들 표준화된 작업은 컨트롤러 논리 및 기본 뷰 GSP(Groovy Server Page)와 함께 제공됩니다. ItemController의 list 작업은 항목 개체의 페이지 지정 목록과 함께 뷰를 렌더링합니다.
http://localhost:8080/catalog/item/과 같이 URL에 컨트롤러가 있지만 작업이 없을 경우, Grails는 index 작업을 기본값으로 합니다. ItemController 코드에서 index 액션 메소드는 list 액션 메소드로 전달합니다. list 액션 메소드는 데이터베이스의 item 테이블에서 가져온 item 개체의 ArrayList를 반환하는 Item.list() 메소드를 호출합니다. params.max에 지정된 숫자(이 경우는 10)보다 더 많은 개체가 테이블에 있을 경우, Grails는 자동으로 다음 및 이전 페이지 링크를 생성합니다. Grails 프레임워크는 자동으로 itemList 변수를 뷰에서 사용 가능하도록 합니다.
코드 실행 후 작업은 일반적으로 작업 및 컨트롤러 이름에 해당하는 views 디렉토리에 GSP를 렌더링합니다. 예를 들면, list 작업은 grails-app\views\item 디렉토리에 list.gsp GSP를 렌더링합니다.
뷰
뷰 계층은 웹 페이지 생성을 위해 컨트롤러가 제공한 도메인 개체의 데이터를 사용합니다. Grails에서 뷰는 GSP(Groovy Server Page)를 사용하여 렌더링됩니다. 뷰를 생성하려면 명령 프롬프트를 열고 Grails 애플리케이션의 프로젝트 디렉토리를 찾은 후에 다음 명령을 입력합니다.
grails generate-views domain-class
여기에서 domain-class는 도메인 클래스입니다. 예를 들어, Item 도메인 클래스의 뷰를 생성하려면 다음과 같이 입력합니다.
grails generate-views model.Item
그 결과, 명령은 도메인 클래스의 GSP를 생성합니다. 예: model.Item 엔터티의 create.gsp, edit.gsp, list.gsp
다음은 온라인 카탈로그 애플리케이션에 대한 list.gsp 파일의 일부입니다. 애완동물 이미지를 표시하기 위해 기본으로 생성되는 HTML 테이블 형식을 수정했습니다.
<table>
<thead>
<tr>
<g:sortableColumn property="name" title="Name" />
<g:sortableColumn property="imagethumburl" title="Photo" />
<g:sortableColumn property="price" title="Price" />
</tr>
</thead>
<tbody>
<g:each in="${itemList}" status="i" var="item">
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
<td>
<g:link action="show" id="${item.id}">
${item.name?.encodeAsHTML()}</g:link>
</td>
<td>
<img src="${createLinkTo(dir:'images',file:item.imagethumburl)}"/>
</td>
<td>${item.price?.encodeAsHTML()}</td>
</tr>
</g:each>
</tbody>
</table>
</div>
<div class="paginateButtons">
<g:paginate total="${Item.count()}" />
</div>
뷰는 GSP 렌더링을 위해 필요한 데이터를 액세스하기 위해 컨트롤러가 설정한 인스턴스 변수를 사용합니다. GSP(Groovy Server Page)는 JSP 태그 라이브러리와 유사한 GroovyTagLib를 사용합니다. 태그는 list.gsp 코드에서 <g:로 시작합니다. 이들은 GroovyTag입니다. 다음은 list.gsp 코드의 일부 기타 요소와 GroovyTag의 요약입니다.
<g:sortableColumn>- 테이블에서 정렬을 지원하기 위한 정렬 가능 열을 렌더링합니다.
<g:each in="${itemList}" status="i" var="item">Item모델 개체의 순서에 따른ArrayList인itemList변수에서 각 개체를 루프하고 각각의Item모델 개체를item변수에 지정합니다.<g:link action="show" id="${item.id}">${item.name?.encodeAsHTML()}</g:link>- 지정된 작업, id 및 지정된 컨트롤러 매개 변수를 기반으로 HTML 앵커 태그
href를 생성합니다. 이 예제에서는item/show/id작업에의 링크를 생성합니다. 이 작업은 해당 항목의 세부사항을 표시합니다. 이 행은item변수에 대한 다음 HTML을 생성합니다.<a href="/catalog/item/show/2">Friendly Cat</a>
<img src="${createLinkTo(dir:'images',file:item.imagethumburl)}"/>- 항목의
${item.price?.encodeAsHTML()}- 항목의 가격 속성 값을 이스케이프 HTML 텍스트로 표시합니다.
<g:paginate total="${Item.count()}" />- 도메인 메소드를 사용하여 결과에 페이지를 지정할 수 있도록 다음/이전 버튼 및 사이트 이동 경로를 생성합니다.
< DD code>>
Show 액션 메소드
Grails에서, URL에서 액션 메소드로의 기본 매핑은 http://host/app_name/controller/action/id 규칙을 따르며 여기에서 host는 호스트 이름, app_name은 Grails 애플리케이션 이름, controller는 컨트롤러 클래스, action은 액션 메소드, id는 전달된 매개 변수의 id입니다. 이는 온라인 카탈로그 애플리케이션에서 http://host/item/show/1 URL이 ItemController의 보여주기 작업으로 라우팅하여 1을 매개 변수 id로 메소드에 전달함을 의미합니다. ItemController 클래스의 show 작업이 아래에 나와 있습니다. ItemController show 작업은 id 매개 변수에 해당하는 item 개체의 세부 사항을 보여주는 뷰를 렌더링합니다.
def show = {
def item = Item.get( params.id )
if(!item) {
flash.message = "Item not found with id ${params.id}"
redirect(action:list)
}
else { return [ item : item ] }
}
show 액션 메소드는 Item.get() 메소드를 호출합니다. 이 메소드는 items 테이블을 쿼리하고 속성 id(즉, 기본 키)가 id 매개 변수와 동일한 item에 해당하는 item 인스턴스 변수를 반환합니다. 이는 다음 SQL 문과 같습니다.
select * from items where id='1'
Grails 프레임워크는 자동으로 item 변수를 Show 뷰에서 사용 가능하도록 합니다.
항목 보여주기 GSP
적절한 코드 실행 후 show 작업은 애플리케이션의 views/item 디렉토리에 show.gsp 파일을 렌더링합니다. 다음은 항목 보여주기 뷰를 나타내는 온라인 카탈로그 애플리케이션에 대한 show.gsp 파일의 일부입니다.
<table>
<tbody>
<tr class="prop"">
<td valign="top" class="name">Name:</td>
<td valign="top" class="value">${item.name}</td>
</tr>
<tr class="prop">
<td valign="top" class="name">Description:</td>
<td valign="top" class="value">${item.description}</td>
</tr>
<tr class="prop">
<td valign="top" class="name">Imageurl:</td>
<td valign="top" class="value">
<img src="${createLinkTo(dir:'images',file:item.imageurl)}" />
</td>
</tr>
<tr class="prop">
<td valign="top" class="name">Price:</td>
<td valign="top" class="value"> ${item.price}</td>
</tr>
<tr class="prop">
<td valign="top" class="name">Seller's Address:</td>
<td valign="top" class="value">${item?.address?.street1},
${item?.address?.city}, ${item?.address?.state}</td>
</tr>
</tbody>
</table>
다음은 항목 보여주기 뷰의 몇 가지 중요한 부분입니다.
${item.description}- 항목의 설명 속성 값을 표시합니다.
<img src="${createLinkTo(dir:'images',file:item.imageurl)}" /> ${item.description}- 항목의
imageurl속성에 대한 HTML 이미지 태그를 생성합니다. ${item?.address?.city}- 항목의 주소 도시 속성 값을 표시합니다.
샘플 코드 실행
이 지침은 NetBeans IDE 6.1, GlassFish v2ur2 및 MySQL이 설치되어 있다고 가정합니다. 이들 모두를 하나의 번들로 다운로드 받을 수 있습니다. 또는 Sun Java System Application Server 9.1 업데이트 1과 MySQL 커뮤니티 서버를 포함하는 번들을 다운로드 받을 수도 있습니다.
- 다음과 같이 Grails용 GlassFish v2 플러그인을 설치합니다.
- GlassFish 업데이트 센터를 시작하려면
GF_install\updatecenter\bin\updatetool명령을 수행합니다. - GlassFish 업데이트 센터에서 GlassFish Support for Grails Framework 확인란을 선택하고 Install을 클릭합니다.
- GlassFish 업데이트 센터를 시작하려면
- NetBeans IDE가 없으면 NetBeans IDE 6.5 M1을 다운로드하여 설치합니다.
- 샘플 코드를 다운로드하고 그 내용을 추출합니다. 이제 새로 압축이 풀린
<sample_install_dir>/catalog디렉토리를 볼 수 있을 것입니다. 여기에서<sample_install_dir>은 샘플 패키지의 압축을 푼 디렉토리입니다. 예를 들어, Windows 시스템에서C:\디렉토리에서 압축을 풀었다면 새로 생성된 디렉토리는C:\catalog입니다. - NetBeans IDE 6.5 Milestone 1을 시작합니다.
- 다음과 같이 MySQL 데이터베이스를 시작합니다.
- NetBeans IDE에서 Services 탭을 클릭합니다.
- 데이터베이스 노드를 확장합니다. 데이터베이스 목록에 MySQL 서버 데이터베이스가 나타나야 합니다.

- MySQL 서버 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 Start를 선택합니다.
- 다음과 같이 petcatalog 데이터베이스를 생성합니다.
- MySQL 서버 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 Create Database를 선택합니다.
- 데이터베이스 이름을 petcatalog로 입력합니다. New Database Connection 창이 열립니다. O.K를 클릭하여 표시된 설정을 받아들입니다.
- 다음과 같이 MySQL petcatalog 데이터베이스에 테이블을 생성합니다.
- 드라이버 노드를 확장합니다. 드라이버 목록에서 petcatalog 데이터베이스의 드라이버를 선택해야 합니다.

- petcatalog 드라이버를 마우스 오른쪽 버튼으로 클릭하고 Connect를 선택합니다.
- petcatalog 드라이버를 마우스 오른쪽 버튼으로 클릭하고 Execute Command를 선택합니다. SQL 명령 창이 열립니다.
catalog디렉토리에서catalog.sql파일의 내용을 복사하여 SQL 명령 창에 붙여 넣습니다.- SQL 명령 창 위의 Run SQL 아이콘
(Ctrl+Shift+E)을 클릭합니다.
- 드라이버 노드를 확장합니다. 드라이버 목록에서 petcatalog 데이터베이스의 드라이버를 선택해야 합니다.
- 다음과 같이 WAR 파일을 생성합니다.
catalog\grails-app\conf\DataSource.groovy파일의 사용자 이름 및 암호 설정이 MySQL 서버 데이터베이스용 NetBeans IDE 6.5 M1의 해당 속성 설정과 동일한지 확인합니다.- Projects 창에서 카탈로그 노드를 마우스 오른쪽 버튼으로 클릭합니다.
- Grails를 선택한 다음, Create war file을 선택합니다. 카탈로그 프로젝트 디렉토리에
catalog-0.1.war파일이 생성됩니다. 설치한 Grails의 수준으로 조율하기 위해 애플리케이션의 예상 Grails 수준(catalog\application.properties파일의app.grails.version설정)을 변경해야 할 수도 있습니다.
catalog-0.1.war파일을GF_install/domains/domain1/autodeploy디렉토리로 복사합니다. 여기에서 GF_install은 GlassFish를 설치한 디렉토리입니다.- 아직 시작하지 않았으면 GlassFish를 시작합니다.
- 브라우저에서 URL
http://localhost:8080/catalog-0.1/을 입력합니다. 샘플 애플리케이션의 홈페이지가 나타나야 합니다.
추가 자료
- MySQL과 함께 Glassfish에서 Groovy, Grails 및 JPA를 사용한 상점 카탈로그 샘플
- NetBeans을 사용한 Grails 개발
- GlassFish 및 스크립팅
- TOTD #31: Grails를 사용한 CRUD 애플리케이션 - GlassFish 및 MySQL에 호스팅
- Grails
- Groovy
- mysql 명령
저자 정보
Carol McDonald는 Sun Microsystems의 Java Technology Evangelist입니다. 1986년부터 소프트웨어 개발자로 일해 온 Carol은 자바 EE 기술, XML, 인터넷/인트라넷 애플리케이션, LDAP, 분산 네트워크 관리(CMIP, SNMP) 및 전자 메일(X.400, X.500)을 비롯한 분산 네트워크 애플리케이션 및 프로토콜 기술 분야에서 경력을 쌓아왔습니다. Carol은 Java 외에도 프랑스어와 독일어에 능통합니다.
1 이 웹사이트에 사용된 것처럼 "자바 가상 머신" 또는 "JVM"이란 용어는 자바 플랫폼용의 가상 시스템을 의미합니다. Ericsson 전화기를 받으세요.
이 글의 영문 원본은
Combining Groovy, Grails, MySQL, and the Java Persistence API
에서 보실 수 있습니다.
"Java EE" 카테고리의 다른 글
- EJB 3.0 인터셉터(Interceptor) (댓글 5개 / 트랙백 0개) 2007/02/22
- Java WSDP 2.0 기반의 웹 서비스를 Java EE 5에 포팅하기 (댓글 2개 / 트랙백 0개) 2006/06/16
- JAXB 라이브러리로 오브젝트 나열하기 (댓글 1개 / 트랙백 0개) 2005/02/03
- 현지화된 메시지 로깅 (댓글 23개 / 트랙백 3개) 2007/09/03
- 엔터프라이즈 빈을 이용한 타이머 사용 (댓글 2개 / 트랙백 0개) 2005/02/03
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- JAVASERVER FACES 기술과 사용자 정의 컴포넌트 (댓글 1개 / 트랙백 0개) 2004/12/15
- 파인더 메소드와 EJB-QL (댓글 2개 / 트랙백 0개) 2003/08/25
- Java Persistence를 최상으로 구현하는 방법 (댓글 12개 / 트랙백 0개) 2007/07/23
- JAX-WS에서 핸들러 작성하기 (댓글 2개 / 트랙백 0개) 2006/08/10



댓글을 달아 주세요