jboss, jboss tools 환경에서 struts2, ibatis, …

117
JBoss, JBoss Tools 환경에서 Struts2, iBatis, Spring을 이용한 개발 방법 현철주 Artszen Community Artszen Community Artszen Software

Upload: others

Post on 05-Feb-2022

13 views

Category:

Documents


0 download

TRANSCRIPT

JBoss, JBoss Tools 환경에서Struts2, iBatis, Spring을 이용한 개발 방법

현철주Artszen CommunityArtszen Community

Artszen Software

강의 진행 내용

항목 제목 강의내용

1.1. 개발환경1 소개 1.2. 리소스 다운로드

1.3. 개발내용 소개

2OpenSource개발프레임워크소개

2.1. Struts2 소개2.2. Spring 소개2 3 iBatis 소개소개 2.3. iBatis 소개

3 Demo3.1. 환경구축

3 Demo3.2. Sample 애플리케이션 개발

1 소개1. 소개

1.1. 개발환경1.2. 리소스 다운로드1.3. 개발내용 소개

1

1.1. 개발환경

JDK JDK6 14• JDK : JDK6u14• WAS : JBoss5.1.0 GA - jdk6• IDE :

» Eclipse Galileo (3.5)» JBoss Tools 3.1.0.M1

• Framework : POJO[Plain Old Java Object] 기반 오픈소스 프레임워크» Struts 2 .0.11» Spring 2.5.6» iBatis 2.3.4.726

1.2. 리소스 다운로드

JB 5 1 0 GA jdk6• JBoss5.1.0 GA - jdk6 – http://www.jboss.org/jbossas/downloads/

JB T l 3 1 0 M1• JBoss Tools 3.1.0.M1– http://jboss.org/tools/download/dev.html

E li G lil (3 5)• Eclipse Galileo (3.5)– http://www.eclipse.org/downloads/

St t 2 0 11• Struts2.0.11– http://struts.apache.org/2.0.11/index.html

S i 2 5 6• Spring 2.5.6 – http://www.springsource.com/download/community?project=Spring%20

FrameworkFramework

iB ti 2 3 4 726• iBatis 2.3.4.726– http://ibatis.apache.org/java.cgi

1.3. 개발 내용 소개

개발 내용• 개발 내용– 사용자 목록 출력

사용자 추가– 사용자 추가

– 사용자 조회

• 데이터베이스• 데이터베이스– hsqldb : JBoss에 포함

• 사용할 오픈소스 프레임워크• 사용할 오픈소스 프레임워크– Struts2 : 웹 개발 프레임워크

– Spring : Object Factory IoC AOP(TransactionManager)– Spring : Object Factory, IoC, AOP(TransactionManager)– iBatis : SQL Mapper

사용자 테이블 구성• 사용자 테이블 구성

테이블 ID 테이블 이름 테이블 설명

TBL_01 USER_INFO 사용자 정보

번호 컬럼 이름 타입 길이 기본키 Not Null 기본값 컬럼 설명

1 USER ID VARCHAR2 20 TRUE TRUE 아이디1 USER_ID VARCHAR2 20 TRUE TRUE 아이디

2 PASSWORD VARCHAR2 10 TRUE 암호

3 NAME VARCHAR2 50 TRUE 사용자 이름

샘플 애플리케이션 사용자 목록 출력 화면 구성• 샘플 애플리케이션 : 사용자 목록 출력 화면 구성

샘플 애플리케이션 사용자 등록 화면 구성• 샘플 애플리케이션 사용자 등록 화면 구성

샘플 애플리케이션 사용자 조회 화면 구성• 샘플 애플리케이션 사용자 조회 화면 구성

2 O S 개발프레임워크 소개2. OpenSource 개발프레임워크 소개

2.1. Struts2 소개2.2. Spring 소개2.3. iBatis 소개

1

2.1. Struts2 소개

St t• Struts– 2000년도에 ASF Apache Software Foundation 에 기증

대표적인 웹 애플리케이션 개발 프레임워크– 대표적인 웹 애플리케이션 개발 프레임워크

– MVC Model View Controller 패턴 적용

– 웹 개발의 가이드 역할웹 개발의 가이드 역할

– XML 기반의 환경 설정

– 태그 라이브러리 지원태 라이 러리 지원

– 국제화 지원

– 기타 다양한 유틸리티 제공

• 유효성 검사, 레이아웃, 프리젠테이션 객체 지원(ActionForm) , …

S 의 단점• Struts의 단점– POJO 기반이 아님

• 프레임워크에 종속된 프레임워크 객체들• 프레임워크에 종속된 프레임워크 객체들 …• 테스트가 용이하지 못하다.

– 버전 업에 따른 환경설정의 모호함 발생

– ActionForm의 불편함• 편리함을 위한 ActionForm 객체가 오히려 개발의 장애가 됨.• A ti F 객체는 비즈니스 객체가 아니므로 코드량 증가• ActionForm 객체는 비즈니스 객체가 아니므로 코드량 증가

– 태그 라이브러리의 미숙한 지원• 별도의 태그 라이브러리 필요

St t 2• Struts2– Struts + WebWork2

St t 의 거대한 C it 의 파워와 W bW k의 뛰어난– Struts의 거대한 Community의 파워와 WebWork의 뛰어난아키텍처의 결합

S 2 탄생 배경• Struts2 탄생 배경– 스트럿츠 Ti Titanium 제안 초안을 구성.

• 2005년 자바원 J O 에서 스트럿츠 프로젝트의 개발자와 비하이브의 개발자가• 2005년 자바원 JavaOne 에서 스트럿츠 프로젝트의 개발자와 비하이브의 개발자가미팅을 통해 스트럿츠 Ti 제안 초안을 구성.

– WebWork의 단순함, 세련미, 개발 툴 친화성의 장점과 Struts1을결합결합.

S 2의 특징• Struts2의 특징– 완전히 새로운 프레임워크.

St t 1과는 전혀 다른 W bW k2의 MVC 아키텍처 채용– Struts1과는 전혀 다른 WebWork2의 MVC 아키텍처 채용.– 직관적인 개발

• POJO 기반 Action기반

– 제로 컨피규레이션 지향• 기본 값 지원으로 많은 설정 생략 가능

• 어노테이션 Annotation 사용으로 설정 파일에서 설정 생략

– 신속한 리로딩• 변경된 환경설정 파일의 내용을 웹 컨테이너 재시작 없이 리로드변경된 환경설정 파일의 내용을 웹 컨테이너 재시작 없이 리로드

– POJO 액션• 프레임워크에 종속되지 않는다.• Mock 객체에 의존하지 않고 손쉽게 테스트할 수 있다.

POJO 폼– POJO 폼• 별도의 폼 빈이 필요 없다.

– 인터셉터인터셉터• 액션 실행 전과 후에 실행할 코드를 별도의 계층으로 구성.• AOP Aspected Oriented Programming 와 같은 개념

강력한 태그 지원– 강력한 태그 지원• 테마와 템플릿을 사용하여 컴포넌트 기반 개발 가능

– 손쉬운 Ajax Asynchronous JavaScript And Xml 구현손쉬운 Ajax Asynchronous JavaScript And Xml 구현• Dojo 프레임워크 포함

• ajax 테마 지원 태그

– 다양한 표현식 언어 EL Expression Language 지원• 스트럿츠2도 스트럿츠1 때와 같이 JSTL을 사용.• OGNL Object Graph Navigation Language 라고 불리는 강력하고 유연한 표현 언어를 지원.j p g g g 라 불리는 강력하 유연한 현 언어를 지원

뷰와 값의 연결– 뷰와 값의 연결• ValueStack 이라는 기술을 사용.• View의 재사용 가능.

– 다양한 플러그인 기능• 차트 지원의 JFreeChart

리포트 출력을 위한 J R t• 리포트 출력을 위한 JasperReport• 레이아웃 적용을 위한 Sitemesh• DI, AOP를 지원하는 Spring

– 다양한 리절트 타입의 지원 및 프로파일링• JSP 외에 FreeMarker, Velocity등의 사용이 가능.• 요청이 처리되는 모든 과정의 프로파일링이 가능• 요청이 처리되는 모든 과정의 프로파일링이 가능.

– 의존성 주입 지원• Google Guice 프레임워크 사용.

Struts2 개념도

S 2 개발의 핵심• Struts2 개발의 핵심– 액션 클래스 : Action Class

리절트 페이지 JSP 등– 리절트 페이지 : JSP 등– struts.xml : 환경 설정 Configuration

: 액션과 리절트와의 관계 설정: 액션과 리절트와의 관계 설정

A i 클래스와 R l 페이지• Action 클래스와 Result 페이지

Filt Di t h• FilterDispatcher– Struts2의 컨트롤러인 FilterDispatcher를 WEB-INF\web.xml에

등록한다등록한다.

<filter><filter-name>struts</filter-name><filter name>struts</filter name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher

</filter-class>/</filter>

<filter-mapping>pp g<filter-name>struts</filter-name><url-pattern>/*</url-pattern>

</filter-mapping>

l 파일 생성• struts.xml 파일 생성– WEB-INF/classes/struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC " //Apache Software Foundation//DTD <!DOCTYPE struts PUBLIC -//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts><package name="default" extends="struts-default" namespace=""></package></package>

</struts>

i 파일 생성• struts.properties 파일 생성– WEB-INF/classes/struts.properties

struts.i18n.reload=truestruts.devMode = falsestruts.configuration.xml.reload=truestruts.continuations.package = org.apache.struts2.showcasestruts.custom.i18n.resources=globalMessages

i i j#struts.action.extension=jspastruts.url.http.port = 8080#struts.freemarker.manager.classname=customFreemarkerManagert t t ti tstruts.serve.static=true

struts.serve.static.browserCache=falsestruts.multipart.maxSize=2097252

A i 클래스의 원형• Action 클래스의 원형

bli l i {public class MyAction {…public String execute() throws Exception {

...return "success";

}}}

t t l• struts.xml– Action과 Result 페이지 정의

• 기본 액션 메소드인 execute() 메소드는 String 타입을 반환한다• 기본 액션 메소드인 execute() 메소드는 String 타입을 반환한다. • 액션 메소드가 반환하는 문자열은 액션 실행이 끝난 후 어떤 리절트를 실행할지

결정하기 위해 사용된다. • 액션 메소드가 반환하는 이 문자열값을 ‘리절트 코드 ’라 부른다• 액션 메소드가 반환하는 이 문자열값을 리절트 코드 Result Code’라 부른다.• 액션을 호출하려면 사용자는 '액션이름.action' 형식을 사용한다

<action name="myAction" class="example.MyAction"><result name="success">/myPage.jsp</result>/ y g j p /

</action>

< ti /> 요소는 액션을 정의할 때 사용한다– <action /> 요소는 액션을 정의할 때 사용한다.– <action /> 요소는 name, class, method 속성을 갖는다.

• method 속성은 액션 메소드 명이 execute 일 경우 생략 가능하다.method 속성은 액션 메소드 명이 execute 일 경우 생략 가능하다.

– <result /> 요소는 액션 수행이 완료된 후 실행될 리절트를 정의할 때사용한다.

– <result /> 요소는 <action /> 요소의 사이에 정의하고, name, type 속성을 갖는다.

• name 속성은 리절트 코드가 "success" 일 경우 생략 가능하다.name 속성은 리절트 코드가 success 일 경우 생략 가능하다.• type 속성은 dispatcher인 경우 생략 가능하다. (일반적인 경우가 dispatcher이다)

S 2 T Lib 사용• Struts2 Tag Libary 사용– JSP의 상단에 Struts2 Tag Library 설정 정보를 추가한다.

<%@ taglib prefix="s" uri="/struts-tags" %>

– JSP에서 태그 사용 형식

<s:tagName attributeName="..." />

A i 클래스의 와 와의 관계• Action 클래스의 property 와 tag와의 관계– ValueStack과 OGNL 이용.

Action Class JSPStruts2

public class MyAction {private String myProperty;

<%@ taglib prefix="s" uri="/struts-tags" %>

public String execute() throws ExceptionmyProperty = "프로퍼티의 값";return "success";

}

<html><head><title>example</title>

</head>

b dpublic String getMyProperty() { return myProperty; }public void setMyProperty(String myProperty) {

this.myProperty = myProperty;}

}

<body><s:property value="myProperty" />

</body></html>

}

OGNL• OGNL [Object Graph Navigation Language]

– 정적 메소드 또는 인스턴스 메소드를 실행하고, 컬렉션 타입의데이터 또한 사용할 수 있도록 Lambda 표현식과 같은 진보된데이터 또한 사용할 수 있도록 Lambda 표현식과 같은 진보된표현식을 제공.

– XWork 내에서 확장된 풍부한 타입 변환 모델 제공.– 빈의 프로퍼티는 프로퍼티 이름으로 엑세스.

V l St k• ValueStack– XWork와 Struts2의 동적 컨텍스트 기반의 핵심 부분으로 객체의

스택이다스택이다.– 표현식에 사용된 그 이름의 property를 갖는 첫 번째 객체를

검색함으로써 동적으로 프로퍼티 값을 찾는다.– Struts2는 Action이 실행되는 동안 Action을 스택 상에 저장하여

ValueStack을 구축한다.Struts2는 요청으로부터 처리해야 할 파라미터 값과 Action의– Struts2는 요청으로부터 처리해야 할 파라미터 값과 Action의property를 ValueStack을 통해 액세스한다.

I t t• Interceptor– Interceptor는 Action실행의 전과 후에서 다른 작업을 추가로 실행할

수 있도록 분리된 요청 처리 단계를 제공수 있도록 분리된 요청 처리 단계를 제공

A ti 이 실행되기 전과 후에 요청이 다른 객체에 의해서– Action이 실행되기 전과 후에 요청이 다른 객체에 의해서가로채어질 수 있다. 이러한 것을 Interceptor라 부른다.

– Interceptor란 Action 실행 주위로 실행될 수 있는 코드를 캡슐화한다.

이중 서 밋 방지• 이중 서브밋 방지

• 타입 변환

• 입력 파라미터의 값을 액션 클래스의 프로퍼티에 설정

• 유효성 검사

• 파일 업로드

FilterDispatcher는 새로운 ActionProxy를FilterDispatcher는 새로운 ActionProxy를생성하고ActionProxy의 execute()를호출한다.

Interceptor는 Action으로 보내어지는요청을 가로챈다.

S 2에서 제공하는 I 의 종류• Struts2에서 제공하는 Interceptor의 종류– Alias Interceptor

• 요청 사이에 서로 다른 이름을 가진 비슷한 파라미터를 컨버팅한다• 요청 사이에 서로 다른 이름을 가진 비슷한 파라미터를 컨버팅한다.

– Chaining Interceptor • 이전 액션의 프로퍼티를 현재 액션에서 사용할 수 있게 한다. 이전 액션

정의에서 <result type="chain"> 과 함께 사용한다.

– Checkbox Interceptor • 체크되지 않은 체크박스를 감지할 수 있는 코드를 자동으로 추가하고, 기본체크되지 않은 체크박스를 감지할 수 있는 코드를 자동으로 추가하고, 기본

값(보통 false)을 가진 파라미터로 추가한다. 체크 되지 않은 체크박스를감지하기 위해 특별한 이름을 가진 히든 필드를 사용한다.

– Cookie InterceptorCookie Interceptor • 액션에 설정 가능한 '이름/값'을 가지는 쿠키 삽입 (2.0.7부터 추가)

– Conversion Error Interceptor • 액션 컨텍스트에서 액션의 필드 오류로 변환한다.

C t S i I t t– Create Session Interceptor • 자동으로 HttpSession을 생성한다. Token Interceptor와 같이 HttpSession이

적절하게 작동하 도록 요구하는 인터셉터에 유용하다.

– Debugging Interceptor • 페이지 뒷 단에 데이터를 출력할 수 있는 몇몇 디버깅 화면을 제공한다.

Execute and Wait Interceptor– Execute and Wait Interceptor • 백그라운드에서 액션을 실행하고 대기 상태 페이지를 사용자에게 즉각적으로

보낸다.

– Exception Interceptor • 예외를 리절트에 매핑 한다.

– File Upload InterceptorFile Upload Interceptor • 파일 업로딩을 쉽게 할 수 있게 지원한다.

I18 I t t– I18n Interceptor• 사용자 세션에 대한 지역 정보를 기억한다.

– Logger Interceptor gg p• 액션의 이름을 출력한다.

– Message Store Interceptor • ValidationAware 인터페이스를 구현한 액션에 대한 액션 메시지,오류, 필드

오류를 저장하고 처리한다.

– Model Driven Interceptor • 액션이 ModelDriven 인터페이스를 구현하였다면 getModel() 결과를 밸류 스택에

넣어준다.

– Scoped Model Driven InterceptorScoped Model Driven Interceptor • 액션이 ScopedModelDriven 인터페이스를 구현하였다면 인터셉터는

스코프로부터 모델을 저장 처리하고, setModel() 메소드를 호출하여 액션에저장한다.저장한다.

P t I t t– Parameters Interceptor • 요청 파라미터를 액션에 저장한다.

– Prepare Interceptor p p• 액션이 Preparable 인터페이스를 구현하였다면 prepare() 메소드를 호출한다.

– Scope Interceptor • 액션 상태 값을 세션 또는 애플리케이션 스코프에 저장하는 간단한 메커니즘

– Servlet Config Interceptor • HttpServletRequest와 HttpServletResponse를 다루는 맵을 엑세스 할 수 있다HttpServletRequest와 HttpServletResponse를 다루는 맵을 엑세스 할 수 있다.

– Static Parameters Interceptor • struts.xml에 정의된 파라미터 값을 액션에 저장한다. <action> 태그 의 직속

자식으로 태그가 있다자식으로 <param> 태그가 있다.

R l I t t– Roles Interceptor • 사용자가 올바른 JAAS 권한을 가진다면 액션은 실행된다.

– Timer Interceptor p• 인터셉터와 뷰 처리를 포함하여 액션의 작업 처리 시간을 출력한다.

– Token Interceptor • 액션 내에 유효한 토큰이 존재하는지 검사하고 폼을 이중으로 서브밋하는 것을

방지한다.

– Token Session Interceptor • Token Interceptor와 같다, 그러나 유효하지 않은 토큰을 가지고 있을 때 세션

내에 서브밋된 데이터를 저장한다.

– Validation InterceptorValidation Interceptor • 액션이름-validation.xml 내에 정의된 유효성 검사 규칙을 사용하여 유효성

검사를 한다.

W kfl I t t– Workflow Interceptor • 액션 클래스 내의 validate() 메소드를 호출한다. 액션에서 오류가 발생했다면

그것은 INPUT 뷰로 반환한다.

– Parameter Filter Interceptor • N/A • 액션의 목록으로부터 파라미터를 제거한다액션의 목록으로부터 파라미터를 제거한다.

– Profiling Interceptor • 파라미터를 통해 프로파일링을 작동시킨다.

A ti C t t• ActionContext– Application, Session, ActionInvocation, Request, Parameter, Locale

정보와 같이 미리 정의된 값을 얻거나 저장하기 위해 도움을 주는정보와 같이 미리 정의된 값을 얻거나 저장하기 위해 도움을 주는ThreadLocal 맵이다.

– ActionContext는 현재 실행 환경에 대한 다양한 정보를 포함한다. 이러한 정 는 가 생성되기 전에이러한 Context 정보는 ActionProxy가 생성되기 전에FilterDispatcher에 의해 설정되고 ActionProxyFactory의createActionProxy() 메소드에 전달된다.

– Interceptor, Action, Result가 실행 시 사용자의 코드에서ThreadLocal로부터 ActionContext를 얻기 위해ActionContext getContext() 메소드를 사용할수 있다ActionContext.getContext() 메소드를 사용할수 있다.

A ti M• ActionMapper– ActionMapper는 HTTP 요청과 Action을 연결한다.

A ti M 는 l을 해석하여 N 와 A ti 이름을– ActionMapper는 url을 해석하여 Namespace와 Action 이름을추출한다.

– FilterDispatcher에서 ActionMapper를 통해 생성된 ActionMapping p 에서 pp 를 통해 생성된 pp g객체는 method, parameter, result등의 정보를 갖지 않는다.

– 기본 AcitonMapper로 DefaultActionMapper가 사용 된다.할– ActionMapper는 설정을 통해서 다른 ActionMapper를 사용할 수

있다.• RestfulActionMapperpp• Restfule2ActionMapper• Custom ActionMapper• CompositeActionMapper• CompositeActionMapper

2.2 Spring 소개

S i 의 취지• Spring의 취지– “J2EE는 사용하기 쉬워야 한다”는 단순한 철학을 지키려 한다.

좋은 설계가 기술 자체보다 중요하다– 좋은 설계가 기술 자체보다 중요하다.– 인터페이스를 통한 느슨한 결합의 자바 빈은 훌륭한 모델이다.– 코드는 테스트하기 쉬워야 한다코드는 테스트하기 쉬워야 한다.– 좋은 설계가 기술 자체보다 중요하다.

• 구현 방법에 상관없이 애플리케이션을 위한 최상의 설계를 고려해야 한다.• 대다수 애플리케이션은 EJB가 제공하는 서비스가 거의 필요없다.• 스프링의 사상은 코드를 필요한 만큼만 간단하게 유지하는 것이다.

S i ?• Spring?– Spring은 'Rod Johnson'이 만든 OpenSource 프레임워크이다.

S i 은 복잡한 E t i A li ti 개발을 겨냥해 만들어졌다– Spring은 복잡한 Enterprise Application 개발을 겨냥해 만들어졌다.– Spring은 평범한 자바 빈을 사용하여 EJB에서만 가능했던 일을 모두

이루어 낸다.이루어 다

– Spring은 '단순성', '테스트 용이성', '느슨한 결합성'의 측면에서이점을 얻을 수 있다.

S i 은 경량의 I C와 AOP 컨테이너 프레임워크이다– Spring은 경량의 IoC와 AOP 컨테이너 프레임워크이다.– IoC [Inversion of Control] : 제어 역행

• Spring은 제어 역행 기술을 통해 애플리케이션의 느슨한 결합을 도모한다.Spring은 제어 역행 기술을 통해 애플리케이션의 느슨한 결합을 도모한다.• IoC가 적용되면 객체는 의존하는 다른 객체를 생성하거나 찾는 대신 수동적으로

의존성을 부여받는다.• 객체가 컨테이너로부터 의존성을 검색하는 것이 아니라 컨테이너가 객체에게객체가 컨테이너로부터 의존성을 검색하는 것이 아니라, 컨테이너가 객체에게

의존성을 부여한다는 의미이다.

– AOP [Aspect-Oriented Programming] : 관점지향S i 은 관점지향 프로그래밍을 지원한다• Spring은 관점지향 프로그래밍을 지원한다.

• 관점지향 프로그래밍은 애플리케이션 비즈니스 로직을 시스템 서비스로부터분리하여 응집된 개발을 가능하게 한다.

시 템 감시- 시스템 감시

- 트랜잭션 관리 등

컨테이너– 컨테이너• 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서

스프링은 일종의 컨테이너이다.• 빈의 인스턴스를 하나만 생성하거나, 필요할 때마다 새로운 인스턴스를

생성하도록 설정할 수 있다. • 빈들이 서로 어떻게 연관되어야 하는지 설정할 수 있다.

– 프레임워크• Spring을 사용하면 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할• Spring을 사용하면 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할

수 있다.• Spring에서 애플리케이션 객체는 보통 XML 파일에 선언하는 방식으로

구성된다.구성된다.

S i 의 구성 모듈• Spring의 구성 모듈

C C t i & S ti Utiliti• Core Container & Supporting Utilities– 핵심 컨테이너는 스프링의 근본적인 기능을 제공한다.

모든 스프링 기반 애플리케이션의 심장인 B F t 가 포함되어– 모든 스프링 기반 애플리케이션의 심장인 BeanFactory가 포함되어있다.

– BeanFactory는 IoC를 적용하여 애플리케이션의 설정과 의존성을y 를 적용하여 애플리케이 의 설정과 의 성을실제 코드로부터 분리하는 팩토리 패턴의 구현체이다.

A li ti C t t M d l• Application Context Module– 스프링을 컨테이너로 만든 것이 Core Container의 BeanFactory라면,

스프링을 프레임워크로 만드는 것은 Context Module이다스프링을 프레임워크로 만드는 것은 Context Module이다.– 국제화 메시지, 애플리케이션 생명 주기 이벤트, 유효성 검증 등을

지원하여 BeanFactory를 확장한다.– 이메일, JNDI 접근, EJB 연계, 리모팅, 스케쥴링 등의 엔터프라이즈

서비스를 추가 제공한다.벨로시티(Velocity) 프리마커(FreeMarker)와 같은 템플릿– 벨로시티(Velocity), 프리마커(FreeMarker)와 같은 템플릿프레임워크와의 통합을 지원한다.

AOP M d l• AOP Module– 관점지향 프로그래밍을 지원한다.

다른 AOP 프레임워크 간의 상호운영을 보장하기 위해 스프링의– 다른 AOP 프레임워크 간의 상호운영을 보장하기 위해 스프링의AOP는 AOP Alliance에서 정의한 API를 기초로 한다.

* http://aopalliance.sourceforge.net 참조p p g 참

– 메타데이터 프로그래밍을 가능하게 한다.• 메타데이터의 지원을 사용하여 어디에 어떻게 Aspect를 적용할지 알려주는

어노테이션을 소스 코드에 추가할 수 있다어노테이션을 소스 코드에 추가할 수 있다.

JDBC & DAO M d l• JDBC & DAO Module– JDBC로 작업할 때 연결 취득, 명령 실행, 결과 집합 처리, 연결 끊기

등의 다량의 반복적인 코드를 추상화하여 데이터베이스 접근등의 다량의 반복적인 코드를 추상화하여 데이터베이스 접근코드를 간결하게 유지하도록 하며, 데이터베이스 자원을 반환하지않아서 발생되는 문제를 방지한다.

링 애플리케이션 내의 객체를 위한 랜잭션 서비 를– 스프링 애플리케이션 내의 객체를 위한 트랜잭션 서비스를제공한다.

ORM M i M d l• ORM Mapping Module– JDBC 상위에서 ORM(Object/Relational Mapping) 툴을 사용할 수

있도록 한다있도록 한다.– 스프링은 자체 ORM 솔루션을 구현하지 않고, 하이버네이트, JDO,

iBatis Data Mapper와 같은 ORM 프레임워크와 연동할 수 있는기능을 제공한다기능을 제공한다.

– JDBC 뿐만 아니라 ORM 프레임워크에 대한 트랜잭션 관리도지원한다.지원한다.

W b C t t & Utilit M d l• Web Context & Utility Module– Web Context Module은 Application Context Module 위에 구축되어

있으며 웹 기반 애플리케이션에 적합한 컨텍스트를 제공한다있으며, 웹 기반 애플리케이션에 적합한 컨텍스트를 제공한다.– 파일 업로드를 위한 멀티 파트 요청 처리나 요청 파라미터를

비즈니스 객체로 바인딩하는 등의 다양한 웹 관련 작업을 추가지원한다지원한다.

MVC F k• MVC Framework– 웹 애플리케이션 구축을 위한 Model / View / Controller

프레임워크를 제공한다프레임워크를 제공한다.– 컨트롤 로직을 비즈니스 객체로부터 분리하기 위해 IoC를

사용한다.– MVC 프레임워크를 사용하면 요청 파라미터를 비즈니스 객체에

선언적으로 바인딩할 수 있다.국제화 메시지 유효성 검사와 같은 스프링의 다른 서비스의 혜택을– 국제화 메시지, 유효성 검사와 같은 스프링의 다른 서비스의 혜택을받는다.

간단한 스프링 애플리케이션 예

S i 애플리케이션의 예• Spring 애플리케이션의 예– 스프링 애플리케이션은 클래스를 설정하는 XML 파일을 사용한다.

H ll S i j• HelloService.java

package org.artszen.spring.hello;package org.artszen.spring.hello;

public interface HelloService {public void sayHello();p y ();

}

– 소프트웨어 설계 방법론 “Design by Contract”에 따른 서비스 인터페이스 구현.– Contract란 자바 인터페이스에서 선언한 메소드를 가리킨다.

H ll S i I l j• HelloServiceImpl.java

package org.artszen.spring.hello;

public class HelloServiceImpl implements HelloService {private String greeting;

public HelloServiceImpl() {}public HelloServiceImpl(String greeting) {

this.greeting = greeting;}}public void sayHello() {

System.out.println(greeting);}}

public String getGreeting() { return greeting;}public void setGreeting(String greeting) { this.greeting = greeting; }

}}

h ll l• hello.xml

<?xml version="1.0" encoding="UTF-8"?>g

<beans>

<bean id="helloService" class="org.artszen.spring.hello.HelloServiceImpl">

<property name="greeting"><value>Hello! Spring.</value>

</property></bean>

/b</beans>

H ll A j• HelloApp.java

package org artszen spring hello;package org.artszen.spring.hello;

//import ...

public class HelloApp {public static void main(String[] args) {

BeanFactory factory = new XmlBeanFactory(y y y(new FileSystemResource("src/hello.xml"));

HelloService hello = (HelloService)factory.getBean("helloService");

hello.sayHello();}

}

B F t 클래스가 스프링 컨테이너이다– BeanFactory 클래스가 스프링 컨테이너이다.– Main() 메소드는 hello.xml 파일을 컨테이너로 로드한 후,

helloService의 인스턴스를 얻기 위해 BeanFactory의 getBean() 의 인 턴 를 얻기 위해 y의 g ()메소드를 호출한다.

– hello.xml 에서 HelloServiceImpl 클래스의 프로퍼터 greeting에 값을설정하기 위해 tt th d 주입을 사용했다 만약 t t설정하기 위해 setter method 주입을 사용했다. 만약 constructor 주입을 사용하려면 다음과 같다.

<constructor-arg><value>Hello! Spring.</value>

</constructor-arg>/constructor arg

스프링 컨테이너의 종류• 스프링 컨테이너의 종류– BeanFactory

i f k b f B F• org.springframework.beans.factory.BeanFactory• 기본적인 의존성 주입을 지원하는 가장 간단한 형태의 컨테이너

– ApplicaitonContext– ApplicaitonContext• org.springframework.context.ApplicationContext• 프로퍼티 파일의 메시지 해석, 이벤트 발행 등의 서비스 제공퍼티 파일의 메시지 해석, 이 발행 등의 서비 제공

B F• BeanFactory– 팩토리 디자인 패턴을 구현한 것이다.

다양한 유형의 빈을 생성하고 분배하는 책임을 진다• 다양한 유형의 빈을 생성하고 분배하는 책임을 진다.

– 객체를 인스턴스화할 때 협업하는 객체 간의 연관 관계를생성한다생성한다.

– 스프링에는 다양한 BeanFactory 구현 클래스가 있다.• 가장 유용한 것은 XmlBeanFactory로서 XML 파일에 기술되어 있는가장 유용한 것 y 서 파일에 기술되어 있

정의를 바탕으로 빈을 로딩한다.

BeanFactory factory = new XmlBeanFactory(new FileSystemResource(“beans.xml”);

MyBean myBean = (MyBean) factory.getBean(“myBean”);

A li ti C t t• ApplicationContext– BeanFactory 보다 좀 더 진보된 컨테이너이다.

표면적으로는 B F t 와 상당히 비슷하다– 표면적으로는 BeanFactory와 상당히 비슷하다. – 둘 다 빈을 로딩하고, 빈들을 Wiring하며, 요청에 따라 빈을

분배한다.분배한다

– ApplicationContext의 추가 기능• 국제화 지원을 위해 텍스트 메시지를 해석한다.

이미지 의 자원을 딩하 범용적인 방법을 제 한다• 이미지 등의 자원을 로딩하는 범용적인 방법을 제공한다.• 리스너로 등록되어 있는 빈에게 이벤트를 발행할 수 있다.

A li ti C t t 의 종류– ApplicationContext 의 종류• ClassPathXmlApplicationContext• 클래스 경로에 있는 XML 파일로부터 컨텍스트 정의를 로딩하며, 컨텍스트

정의를 클래스 경로에 있는 자원으로 취급한다.

– FileSystemXmlApplicationContext• 파일 시스템에 있는 XML 파일로부터 컨텍스트 정의를 로딩한다파일 시스템에 있는 XML 파일로부터 컨텍스트 정의를 로딩한다.

– XmlWebApplicationContext• 웹 애플리케이션에 포함되어 있는 XML 파일로부터 컨텍스트 정의를 로딩한다.

ApplicationContext context = new FileSystemXmlApplicationContext(“c:/beans.xml”);

ApplicationContext context = new ClassPathXmlApplicationContext(“beans.xml”);

B Wi i• Bean Wiring– Spring에서는 어떤 컴포넌트가 다른 컴포넌트와의 연관 관계를

관리할 책임이 없다관리할 책임이 없다.– 대신 컨테이너에 의해 컴포넌트 간의 협업을 위한 참조가 주어진다.– 애플리케이션 컴포넌트 간의 연관 관계를 만드는 행위를애플리케이 컴 의 연 계를 행위를

‘Wiring’이라고 한다.

B i Wi i• Basic Wiring– 컨텍스트 파일의 루트 요소는 <beans> 이다.

<b > 요소는 <b > 하위 요소를 가진다– <beans> 요소는 <bean> 하위 요소를 가진다.• <bean> 요소는 스프링 컨테이너 안에서 설정해야 하는 자바 빈을 정의한다.

<?xml version=1.0 encoding=“UTF-8” ?>

<!DOCTYPE beans PUBLIC “-”-//SPRING//DTD BEAN//EN”<!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//ENhttp://www.springframework.org/dtd/spring-beans.dtd>

<beans>

빈 인스턴스루트 요소beans

<bean id=“myBean” class=“example.MyBean”/><bean id=“someBean” class=“example.SomeBean” />

</beans>/

빈 추가– 빈 추가• 스프링의 빈을 위한 기본 설정에는 빈의 id와 클래스 전체 경로가 필요하다.

빈의 는

<bean id=“myBean” class=“example.MyBean” />

빈의 id는 “myBean”

빈의 클래스 전체 경로빈의 클래스 전체 경로

tt th d를 통한 의존성 주입– setter method를 통한 의존성 주입• Setter 주입은 표준 명규칙에 따라 빈의 속성에 값을 채우는 기법이다.

– property의 setter 메소드를 호출하여 property에 값을 저장한다– property의 setter 메소드를 호출하여 property에 값을 저장한다.– <bean> 요소의 하위 요소인 <property> 요소가 setter mether를

통해 빈의 속성에 주입하는 수단이 된다.통해 빈의 속성에 주입하는 수단이 된다

– Java Bean의 property에 주입하고자 하는 값을 <property> 요소안에서 정의할 수 있다.

– 이 값으로는 원시자료형, 컬렉션, 다른 빈까지 어떤 것이든주입할 수 있다.

74

단순 빈 설정– 단순 빈 설정• int나 String과 같은 단순한 타입의 속성에 값을 설정하기 위해 <property> 요소의

하위 요소인 <value> 요소를 사용한다.

class public MyBean {private int myInt;p y

public void setMyInt(int myInt) { this.myInt = myInt; }}

<bean id=“myBean” class=“example MyBean” ><bean id= myBean class= example.MyBean ><property name=“myInt”><value>3</value></property>

</bean>

75

다른 빈 참조하기– 다른 빈 참조하기• <property> 요소를 사용하여 다른 빈을 참조하는 특성을 설정할 수 있다.

class public SomeBean {private MyBean myBean;public void setMyBean(MyBean myBean) { this.myBean = p y ( y y ) { y

myBean;}}

<bean id=“someBean” class=“example.SomeBean” ><property name=“myBean”>

f b “ B ” /<ref bean=“myBean” /></property>

</bean>

76

A t i i• Autowiring– <bean> 요소에 autowiring 속성을 설정하여 Spring이 자동으로 빈을

wiring할 수 있다wiring할 수 있다.

<bean id=“myBean” class=“example MyBean” <bean id myBean class example.MyBean autowire=“autowire_type” />

77

A t Wi i 의 4 종류– Auto Wiring의 4 종류• byName

: wiring하려는 프로퍼티의 이름과 동일한 이름이나 id를 가진 빈을 wiring한다. 해당 빈을 찾지 못하면 그 프로퍼티는 wiring되지 않은 상태로 남는다.

• byType: wiring하는 프로퍼티의 타입과 동일한 타입을 가진 빈을 wiring 한다. 빈을 찾지못하면 그 프로퍼티는 wiring되지 않은 상태로 남고, 하나 이상의 빈을 찾으면org.springframework.beans.factory.UnsatisfiedDependencyException이 던져진다.

• constructor: wiring하려는 빈의 생성자를 실행시킨다. 이 때 생성자의 파라미터와 같은타입의 객체를 찾는다. 모호한 빈이나 생성자가 발견될 경우org.springframework.beans.factory.UnsatisfiedDependencyException이 던져진다.

• autodect: constructor에 의한 autowiring이 먼저 시도한 후, byType을 이용한다. 모호함이발견될 경우 constructor나 byType 경우와 동일한 방법으로 처리된다.

78

일반적인 빈 설정– 일반적인 빈 설정

<bean id=“myBean” class=“example.MyBean” >t “ P t ”<property=“myProperty”>

<ref bean=“someBean”></property>

</bean></bean>

– Autowiring을 사용한 설정

<bean id=“myBean” class=“example.MyBean” autowire=“byName” />

79

B i Wi i 과 A i i 혼용• Basic Wiring과 Autowiring 혼용– Autowiring을 선택해도 Basic Wiring을 혼용할 수 있다.

<bean id=“myBean” class=“example.MyBean” autowire=“byName”><property=“myProperty”>

f b “ B ”<ref bean=“someBean”></property>

</bean>

80

A t i i 을 기본으로 설정– Autowiring을 기본으로 설정• <beans> 요소의 default-autowire를 설정함으로써 스프링 설정 파일에 있는 모든

빈에 대해 기본으로 Autowiring이 적용되도록 할 수 있다.

<beans default-autowire="byName">…

</bean>

81

S 2의 S i Pl i• Struts2의 Spring Plugin– Struts2의 기본 ObjectFactory 는 Google Guice를 사용한다.

St t 2의 Obj tF t 를 S i 으로 변경할 수 있다– Struts2의 ObjectFactory를 Spring으로 변경할 수 있다.

– Struts2의 ObjectFactory 변경Struts2의 ObjectFactory 변경• struts.properties 에서 변경

struts objectFactory = org apache struts2 spring StrutsSpringObjectFactorystruts.objectFactory = org.apache.struts2.spring.StrutsSpringObjectFactory또는struts.objectFactory = spring

S i Pl i 의 특징• Spring Plugin의 특징– Spring Plugin은 Action, Interceptor, Result를 Spring에 의해서 생성할

수 있게 한다수 있게 한다.– Struts2가 생성한 객체를 Spring에 의해서 Autowiring할 수 있게 한다.– Action을 Spring과 함께 사용하는 것은 선택사항이다.을 p g과 함께 사용하 것 택사항이다

– Action 객체 의존성 주입• Spring ObjectFactory를 사용하도록 설정했다면 Struts2는 ActionMapping을

참고하여 Action 객체를 생성한 후 Action을 Spring에 주입한다참고하여 Action 객체를 생성한 후 Action을 Spring에 주입한다.• Spring ObjectFactory를 사용하면 Action 클래스의 property와 동일한 이름을 가진

Spring 설정 파일에 정의된 Bean들을 자동으로 생성하여 주입시켜 준다.

이러한 특징은 S 2에서 스프링을 함께 사용하는 가장 기본적인– 이러한 특징은 Struts2에서 스프링을 함께 사용하는 가장 기본적인목적이다.

S i Obj tF t 를 사용한다면 기본적으로 객체를 생성하기– Spring ObjectFactory를 사용한다면 기본적으로 객체를 생성하기위해 Spring을 사용하려 시도하지만, 만약 Spring이 객체를 생성할수 없을 경우 프레임워크가 자체적으로 객체를 생성한다.

S i 설정• Spring 설정– web.xml에 리스너 등록

<listener><listener-class>

i f k b t t C t tL d Li torg.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

S i 설정• Spring 설정– web.xml에 스프링 설정 파일 등록

<!-- Context Configuration locations for Spring XML files --><context-param>

<param-name>contextConfigLocation</param-name><param name>contextConfigLocation</param name><param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xmlp pp</param-value>

</context-param>

S i 설정 파일( li ti C t t l)에 객체 등록– Spring 설정 파일(applicationContext.xml)에 객체 등록

<?xml version="1.0" encoding="UTF-8"?>!DOCTYPE b PUBLIC " //SPRING//DTD BEAN//EN" <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<b d f lt t i "b N "><beans default-autowire="byName"><bean id="securityService" class="example.SecurityService"/>...

</beans>

2.3. iBatis 소개

iB i 의 목적• iBatis의 목적– iBatis의 SQL Map API는 자바빈즈를 PreparedStatement파라미터와

ResultSets으로 쉽게 맵핑할수 있도록 한다ResultSets으로 쉽게 맵핑할수 있도록 한다. – SQL Maps의 기본적인 개념은 단순함이다.

: 자바코드의 20%를 사용하여 JDBC기능의 80%를 제공하는 간단한자바 의 를 사용하여 기능의 를 제공하 단한프레임워크라는 의미

iB i 작동 방법• iBatis 작동 방법– XML 문서를 사용한 매핑

• SQL Maps는 Java Bean Map Primitive Type(String Integer)과 SQL문을 위한• SQL Maps는 Java Bean, Map, Primitive Type(String, Integer)과 SQL문을 위한XML문서를 맵핑하기 위한 XML서술자를 사용하는 매우 간단한 프레임워크를제공한다.

– LifeCycle– LifeCycle1. 파라미터(JavaBean, Map or Primitive Type)로 객체를 허용한다.

• 파라미터 객체는 update문 내에 입력 값을 설정하기 위해 사용되거나, 쿼리문의where절을 설정하기 위해서 사용.

2. 맵핑된 statement을 실행. • SQL Maps프레임워크는 PreparedStatement 인스턴스를 생성하고 제공된SQL Maps프레임워크는 PreparedStatement 인스턴스를 생성하고, 제공된

파라미터 객체를 사용해서 파라미터를 설정한다. • 그리고 statement를 실행하고 ResultSet으로부터 결과 객체를 생성한다.

3 d t 의 경우에 영향을 미친 의 숫자를 반환3. update의 경우에 영향을 미친 rows의 숫자를 반환. • 조회문일 경우 단일 객체 또는 컬렉션 객체를 반환한다. • 파라미터처럼 결과 객체는 Java Bean, Map, Primitive 타입 또는 XML이 될 수

있다.

iBatis 개념도

iB i 설치 및 사용방법• iBatis 설치 및 사용방법– 라이브러리 설치

• SQL Maps 프레임워크 설치는 간단하게 classpath에 필요한 JAR파일을 두면• SQL Maps 프레임워크 설치는 간단하게 classpath에 필요한 JAR파일을 두면된다.

• JVM시작 시 정의된 클래스패스에 두거나 웹 애플리케이션의 /WEB-INF/lib에둘수도 있다.둘수도 있다.

– /WEB-INF/lib/ibatis-2.3.4.726.jar– SQL Map 설정 파일

• iBatis는 SqlMapConfig.xml

SQL M 설정 파일 S lM C fi l– SQL Map 설정 파일 : SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>g<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN""http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>q p g

<!--The properties (name=value) in the file specified here can be used placeholders in this config file (e.g. “${driver}”. The file is relative to the classpath and is completely optional. --><properties resource="examples/sqlmap/maps/SqlMapConfigExample.properties " /><!--These settings control SqlMapClient configuration details, primarily to do with transaction management. They are all optional (more detail later in this document). --><settings

cacheModelsEnabled="true"enhancementEnabled="true"lazyLoadingEnabled="true"

maxRequests="32"maxSessions="10"maxTransactions="5"useStatementNamespaces="false” />useStatementNamespaces false /

<!--Type aliases allow you to use a shorter name for long fully qualified class names. --><typeAlias alias="order" type="testdomain.Order"/><!--Configure a datasource to use with this SQL Map using SimpleDataSourg Q p g pce. Notice the use of the properties from the above resource --><transactionManager type="JDBC" >

<dataSource type="SIMPLE"><property name="JDBC.Driver" value="${driver}"/>p p y ${ } /<property name="JDBC.ConnectionURL" value="${url}"/><property name="JDBC.Username" value="${username}"/><property name="JDBC.Password" value="${password}"/><property name="JDBC.DefaultAutoCommit" value="true" />p p y /<property name="Pool.MaximumActiveConnections" value="10"/><property name="Pool.MaximumIdleConnections" value="5"/><property name="Pool.MaximumCheckoutTime" value="120000"/>

<property name="Pool.TimeToWait" value="500"/><property name="Pool.PingQuery" value="select 1 from ACCOUNT"/><property name="Pool.PingEnabled" value="false"/><property name="Pool.PingConnectionsOlderThan" value="1"/><property name="Pool.PingConnectionsNotUsedFor" value="1"/>

</dataSource></transactionManager>

<!--Identify all SQL Map XML files to be loaded by this SQL map. Notice the pathsare relative to the classpath. For now, we only have one… --><sqlMap resource="examples/sqlmap/maps/Person.xml" />

</sqlMapConfig>

<t Ali > 요소– <typeAlias> 요소• 전체 클래스 명을 참조하기 위한 짧은 이름을 명시하도록 한다.

<typeAlias alias="shortName" type="com.long.class.path.Class"/><typeAlias> 요소

– <resultMap> 요소• select 문을 수행했을 때 데이터베이스로부터 가져온 데이터를 자바 객체에

매핑하기 위한 정의매핑하기 위한 정의

<resultMap id="UserResult" class="User"><result property="userId" column="USER_ID"/>

l " " l "NAME"/<result property="name" column="NAME"/><result property="password" column="PASSWORD"/>

</resultMap>

– Query 문 <요소>• query 문을 정의하기 위한 요소는 여러 가지를 사용한다.• <select> <insert> <update> <delete> <statement>• <select>, <insert>, <update>, <delete>, <statement>

<select id="listUser" resultMap="UserResult"><select id="listUser" resultMap="UserResult">SELECT * FROM USER_INFO

</select>

<select id="selectUser" parameterClass="String" resultMap="UserResult">SELECT * FROM USER INFO WHERE USER ID = #value#_ _

</select>

<insert id="insertUser" parameterClass="User"><insert id= insertUser parameterClass= User >INSERT INTO USER_INFO (USER_ID, NAME, PASSWORD ) VALUES ( #userId#, #name#, #password#)

</insert>

3 D3. Demo

3.1. 환경구축3.2. Sample 애플리케이션 개발

1

3.1. 개발환경 구축

JB 5 1 0 GA 설치• JBoss 5.1.0 GA 설치– 다운 받은 jboss-5.1.0.GA-jdk6.zip 의 압축을 푼다.

C \JB S i \jb 5 1 0 GA 폴더로 옮긴다– C:\JBossSeminar\jboss-5.1.0.GA 폴더로 옮긴다.

• Eclispe Galileo (3.5) 설치다운받은 li j lil i 32 i 의 압축을 푼다– 다운받은 eclipse-jee-galileo-win32.zip 의 압축을 푼다.

– C:\JBossSeminar\eclipse 폴더로 옮긴다.

• JBoss tools 3 1 설치• JBoss tools 3.1 설치– 다운받은 JBossTools-ALL-win32-3.1.0.M1-N200906060434-H241.zip

의 압축을 푼다.의 압축을 푼다

– C:\JBossSeminar\eclipse 폴더에 덮어 쓴다.

E li 실행• Eclipse 실행• C:\JBossSeminar\eclipse\eclipse.exe 를 실행한다.

E li 에서 JB 5 1서버 등록• Eclipse에서 JBoss5.1서버 등록– |Window| Preferences | 메뉴를 실행하여 Preferences 창을 띄운다.

S | R ti E i t 항목을 선택한 후 [Add] 버튼을– Server | Runtime Environments항목을 선택한 후 [Add] 버튼을클릭하여 New Server Runtime Environment 창을 띄운다.

– JBoss Community | JBoss 5.1 Runtime 을 선택한 후 [Next] 버튼을y | 을 택한 후 [ ] 버튼을클릭한다.

[B ] 버튼을 이용하여 H Di t 를 C \JB S i \jb– [Brower] 버튼을 이용하여 Home Directory 를 C:\JBossSeminar\jboss-5.10.GA 를 선택한 후 [Finish] 버튼을 클릭한다.

E li 에서 J 설정• Eclipse에서 Java 설정– |Window|Preferences 메뉴를 실행하여 Java| Compiler를 1.6으로

설정한다설정한다.– Java|Installed JREs 에서 [Add] 버튼을 이용하여 jdk1.6을 추가한다.

S Vi 추가• Server View 추가– Window|Show View|Other 메뉴를 선택하여 Show View 창을 띄운다

S |S 항목을 선택한 후 [OK] 버튼을 클릭한다– Server|Servers 항목을 선택한 후, [OK] 버튼을 클릭한다.– 추가된 Server View에서 마우스 우측 버튼을 클릭하여 팝업메뉴의

New|Server 를 선택한 후 New Server 창을 띄운다.| 를 택한 후 창을 띄 다

– JBoss Community|JBoss AS 5.1 을 선택한 후, [Finish] 버튼을클릭한다.

E li S Vi 에서 JB 5 1 실행• Eclipse Server View에서 JBoss 5.1 실행

– 그림에서 보이는 JBoss 5.1 Runtime Server [Stopped] 항목에서에서 이 [ pp ] 항목에서마우스 우측 버튼을 클릭한 후 팝업메뉴에서 Start 를 선택하여JBoss5.1을 실행시킨다.

HSQLDB M 실행• HSQLDB Manager 실행– 브라우저에서 http://localhost:8080 을 실행한다.

M thi JB A I t 의 JMX C l 을 클릭한다– Manage this JBoss As Instance 의 JMX Console을 클릭한다.– 우측의 jboss 항목의 database=localDB,service=Hypersonic 링크를

클릭한다.클릭한다

– startDatabaseManager 항목의 [Invoke] 버튼을 클릭하여 HSQL Manager 창을 띄운다.

• HSQL 데이터베이스에서 사용자 테이블 생성– HSQL Manager 창에 다음의 쿼리를 입력한 후 [Execute SQL] 버튼을

클리한다.– CREATE TABLE user info (user id VARCHAR(20) primary keyCREATE TABLE user_info (user_id VARCHAR(20) primary key,

name VARCHAR(50), password VARCHAR(10));

E li 에서 2 프로젝트 생성• Eclipse 에서 struts2 프로젝트 생성– New|Project 메뉴을 선택하여 New Project 창을 띄운다.

W b|D i W b P j t 를 선택한 후 [N t] 버튼을 클릭한다– Web|Dynamic Web Project 를 선택한 후 [Next] 버튼을 클릭한다.– Project name 항목에 'struts2' 를 입력한 후 [Finish] 버튼을 클릭한다.

• struts2 프로젝트에 struts2 라이브러리 복사• struts2 프로젝트에 struts2 라이브러리 복사– plugin 파일을 제외

b l 에 Fil Di h 등록• web.xml 에 FilterDispatcher 등록

<filter>te<description>struts2 controller</description><display-name>struts2</display-name><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>g p p p /

</filter>

<filter-mapping><filter-name>struts2</filter-name>/<url-pattern>/*</url-pattern>

</filter-mapping>

/ l 파일 생성• src/struts.xml 파일 생성

<?xml version="1.0" encoding="UTF-8" ?>o 0 od g U 8<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">

<struts><package name="default" namespace="/" extends="struts-default"></package>

</struts>/

L b1 문자열 출력 ( i )• Lab1 : 문자열 출력 (greeting)– example.ExampleAction 액션 클래스 생성

/ l / l j 생성– /example/example.jsp 생성

– struts.xml에 액션 정의

L b2 사용자 목록출력/등록/조회• Lab2 : 사용자 목록출력/등록/조회– 라이브러리 복사

• struts2 spring plugin 복사• struts2 spring plugin 복사

• spring 라이브러리 복사

• iBatis 라이브러리 복사

– web.xml 에 spring 설정• contextConfigLocation 파라미터 등록

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:/config/applicationContext.xml</param-value>

/ t t</context-param>

• spring listener 등록• spring listener 등록

<listener><listener-class>

i f k b t t C t tL d Li torg.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

– Spring 설정 파일 applicationContext.xml 생성• src/config/applicationContext.xml

iB ti 설정 파일– iBatis 설정 파일• src/config/sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfigPUBLIC " //ibatis apache org//DTD SQL Map Config 2 0//EN" PUBLIC -//ibatis.apache.org//DTD SQL Map Config 2.0//EN "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig><sqlMap resource="config/sqlmap user info xml"/><sqlMap resource= config/sqlmap_user_info.xml />

</sqlMapConfig>

• src/config/sqlmap_user_info.xml 파일 생성

d l 생성– model 생성• src/org.artszen.component.user.model.UserValue (Class)

– dao 생성생성• src/org.artszen.component.user.dao.UserDao (Interface)

public UserValue select(String userId) throws Exception;bli U V l i t(U V l ) th E ti

• src.org.artszen.component.user.dao.UserDaoImpl (Class)

public UserValue insert(UserValue user) throws Exception;public List list() throws Exception;

– service 생성• src/org.artszen.component.user.service.UserService (Interface)

public UserValue get(String userId) throws Exception;public UserValue create(UserValue user) throws Exception;public List getList() throws Exception;

• src.org.artszen.component.user.service.UserServiceImpl (Class)

ti 생성– action 생성• src/org.artszen.component.user.action.UserAction (Class)

public String findUser() throws Exception {}public String viewUser() throws Exception {}public String addUserForm() throws Exception {}public String addUser() throws Exception {}

– Result 페이지 생성• /user/findUser.jsp• /user/addUser.jsp• /user/viewUser.jspj p

웹 애플리케이션 2 의 배포• 웹 애플리케이션 struts2 의 배포– Eclipse의 Export 기능을 이용하여 struts2 .war 웹 애플리케이션을

JBoss에 배포한다JBoss에 배포한다.• JBOSS_HOME/ server/default/deploy