넷빈(NetBeans)6.9에서 메이븐(Maven) 사용-01-Enterprise App 만들기

0

Written on 오전 4:36 by 강여사(J.Y.Kang)

이번 게시물에서는 넷빈즈 IDE와 Maven Archetype 을 사용하여 간단한 엔터프라이즈 어플리케이션을 만들어 보는 방법에 대해 알아 보겠습니다.

이번 게시물의 결과는 EAR archive로 패키지된 엔터프라이즈 어플리케이션을 글래스피시 서버에 배포하게 됩니다. 그 과정에서 새 프로젝트 마법사에서 제공하는 메이븐 엔터프라이즈 어플리케이션 아키타입을 사용하여 어플리케이션을 만드는 방법을 학습하게 됩니다. 어플리케이션에는 EJB 프로젝트로 퍼시스턴스 엔티티 클래스, 메시지 드리븐 빈 및 세션 빈 퍼세이드 등이 포함되어 있습니다. 그리고 2개의 서블릿을 웹 프로젝트로 가지게 됩니다.

이번 게시물에 필요한 작업 환경은 다음과 같습니다.

넷빈즈 6.9
JDK 6
글래스피시 v3.0.1

메이븐 프레임워크를 사용하여 프로젝트를 개발하는 것은 ANT 로 프로젝트를 개발하는 것과 거의 유사합니다. 그러나 프로젝트를 빌드하는 방식과 의존성을 가지고 작업된다는 점에서 차이가 있습니다.

우선 메이븐 프로젝트를 만들기 전에, 로컬로 메이븐 설치 및 로컬 메이븐 저장소를 사용할 수 있도록 맞게 설정되어야 합니다. 만약 메이븐이 설치되어 있지 않다면, 메이븐 사이트는 다음과 같습니다. http://maven.apache.org/ 경로에서 메이븐의 최신 버전을 다운로드 받아 적당한 곳에 압축을 풉니다.


* IDE 에서 메이븐(Maven) 설정
메이븐 프로젝트를 만들기에 앞서 IDE에 메이븐에 대한 설정을 해야 합니다.
앞서 설치(다운로드-압축풀기)한 메이븐의 로컬 설치 폴더와 로컬 저장소와 IDE를 연결합니다.

IDE의 도구-옵션
기타-Maven 에서 첫번째 외부 메이븐 홈은 다운로드 받아 압축을 푼 메이븐 폴더를,
두번째로 메이븐의 로컬 저장소는 보통 넷빈을 설치하면 저 경로가 있습니다.
찾아보기 버튼을 클릭하여 찾아서 지정해줍니다 - OK
* 업데이트 메이븐 저장소

프로젝트 빌드시 코드 완성을 위해 로컬 및 원격 메이븐 저장소가 사용됩니다. 프로젝트 개발시 사용 가능하도록 준비된, 필요로 하는 아티팩트를 확인하기 위해 메이븐 원격 저장소를 위한 인덱스를 업데이트 해야 합니다. 옵션 창의 메이븐 탭안에 업데이트를 위한 IDE 확인 추가를 설정할 수도 있습니다. 물론, 메이븐 저장소 브라우저에서 로컬 및 원격 메이븐 저장소를 업데이트 및 점검하기 위해 즉시 체크를 수행할 수도 있습니다.

1. 창-기타-메이븐 저장소 브라우저

2. 메이븐 저장소 브라우저 상단의 업데이트 인덱스 클릭
*****************************************************************
메이븐 엔터프라이즈 어플리케이션 프로젝트 만들기
이제 IDE와 번들로 구성된 메이븐 엔터프라이즈 어플리케이션 아키타입을 사용한 엔터프라이즈 어플리케이션 프로젝트를 만들 예정입니다.
이 엔터프라이즈 어플리케이션 아키타입은 EJB 프로젝트와 웹앱 프로젝트를 만들게 됩니다.

우선 새 프로젝트를 엽니다. 프로젝트 창에서 마우스 오른쪽 클릭 -새 프로젝트
카테고리에서 Maven 을 선택하고, 오른쪽 프로젝트에 Maven Enterprise Application 을 선택합니다. - 다음
프로젝트의 이름은 MavenEnterpriseApp ,
경로는 적당히 - 다음

서버는 글래스피시 v3 (기본)
EE 버전 : Java EE6 (기본) - 마침
작업이 끝나면 IDE는 메이븐 엔터프라이즈 어플리케이션 아키타입으로부터 다음 프로젝트 들을 생성하게 됩니다.
* EJB: 일반적으로 EJB 프로젝트는 어플리케이션의 비즈니스 로직에 관련된 소스 코드를 포함합니다. EJB 프로젝트는 EJB Jar 아카이브로 패키지 됩니다.
* WebApp: 일반적으로 JSF ,JSP 페이지 및 서블릿과 같은 어플리케이션의 프리젠테이션 레이어를 포함합니다. WebApp 역시 비즈니스 로직에 관련된 소스 코드를 포함할 수 있습니다. WebApp 프로젝트는 WAR 아카이브로 패키지 됩니다.
* Assembly: Assembly 프로젝트는 EJB 와 WAR 아카이브로부터 EAR 아카이브를 어셈블하는데 사용됩니다. Assembly 프로젝트는 어떠한 소스도 포함하지 않습니다.
* Enterprise Application : 엔터프라이즈 어플리케이션 프로젝트 역시 어떠한 소스도 포함하지 않습니다. 엔터프라이즈 어플리케이션은 엔터프라이즈 어플리케이션에 포함된 모듈에 관한 자세한 내용을 가지고 있는 POM 파일 (pom.xml) 만을 포함하고 있습니다.
엔터프라이즈 어플리케이션 프로젝트가 만들어진 후, 몇몇 의존성 오류(dependencies unavailable) 때문에 Assembly 프로젝트에 경고 아이콘(노란색 삼각형)가 뜹니다.
프로젝트노드에서 마우스 오른쪽을 클릭하여 맨 아래에서 2번째 show and resolve problems 메뉴를 누르면 아래 그림처럼 non-classpath dependency or missing dependency 된 내용을 볼 수 있습니다.

Assembly 프로젝트는 EJB 프로젝트와 WebApp 프로젝트를 컴파일한 후 패키지되고 사용가능해지는 JAR와 WAR 기반하에 의존성(dependencies)를 가집니다.
*********************************************************
EJB 프로젝트 코딩하기

앞서 말한대로 EJB 프로젝트는 어플리케이션의 비즈니스 로직을 포함합니다.
이 어플리케이션에서는 글래스피시 컨테이너가 JTA(Java Transaction API)를 사용하여 트랜잭션을 관리하게 됩니다.

이번 예제에서 EJB 프로젝트는 엔티티 클래스, 메시지-드리븐 빈 및 엔티티 클래스를 위한 세션 퍼세이드를 만들 예정입니다.

우선 대상 서버를 설정합니다. 서비스 탭을 누른 후 서버를 확장하여 GlassFish v3 서버를 시작시킵니다. (서버에서 마우스 오른쪽 클릭 - 시작)
다시 프로젝트 창으로 돌아가서 EJB 프로젝트에서 마우스 오른쪽을 클릭하고 맨 아래 등록정보 선택
등록 정보 창에서 왼쪽 카테고리에서 실행(Run)을 누르고,
오른쪽의 서버에서 글래스피시 서버 v3.1 를 선택합니다. - 확인
코딩 전에 배포 서버로 글래스피시를 지정함으로써, IDE는 퍼시스턴스 유닛을 만들기 위한 마법사에서 JTA를 지정하는 옵션이 가능하게 됩니다.
또한 서버에 등록된 어떠한 데이터 소스도 선택 사용 가능하게 됩니다.

주. 만약 글래스피스 서버 3 으로 설정하지 않으면, 퍼시스턴스 유닛에서 기본 트랜잭션 타입을 만들 때 RESOURCE_LOCAL 이 됩니다. 만약 트랜잭션을 컨테이너가 관리하기 원한다면 persistence.xml 파일을 열어 수동으로 JTA 라고 변경해야 합니다.
퍼시스턴스 유닛 만들기
EJB 프로젝트에서 퍼시스턴스 유닛을 만듭니다.
퍼시스턴스 유닛이란 데이터베이스 커넥션에 대한 상세와 트랜잭션 관리에 대한 방법을 지정합니다.
이번 예제에서는 글래스피시 서버가 트랜잭션을 관리하도록 하기 위해 새 퍼시스턴스 유닛 만들기 마법사에서 JTA를 지정할 예정입니다.

우선, EJB 프로젝트에서 마우스 오른쪽을 클릭하여 새로만들기 - other
카테고리에서 정보보존(Persistence) - 퍼시스턴스 유닛 선택 - 다음
유닛 고유 이름이나 제공자(EclipseLinkJPA 2.0) 는 기본설정 대로 두고,
데이터 소스를 오른쪽 드롭다운 목록을 참고하여 jdbc/sample (JavaDB)로 맞춥니다.
데이터소스 jdbc/sample 은 IDE 번들 글래스피시 설치시 자동으로 작업되어 있는 데이터 소스 입니다. 만약 다른 데이터 베이스를 원한다면 다른 데이터 소스를 지정하여 사용할 수도 있습니다.
그리고 아래 Java Transaction APIs(JPA) 사용을 반드시 체크하고,
테이블 생성 전략은 create 를 체크 확인합니다.
마침
작업이 완료되면 IDE가 persistence.xml 을 만들고 편집창에서 엽니다.
아래 그림 처럼 디자인으로 볼 수도 있고,
옆의 탭을 눌러 XML 소스로(다음 그림) 확인할 수도 있습니다.
----------------------------------
<persistence-unit name="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/sample</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
-----------------------------------------------------------------------------
이번에는 EJB 프로젝트에 엔티티 클래스를 만듭니다.
EJB 프로젝트에서 마우스 오른쪽을 클릭 , 새로 만들기 - Other
카테고리에 정보보존(Persistence)를 파일 유형은 엔티티 클래스 (Entity Class) 선택 - 다음
클래스 이름은 NewsEntity 라고 주고
아래 패키지에는 ejb
그리고 Long 으로 설정된 Primary key type 은 기본 그대로 두고 - 마침
작업이 완료되면 편집기 창에 NewsEntity.java 소스가 보이는데 클래스 아래 2개의 필드를 선언하고 거기서 마우스 오른쪽을 클릭하여 코드 삽입(Insert code)를 선택합니다.
========================================================
private String title;
private String body;

========================================================
아래 그림과 같이 팝업창이 뜨는데 getter and setter 를 선택합니다
2개의 필드 모두를 선택하고 생성(generate) 클릭
***********************************************
메시지 드리븐 빈 만들기

이번에는 EJB 프로젝트의 메시지-드리븐 빈을 만들도록 하겠습니다.
메시지-드리븐 빈(Message-Driven)은 메시지의 비동기 교환을 가능하게 해주는 엔터프라이즈 빈입니다. NewsApp 어플리케이션에서는 웹 모듈에서 서블릿에 의한 큐에 메시지를 주고 받기 위해 메시지-드리븐 빈을 사용합니다.

어플리케이션에서 메시지-드리븐 빈을 사용하려면, 빈이 사용하는 커넥터 리소스를 서버에 등록해야 합니다. 글래스피시 서버에 배포시, 관리 콘솔을 통해 서버에 직접 리소스(자원)를 생성할 수도 있고 sun-resources.xml 파일에 상세를 지정함으로써 배포에 리소스(자원)을 생성할 수 있습니다. 어플리케이션이 서버에 배포시, 서버는 sun-resources.xml 에 정의된 리소스(자원)을 등록합니다. IDE에서는 새파일 마법사로 메시지-드리븐 빈을 만들게 되면, 여러분을 대신해서 sun-resources.xml 에 해당 엘리먼트를 자동 생성합니다.

메이븐 프로젝트에서, sun-resources.xml 파일은 파일 탭 창에서 프로젝트 노드 아래 src/main/setup 디렉터리안에 있습니다.

우선 메시지-드리븐 빈을 만드려면 프로젝트에서 마우스 오른쪽 클릭 , 새로 만들기-Message Driven Bean (만약 그림처럼 바로 제시되지 않으면 other 를 클릭한 후, 카테고리 Java EE 에서 파일 유형을 선택하면 됩니다)
EJB 클래스 이름은 NewMessage
패키지는 ejb
그리고 아래 Add 버튼을 눌러 메시지 도달(Message Destination) 대화 상자를 엽니다.
메시지 도달 이름: jms/NewMessage
도달 유형: Queue (큐)
확인
내용 확인 - 마침
기본적으로 IDE가 빈 클래스와 필요한 어노테이션 등을 설정하게 됩니다.
그럼 클래스에 다음 어노테이션 필드를 추가하여 클래스에다 MessageDrivenContext 리소스를 주입합니다.
그리고 마찬가지로 엔티티 매니저를 추가 주입합니다.
================================================================================
public class NewMessageBean implements MessageListener {

@Resource
private MessageDrivenContext mdc;
@PersistenceContext(unitName="com.mycompany_MavenEnterpriseApp-ejb_ejb_1.0-SNAPSHOTPU")
private EntityManager em;

================================================================================
@PersistenceContext 어노테이션은 퍼시스턴스 유닛을 선언하여 context 를 지정합니다. 여기서 unitName 값은 퍼시스턴스 유닛 이름입니다
그리고 아래 save 메소드를 추가합니다.
================================================================================
public void onMessage(Message message) {
}

public void save(Object object) {
em.persist(object);
}

================================================================================
onMessage 메소드는 다음 내용으로 변경합니다.
================================================================================
public void onMessage(Message message) {
ObjectMessage msg = null;
try {
if (message instanceof ObjectMessage) {
msg = (ObjectMessage) message;
NewsEntity e = (NewsEntity) msg.getObject();
save(e);
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}

}
================================================================================
임포트 문제에 대한 해결은 여백에서 오른쪽 마우스를 클릭하여 가져오기 고정(fix import) 클릭
아래 그림처럼 javax.jms 관련 및 javax.annotation.Resource 확인 - OK
***********************************************************************
세션 빈 만들기

이번에는 아까 만든 NewsEntity 엔티티 클래스를 위한 세션 빈 퍼세이드(facade)를 마법사를 통해 만들겠습니다.

우선 EJB 모듈에서 마우스 오른쪽을 클릭하여 새로 만들기- other
카테고리에서 정보보존(Persistence)를 선택하고, 오른쪽 유형에서 엔티티 클래스를 위한 세션 빈 (Session Beans for Entity Classes)를 선택- 다음
왼쪽에 사용가능한 엔티티 클래스 목록에 ejb.NewsEntity 가 나타나는데 화살표 버튼을 사용해서 오른쪽에 selected entity classes 창으로 이동 - 다음
아래 그림처럼 제시되는데 여기 패키지를 ejb 로 설정하고 마침

주. Java EE 6 에서의 인터페이스는 옵션입니다. 만약 Java EE 5 라면 세션 빈을 위한 로컬 인터페이스(local interface)를 반드시 생성하고 인터페이스를 통해 세션빈이 호출되게 됩니다만, Java EE 6 의 경우, 로컬 인터페이스는 옵션이며 웹 모듈안의 서블릿은 인터페이스 퍼세이드(facade) 를 통하지 않고 직접 세션빈에 접근 가능합니다.

********************************************************************
웹 어플리케이션 만들기

이번에는 웹 어플리케이션안에 2개의 서블릿을 만들도록 하겠습니다.

포스트된 메시지 목록을 표시하기 위해 사용될 ListNews 서블릿을 만듭니다.

포스트된 메시지를 찾거나 findAll 메소드에 액세스하거나 세션 퍼세이드에 주입하기 위해 어노테이션을 사용할 수 있습니다.

우선 서블릿을 만들기 위해 웹 모듈 프로젝트에서 마우스 오른쪽을 클릭하여 새로 만들기 - 서블릿 을 선택합니다.
서블릿 클래스 이름은 ListNews
패키지는 web
다음
기본대로 그냥 두고 마침
소스 코드에서 마우스 오른쪽을 눌러 코드 삽입(insert code) 선택합니다.
팝업창이 제시되는데 여기서 Call Enterprise Bean 을 선택합니다.
call enterprise bean 창에서, EJB 모듈을 확장하여 NewsEntityFacade 를 선택한 후 OK
그럼, EJB 자원에 대해 @EJB 어노테이션을 사용하여 서블릿에 주입됩니다.
--------------------------------------------------------------------------
@WebServlet(name = "ListNews", urlPatterns = {"/ListNews"})
public class ListNews extends HttpServlet {
@EJB
private NewsEntityFacade newsEntityFacade;
--------------------------------------------------------------------------
processRequest 메소드에서, 아래 내용을 참고하여 작성합니다.
===========================================================================
out.println(" <h1>Servlet ListNews at " + request.getContextPath () + "</h1>");

List news = newsEntityFacade.findAll();
for (Iterator it = news.iterator(); it.hasNext();) {
NewsEntity elem = (NewsEntity) it.next();
out.println(" <b>"+elem.getTitle()+" </b>
");
out.println(elem.getBody()+"
");
}
out.println("<a href="http://www.blogger.com/PostMessage">Add new message</a>");


out.println("");
===========================================================================
임포트 문제는 여백에서 마우스 오른쪽을 클릭하여 가져오기 고정(fix import)로 해결,
java.util.*
임포트 확인 - OK
**********************************************************************
포스트메시지 서블릿 만들기

이번에는 메시지를 포스트하는데 사용할 PostMessage 서블릿을 만들도록 하겠습니다.
어노테이션을 사용하게 되면 변수 이름이나 매핑될 이름을 지정하는데 있어, 서블릿에 JMS 리소스를 직접 주입할 수 있습니다.

우선 웹 모듈 프로젝트에서 마우스 오른쪽을 클릭하여 새로 만들기 - 서블릿
서블릿 클래스 이름은 PostMessage
패키지 web - 다음
역시 기본사항대로 그대로 두고 마침
ConnectionFactory 와 Queue 자원을 주입하기 위해 어노테이션을 사용한 다음 내용을 추가합니다.
==================================================================================
@WebServlet(name="PostMessage", urlPatterns={"/PostMessage"})
public class PostMessage extends HttpServlet {
@Resource(mappedName="jms/NewMessageFactory")
private ConnectionFactory connectionFactory;

@Resource(mappedName="jms/NewMessage")
private Queue queue;


==================================================================================
임포트 문제를 해결하기 위해 마우스 오른쪽 클릭 - 가져오기 고정(fix import)
javax.jms 라이브러리를 임포트 해야하는데 다음 그림처럼 지원되지 않습니다.
cancel 해서 빠져나옵니다
ConnectionFactory 에서 앞에 아이콘을 누르면 팝업창으로 해결안이 제시되는데, 여기서 Search Dependency at Maven Repositories for ConnectionFactory 를 선택하여 누릅니다.
그럼 메이븐 저장소에서 탐색 창이 뜨는데 여기 클래스 이름에 ConnectionFactory 를 적으면 ConnectionFactory를 포함하고 있는 artifacts 들이 제시됩니다.
여기서 javax: javaee-api 에 6.0[jar]-local 을 선택합니다.
추가
그런 다음 다시 가져오기 고정(fix import)
아래 그림을 참고하여 제대로 임포트를 수정합니다. (javax.jms.*) - OK
그리고 processRequest 메소드에 JMS 메시지를 보내기 위한 코드를 다음과 같이 작업합니다.
==============================================================================
response.setContentType("text/html;charset=UTF-8");

// Add the following code to send the JMS message
String title=request.getParameter("title");
String body=request.getParameter("body");
if ((title!=null) && (body!=null)) {
try {
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);

ObjectMessage message = session.createObjectMessage();
// here we create NewsEntity, that will be sent in JMS message
NewsEntity e = new NewsEntity();
e.setTitle(title);
e.setBody(body);

message.setObject(e);
messageProducer.send(message);
messageProducer.close();
connection.close();
response.sendRedirect("ListNews");

} catch (JMSException ex) {
ex.printStackTrace();
}
}

==============================================================================
그리고 아래 HTML 부분은 주석을 해제하고 다음 내용을 붙여 넣습니다.
==================================================================================
out.println("Servlet PostMessage at " + request.getContextPath() + "</h1>");

// The following code adds the form to the web page
out.println("<form>");
out.println("Title: <input type='text' name='title'><br/>");
out.println("Message: <textarea name='body'></textarea><br/>");
out.println("<input type='submit'><br/>");
out.println("</form>");


out.println("</body>");
==================================================================================
임포트 수정 - 가져오기 고정(fix import)
확인후 OK
***********************************************************************
메이븐으로 어플리케이션 빌드하기

이제 엔터프라이즈 어플리케이션을 빌드하기 위한 메이븐 사용에 대해 알아 보겠습니다.

작업은 EAR 아카이브에 프로젝트를 빌드 및 패키지하게되며, 이 EAR 아카이브에는 EJB Jar 아카이브와 WAR 아카이브를 포함하게 됩니다. EAR 아카이브 생성이 완료되면 대상 서버에 이 아카이브를 배포하면 됩니다.

프로젝트 의존성과의 작업

각 메이븐 프로젝트는 pom.xml 파일을 가지고 있는데 여기에는 아카이브에 대한 상세 내용을 포함하고 있습니다.

프로젝트에서 필요로 하는 외부 라이브러리는 pom.xml 안에 dependencies 로 목록화 됩니다. 아카이브를 패키징 할 때 포함될 의존성(dependencies)를 지정할 수도 있습니다.

이번 어플리케이션에서는 EAR 아카이브 안에 EJB JAR와 WAR 아카이브가 포합됩니다. 따라서 Assembly 프로젝트의 pom.xml 을 열러보면 dependencies 로 선언된 EJB와 WAR 내용을 볼 수 있습니다. 확인
웹(WebApp) 프로젝트의 pom.xml 에서는 dependency 로 선언된 EJB 아카이브를 확인할 수 있습니다. WebApp 프로젝트는 의존으로 EJB 아카이브가 필요하지, 패키징하는 동안 WAR 안에 EJB 아카이브가 포함되길 원하지는 않습니다. 즉, EJB 아카이브는 사용 가능하면 되고, EAR 아카이브의 일부로 WebApp 에 제공되게 하면 됩니다.
팁: pom.xml 에서 오른쪽 마우스를 클릭하면 종속성 그래프 보기(Show Dependency Graph) 가 있습니다.
이 메뉴는 프로젝트의 의존관계를 비주얼 적으로 표시 해 줍니다. 또한 아티팩트 위에 마우스 커서를 위치하면 해당 아티팩트의 상세 내용이 툴팁으로 나타납니다.
다시 계속하자면 아까 제공만 되고 포함되지 않도록 하려면 WebApp 프로젝트에서 프로젝트 파일을 확장하여 pom.xml 을 더블 클릭릭한 후
MavenEnterpriseApp-ejb 아티팩트 아래
다음 내용을 추가 합니다.
===================================================================
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>MavenEnterpriseApp-ejb</artifactId>
<scope>provided</scope>
<version>1.0-SNAPSHOT</version>
</dependency>
===================================================================
**********************************************************************
의존성을 가지고 빌드

메이븐 빌드 프레임워크는 특정 단계의 연속을 통해 진행되며, 하나나 그 이상의 목표로 구성된 각 단계는 다양한 메이븐 플러그인을 사용하여 구성될 수 있습니다.

'의존성을 가지고 빌드(Build with Dependencies)' 메뉴는 메이븐 빌드 생명주기의 install 단계에 매핑되며 Reactor 플러그인을 사용하여 구성됩니다.

팝업창에서 Build with Dependencies 메뉴를 선택하면 메이븐은 어플리케이션과 필요한 종속성(dependencies)을 빌드하고 로컬 저장소에 빌드 아티팩트를 복사합니다.

EAR 아카이브를 빌드하려면 Assembly 프로젝트에서 마우스 오른쪽 클릭 - 종속성을 가지고 빌드(Build with Dependencies) 클릭
Reactor 플러그인을 사용하여 Assembly 프로젝트를 빌드하면, Assembly 프로젝트가 빌드되기전 서브 프로젝트의 종속성이 빌드됩니다.
출력창에 빌드 순서가 표시됩니다. (EJB-Webapp-Assembly)
출력창에 빌드 결과가 나타납니다.
메이븐 브라우저 창에 로컬 저장소에 보면 지금 작업된 아카이브가 com.mycompany 에 올라와 있는 걸 확인할 수 있습니다.
*******************************************************************
EAR 아카이브 배포하기

이번에는 서버에 EAR 아카이브를 배포할 수 있는 2가지 방법에 대해서 알아 보겠습니다.

하나는 IDE에 메뉴 작업을 사용하여 글래스 피시 서버에 어플리케이션을 배포(deploy)할 수도 있고,
다른 하나는 글래스피시 관리 콘솔 안에 배포툴(deploy tool)을 사용할 수도 있습니다.

IDE 에서 배포하기

Run 작업에 매핑된 Maven 목표를 수정하여 배포합니다.
우선, Assembly 프로젝트에서 마우스 오른쪽을 클릭하여 맨 아래 등록정보를 누릅니다.
카테고리에 작업을 선택한 뒤, 오른쪽의 작업 중에 프로젝트 실행 (Run project) 를 선택하고
아래 execute goal 을 기존의 package 를 지우고 install 로 바꿉니다.
OK
Assembly 프로젝트에서 마우스 오른쪽을 클릭하고 실행
아래그림과 같이 배포 서버 선택 창이 뜨는데 서버를 글래스피시 서버 3.1 선택 - OK
배포 서버가 선택되면 IDE 가 서버에 JMS 리소스를 만들고 EAR 아카이브를 배포합니다.
***************************************************************
2번째 방법: 글래스피시 관리 콘솔에서 배포하기
글래스피시 관리 콘솔의 배포 툴(Deploy tool)을 사용하여 EAR 아카이브를 배포하는 방법에 대해 알아 보겠습니다.
우선, 서비스 탭의 서버를 확장한 뒤, 글래스피시 서버에서 마우스 오른쪽 클릭 - 관리 콘솔 보기(view admin console) 선택
브라우저에 관리 콘솔이 나타나면 왼쪽 창에서 응용 프로그램을 선택하면 오른쪽에 아래 그림과 같이 나타납니다.
여기서 배포 버튼 클릭
배포할 EAR 아카이브를 선택하기 위해 찾아보기 버튼을 클릭한 후,
엔터프라이즈 어플리케이션 프로젝트안에 target 디렉터리 안에 있는 EAR 아카이브를 찾아 연결해줍니다 - 저장
배포된 엔터프라이즈 응용 프로그램을 선택하면 다음과 같은 내용을 확인해 볼수 있습니다. 참고
ListNews 페이지를 표시하기 위해 브라우저에서 다음 링크를 입력합니다. http://localhost:8080/MavenEnterpriseApp-web/ListNews 처음 프로젝트를 실행하면 데이터베이스가 비어 있기 때문에 아무 메시지도 나타나지 않습니다. 그럼 여기 Add new message 링크를 클릭합니다
그럼 PostMessage 서블릿에 있는 폼안에 메시지를 입력합니다. 다 입력한 뒤 Submit 을 누릅니다.
PostMessage 서블릿으로 메시지를 추가하게 되면, 메시지는 영구 저장(데이터베이스)에 쓰여지기 위해 메시지-드리븐 빈에 보내집니다. 그리고 데이터베이스에 있는 메시지는 ListNews 서블릿에 의해 표시 됩니다.
보낸 내용에 대해 데이터베이스에서 확인하기. 서비스 탭 안에 데이터베이스 커넥션에서 데이터를 확인


이상 메이븐을 이용한 엔터프라이즈 어플리케이션에 대해 살펴 봤습니다.
수고하셨습니다.
*^^*