슬라이드 1

Similar documents
PowerPoint 프레젠테이션

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Intro to Servlet, EJB, JSP, WS

Microsoft PowerPoint - CSharp-10-예외처리

PowerPoint Presentation

Spring Data JPA Many To Many 양방향 관계 예제

Interstage5 SOAP서비스 설정 가이드

제11장 프로세스와 쓰레드

슬라이드 1

1

C# Programming Guide - Types

PowerPoint 프레젠테이션

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

KYO_SCCD.PDF

Microsoft PowerPoint - JCO2007_Spring2.0_발표자료_Rev-A.ppt [호환 모드]

슬라이드 1

Microsoft PowerPoint - 04-UDP Programming.ppt

thesis

Spring

쉽게 풀어쓴 C 프로그래밊

제8장 자바 GUI 프로그래밍 II

JAVA PROGRAMMING 실습 08.다형성

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

[Brochure] KOR_TunA

어댑터뷰

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

Microsoft PowerPoint - Smart CRM v4.0_TM 소개_ pptx

No Slide Title

gnu-lee-oop-kor-lec06-3-chap7

Spring Boot

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

4 주차 - SPRING 환경설정및구현 Spring 기반의웹프로젝트를구성하고싶어요 T^T Spring 기반의웹환경구축 1. web.xml 수정으로 Spring 을설정하는방법 2. eclipse Spring Plug-In 을활용한템플릿프로젝트자동구성필수는아니지만해놓으면편

Network Programming

TTA Journal No.157_서체변경.indd

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

본 강의에 들어가기 전

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

슬라이드 1

<property name="configlocation" value="classpath:/egovframework/sqlmap/example/sql-map-config.xml"/> <property name="datasource" ref="datasource2"/> *

MVVM 패턴의 이해

Cluster management software

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

Design Issues

PowerPoint Presentation

Portal_9iAS.ppt [읽기 전용]

[Brochure] KOR_LENA WAS_

JAVA PROGRAMMING 실습 09. 예외처리

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

01( ) SAV12-04.hwp

Web Application을 구성하는 패턴과 Spring ROO의 사례

rmi_박준용_final.PDF

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

PCServerMgmt7

Apache Ivy

PowerPoint Presentation

JVM 메모리구조

PowerPoint Presentation

PowerPoint 프레젠테이션

슬라이드 1

untitled

DBMS & SQL Server Installation Database Laboratory

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint 프레젠테이션

Spring 정의 2012 년 1 월 31 일화요일 오젂 9:17 1. 개요 1.1. 목적 수많은프로젝트에서프레임워크나아키텍체에대한관심없이대부분의개발을개발자의능력에젂담시키는것이일반적이다. 이는프로젝트의위험요소를증가시킬뿐만아니라개발완료후유지보수비용을증가시킴으로써추가적인비

<323020C0CCB8EDC8A32DB0E6B7AEC4C1C5D7C0CCB3CA2E687770>

파워포인트 템플릿

PowerPoint Presentation

01-OOPConcepts(2).PDF

슬라이드 1

Web Services 와 EAI

신림프로그래머_클린코드.key

PowerPoint Presentation

17장 클래스와 메소드

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

I. Introduction... 1 II. Jdbc Support 구현배경 사용자요구사항 p6spy Architecture Architecture InjectionPa

슬라이드 1

Microsoft PowerPoint - additional01.ppt [호환 모드]

JUNIT 실습및발표

Microsoft PowerPoint - 테스트주도개발.pptx

자바 프로그래밍

Spring 3의 JSR 303 지원

Spring Batch 2.0 시작하기

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

교육2 ? 그림

U.Tu System Application DW Service AGENDA 1. 개요 4. 솔루션 모음 1.1. 제안의 배경 및 목적 4.1. 고객정의 DW구축에 필요한 메타정보 생성 1.2. 제품 개요 4.2. 사전 변경 관리 1.3. 제품 특장점 4.3. 부품화형

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

ETL_project_best_practice1.ppt

JAVA PROGRAMMING 실습 05. 객체의 활용

untitled

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

PowerPoint Presentation

Transcription:

- 1 - 전자정부개발프레임워크실행환경

목차 1. 실행환경소개 3. 데이터처리레이어 4. 화면처리레이어 5. 업무처리레이어 6. 연계통합레이어 7. [ 실습 ] 예제어플리케이션개발 - 2 -

1. 실행환경소개 1. 개요 2. 배경 3. 실행환경특징 4. 실행환경적용효과 5. 실행환경구성 6. 실행환경오픈소스소프트웨어사용현황 - 3 -

1. 개요 (1/3) 개발프레임워크환경 1. 실행환경소개 전자정부개발프레임워크환경은응용 SW 를위한실행환경, 응용 SW 개발자를위한개발환경, 응 용 SW 운영자를위한운영환경, 개발프레임워크관리자를위한관리환경으로구성됨 전자정부개발프레임워크환경 환경 설명 전자정부개발프레임워크실행환경 전자정부개발프레임워크개발환경 실행환경 업무프로그램의실행에필요한공통모듈및업무공통서비스를제공함 응용 SW 응용 SW 개발자 개발환경 업무프로그램에대한요구사항수집, 분석 / 설계, 구현, 테스트, 배포등의개발 Life-Cycle 전반에대한지원도구를제공함 전자정부개발프레임워크관리환경 전자정부개발프레임워크운영환경 운영환경 업무프로그램을운영하기위한운영도구를제공함 개발프레임워크관리자 응용 SW 운영자 관리환경 개발프레임워크의지속적인개선및유지보수를효과적으로수행하기위한관리도구를제공함 - 4 -

1. 개요 (2/3) 개발프레임워크실행환경 1. 실행환경소개 전자정부개발프레임워크실행환경은응용 SW 의구성기반이되며응용 SW 실행시필요한기본기 능을제공하는환경임 전자정부개발프레임워크실행환경은 5 개서비스그룹으로구성되며 34 개서비스를제공함 - 5 -

1. 개요 (3/3) 개발프레임워크아키텍처뷰 - 6 -

2. 배경 1. 실행환경소개 기존전자정부프레임워크의문제점 전자정부에적용된개발프레임워크는 Black Box 형태로제공됨 사업자의기술지원없이는응용 SW를유지보수하기어렵고사업자에대한의존성이발생함 개발프레임워크에따라개발표준정의, 개발자수급, 교육시행등별도의유지보수체계를가짐 개발프레임워크의체계적인관리절차의미비로동일개발프레임워크라하더라도버전관리어려움 전자정부개발프레임워크의표준화 사업자고유개발프레임워크에대한기술종속성을배제 프레임워크표준화를통한응용 SW의표준화와품질, 재사용성을향상 개발프레임워크의유지보수단일화를통한투자효율성을높임 - 7 -

3. 실행환경특징 (1/2) 1. 실행환경소개 5개서비스그룹, 34개서비스로구성 화면처리, 업무처리, 데이터처리, 연계통합, 공통기반의 5개서비스그룹으로구성 MVC, IoC 컨테이너, AOP, Data Access, Integration 등의핵심서비스를제공 전자정부프로젝트에최적화된오픈소스소프트웨어선정 34개서비스별최적의오픈소스소프트웨어선정과정을통해 32개오픈소스소프트웨어를선정 경량화된개발프레임워크로서사실상업계표준에가까운 Spring 프레임워크를적용 J2EE 표준을준수하는 Spring 프레임워크를채택 특정업체의 WAS나 DBMS에독립적인환경을제공 DI(Dependency Injection) 방식의의존관계처리 Dependency Injection을통해개체나컴포넌트간의의존성을정의함으로써변경용이성과재사용성을향상 AOP(Aspect Oriented Programming) 지원 트랜잭션, 예외처리와같은공통관심대상을분리하여정의함 - 8 -

3. 실행환경특징 (2/2) 1. 실행환경소개 MVC Model2 아키텍처구조제공및다양한 UI 클라이언트연계지원 Spring MVC를기반으로하며, 다양한 UI 클라이언트연계를위한인터페이스를정의함 전자정부개발프레임워크표준연계인터페이스정의 표준연계인터페이스를정의하여연계솔루션에대한의존성을배제하고독립적인어플리케이션개발이가능함 - 9 -

4. 실행환경적용효과 1. 실행환경소개 개발생산성향상 공통적으로필요한기능을제공함으로써개발중복을최소화하고기반구조를정의함으로써개발자가비즈니스업무에집중할수있도록함 전자정부시스템의재사용성향상 전자정부개발프레임워크에서개발된사업컴포넌트를공유함으로써재사용성을향상시킴 전자정부상호운용성향상 전자정부개발프레임워크사용시스템간연계표준인터페이스를사용함으로써상호운용성이향상됨 전자정부응용소프트웨어표준화효과 화면처리 / 업무처리 / 데이터처리의표준화된개발기반을제공함으로써개발코드의표준화를유도함 오픈소스활성화 오픈소스에기반한표준프레임워크를정의함으로써개발자들의오픈소스사용을활성화함 중소소프트웨어사업자의산업경쟁력강화 전자정부개발프레임워크를공유하고프레임워크기술인력을증가시킴으로써중소소프트웨어사업자의경쟁력을강화함 - 10 -

5. 실행환경구성 (1/8) 1. 실행환경소개 화면처리 업무프로그램과사용자간의인터페이스를담당하는레이어 사용자화면구성, 사용자입력정보검증등의기능제공 업무처리 실행환경 업무프로그램의업무로직을담당하는레이어 업무흐름제어, 에러처리등의기능제공 데이터처리 화면처리 업무처리 데이터처리 연계통합 DB 에대한연결및영속성처리, 트랜잭션관리제공 연계통합 공통기반 타시스템과의연동기능을제공 공통기반 실행환경서비스에서공통적으로사용하는기능제공 환경 서비스그룹 - 11 -

5. 실행환경구성 (2/8) 1. 실행환경소개 전자정부개발프레임워크실행환경은 5 개서비스그룹으로구성되며 34 개서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 연계통합레이어 MVC Internationalization Process Control DataSource Data Access Naming Service Ajax Support Security Exception Handling ORM TBD Transaction Integration Service UI Adaptor Web Service 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP Server Security ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling String Util XML Manipulation 공통기반레이어살펴보기 실행환경서비스그룹서비스 - 12 -

5. 실행환경구성 (3/8) 1. 실행환경소개 화면처리레이어 서비스명 설명 MVC Internationalization Ajax Support MVC 디자인패턴을적용하여사용자화면을개발할수있도록 MVC 기반구조를제공한다. Internationalization 은다양한지역과언어환경을지원할수있는서비스로, 서버설정및클라이언트브라우저환경에따라자동화된다국어기능을제공한다. Ajax 는대화식웹애플리케이션의제작을위해 HTML 과 CSS, DOM, 자바스크립트, XML, XSLT 등과같은조합을이용하는웹개발기법으로 Ajax 기능지원을위한 Custom Tag Library 를제공한다. Security UI Adaptor 웹응용프로그램작성시발생될수있는웹보안상의취약점 (XSS, SQL Injection 등 ) 에대응하기위한기능을제공한다. 화면레이어의구현방식에따라업무로직레이어가변경되는것을막기위해서, 업무처리 Layer 에서사용할데이터타입을정의하고, 화면레이어에서사용하는 in/out parameter 를해당구현방식에맞게변환해주는기능을제공한다 - 13 -

5. 실행환경구성 (4/8) 1. 실행환경소개 업무처리레이어 서비스명 Process Control Exception Handling 설명 비지니스로직과업무흐름의분리를지원하며, XML 등의외부설정으로업무흐름구성을제공하고, 미리정의된프로세스를실행하는기능을제공한다. 응용프로그램의실행과정에서발생하는예외사항 (Exception) 을처리하기위해표준화된방법을제공한다. 연계통합레이어 서비스명 설명 Naming Service 원격에있는모듈및자원등을찾아주는기능을제공한다. Web Service Integration Service 연계등을위하여업무서비스를웹서비스의형태로어플리케이션외부에노출시켜타시스템이나어플리케이션에서서비스를이용할수있도록하는기능을제공한다. 전자정부시스템과의연계를위한공통인터페이스를제공하여, 다양한솔루션연계방식에대한표준화된처리방식을제공한다. - 14 -

5. 실행환경구성 (5/8) 1. 실행환경소개 데이터처리레이어 서비스명 Data Access Data Source ORM Transaction 설명 다양한데이터베이스솔루션및데이터베이스접근기술에대한추상화된접근방식을제공하여업무로직과데이터베이스솔루션및접근기술간의종속성을배제하기위한기능을제공한다. 다양한방식의데이터베이스연결을제공하고, 이에대한추상화계층을제공함으로써, 업무로직과데이터베이스연결방식간의종속성을배제하기위한기능을제공한다. 객체모델과관계형데이터베이스간의매핑기능인 ORM(Object-Relational Mapping) 기능을제공함으로서, SQL 이아닌객체를이용한업무로직의작성이가능하도록지원한다. Database Transaction 을처리하기위한서비스로서, Transaction 처리에대한추상화된방법을제공하여일관성있는프로그래밍모델을제공한다. - 15 -

5. 실행환경구성 (6/8) 1. 실행환경소개 공통기반레이어 (1/3) 서비스명 설명 AOP 관점지향프로그래밍 (Aspect Oriented Programming: AOP) 사상을구현하고지원한다. Cache Compress/Decompress Encryption/Decryption 빈번히사용되는컨텐츠에대해서빠른접근을가능하게하는기능으로잦은접근을통한오버헤드나시간을단축시키는역할을한다. 데이터를압축및복원하는기능을제공한다. 데이터를효율적으로저장및전송하기위해원본데이터를압축하거나압축된데이터를복원하여원본데이터를구하는데사용될수있다. 데이터에대한암호화및복호화기능을제공하며, 네트워크를통한데이터송수신시, 보안을목적으로사용될수있다. Excel 엑셀파일포맷을다룰수있는자바라이브러리를제공한다. File Handling File 생성및접근, 변경을위해 File 에 Access 할수있는기능을제공한다. File Upload/Download FTP 화면처리서비스그룹에서사용되며, 파일을업로드및다운로드하기위한기능을제공한다. FTP(File Transfer Protocol) 프로토콜을이용하여데이터 ( 파일 ) 을주고받기위한 FTP 클라이언트기능을제공한다. - 16 -

5. 실행환경구성 (7/8) 1. 실행환경소개 공통기반레이어 (2/3) 서비스명 ID Generation 설명 UUID(Universal Unique Identifier) 표준에따라시스템에서사용하는 ID(Identifier) 를생성하는기능을제공한다. IoC Container 프레임워크의기본기능인 IoC(Inversion of Control) 컨테이너기능을제공한다. Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource System.out.println 문을사용한오버헤드를줄이고, 간편한설정을통해로그를저장하고통제할수있는기능을제공한다. SMTP 표준을준수하며이메일을송신할수있도록이메일클라이언트기능을제공한다. 객체를특정데이터형식으로변환하고, 반대로특정데이터형식으로작성된데이터를객체로변환하는기능을제공한다. Pool 에사용가능한객체가있을경우객체를할당받거나, 없을경우 Pool 크기에따라새로운객체생성및할당하는기능을제공한다. 외부파일이나환경정보를구성하는키와값의쌍을내부적으로저장하고있으며, 어플리케이션이특정키에대한값에접근할수있도록기능을제공한다. 국제화 (Internationalization) 및현지화 (Localization) 를지원하기위한기능으로, 키값을이용하여국가및언어에해당하는메시지를읽어오는기능을제공한다. - 17 -

5. 실행환경구성 (8/8) 1. 실행환경소개 공통기반레이어 (3/3) Scheduling 서비스명 Server Security 설명 어플리케이션서버내에서주기적으로발생하거나반복적으로발생하는작업을지원하는기능으로서, 유닉스의크론 (Cron) 명령어와유사한기능을제공한다. 서버함수및데이터접근시보안관리를위해사용자인증및권한관리기능을제공한다. String Util 문자열데이터를다루기위한다양한기능을제공한다. XML Manipulation XML 을생성하고, 읽고, 쓰기위한기능을제공한다. - 18 -

6. 실행환경오픈소스소프트웨어사용현황 (1/3) 1. 실행환경소개 실행환경오픈소스소프트웨어사용현황 (1/3) 레이어서비스명오픈소스 SW 확장및개발 화면처리 업무처리 데이터처리 연계통합 Ajax Support Ajax Tags 1.5 Internationalization Spring 3.0.5 MVC Spring 3.0.5 Custom Tag 외기능확장 Security Apache Commons Validator 1.3.1 UI Adaptor 선정하지않음 UI Adaptor 연동가이드 Process Control Web Flow 2.0 Exception Handling Spring 3.0.5 Exception 기능확장 Data Access ibatis SQL Maps 2.3 Spring-iBatis 기능확장 DataSource Spring 3.0.5 ORM Hibernate 3.4 Transaction Spring 3.0.5 Naming Service Support Spring 3.0.5 Integration Service 선정하지않음표준인터페이스처리기능개발 Web Service Interface Apache CXF 2.3.3 표준인터페이스를준수하도록웹서비스를확장 - 19 -

6. 실행환경오픈소스소프트웨어사용현황 (2/3) 1. 실행환경소개 실행환경오픈소스소프트웨어사용현황 (2/3) 레이어 서비스명 오픈소스 SW 확장및개발 AOP Spring 3.0.5 Cache EHCache 2.4.1 Compress/Decompress Apache Commons Compress 1.1 Encryption/Decryption Java simplified encryption (jasypt) 1.7 암호화기능확장 Excel Apache POI 3.2, jxls 0.9.9 Excel 기능확장 File Handling Jakarta Commons VFS 1.0 File Access 기능확장 공통기반 ( 이어짐 ) File Upload/Download Apache Commons FileUpload 1.2.2 FTP Apache Commons Net 3.0.1 ID Generation 선정하지않음 UUID 생성기능개발 IoC Container Spring 3.0.5 Logging Log4j 1.3 Mail Apache Commons Email 1.1 Marshalling/Unmarshalling Castor 1.2 Apache XML Beans 2.4-20 -

6. 실행환경오픈소스소프트웨어사용현황 (3/3) 1. 실행환경소개 실행환경오픈소스소프트웨어사용현황 (3/3) 레이어서비스명오픈소스 SW 확장및개발 공통기반 ( 계속 ) Object Pooling Apache Commons Pool 1.5.6 Property Spring 3.0.5 Property 기능확장 Resource Spring 3.0.5 Scheduling Quartz 1.8.5 Server Security Spring Security 2.0.4 인증, 권한관리기능확장 String Util Jakarta Regexp 1.5 문자열처리기능확장 XML Manipulation Apache Xerces2 2.9 JDOM 1.1 XML 처리기능확장 - 21 -

1. 개요 2. IOC Container 3. AOP 4. Cache 5. Compress/Decompress 6. Encryption/Decryption 7. Excel 8. File Handling 9. File Upload/Download 10. FTP 12. Logging 13. Mail 14. Marshalling/Unmarshalling 15. Object Pooling 16. Property 17. Resource 18. Scheduling 19. Server Security 20. String Util 21. Xml Manipulation 11. ID Generation - 22 -

1. 개요 - 실행환경공통기반레이어 (1/4) 공통기반레이어는전자정부개발프레임워크실행환경레이어중의하나로서실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 전자정부개발프레임워크실행환경 서비스그룹 Presentation Layer 설명 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 Layer Presentation Layer Logic Business Layer Persistence Integration Layer Business Logic Layer Persistence Layer ( 데이터처리 ) 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer ( 공통기반레이어 ) 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 - 23 -

1. 개요 - 실행환경공통기반레이어 (2/4) 공통기반레이어는 IoC, AOP, Security 등총 20 개의서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 연계통합레이어 MVC Internationalization Process Control DataSource Data Access Naming Service Ajax Support Security Exception Handling 2. 공통기반 ORM 레이어 Transaction Integration Service UI Adaptor Web Service 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP Server Security ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling String Util XML Manipulation 실행환경서비스그룹서비스 - 24 -

1. 개요 - 실행환경공통기반레이어 (3/4) 공통기반레이어는 Spring, Quartz, EHCache 등총 18 종의오픈소스 SW 를사용하고있음 서비스 오픈소스 SW 버전 기존버전 (1.0) AOP Spring 3.0.5 2.5.6 Cache EHCache 2.4.1 1.6 Compress/Decompress Apache Commons Compress 1.1 1.0 Encryption/Decryption Java simplified encryption (JASYPT) 1.7 1.5 Excel Apache POI 3.0 3.0 File Handling Jakarta Commons VFS 1.0 1.0 File Upload/Download Apache Commons FileUpload 1.2.2 1.2 FTP Apache Commons Net 3.0.1 2.0 IoC Container Spring 3.0.5 2.5 Logging Log4j 1.3 1.3-25 -

1. 개요 - 실행환경공통기반레이어 (4/4) 공통기반레이어는 Spring, Quartz, EHCache 등총 18 종의오픈소스 SW 를사용하고있음 서비스오픈소스 SW 버전기존버전 (1.0) Mail Apache Commons Email 1.1 1.1 Marshalling/Unmarshalling Castor Apache XMLBeans Object Pooling Apache Commons Pool 1.5.6 1.4 Property Spring 3.0.5 2.5 Resource Spring 3.0.5 2.5 Scheduling Quartz 1.8.5 1.6 Server Security Spring Security 2.0.4 2.0 String Util Jakarta Regexp 1.5 1.5 1.2 2.4 1.2 2.4 XML Manipulation Apache Xerces 2 JDOM 2.9 1.1 2.9 1.0-26 -

1. 개요 - Spring Framework(1/3) Spring 프레임워크는 JavaEE 기반의어플리케이션개발을쉽게해주는오픈소스어플리케이션프 레임워크로, 간단한자바객체 (POJO : Plain Old Java Object) 를 Spring 의경량 (Lightweight) 컨 테이너를통해생성및관리하는빈 (Bean) 으로처리해준다. 엔터프라이즈어플리케이션을쉽게구성할수있도록각종빈 (Bean) 의생성및관리를처리하는경량 (Lightweight) 컨테이너제공 Rod Johnson 에의해개발된 J2EE 어플리케이션개발을위한오픈소스어플리케이션프레임워크 * Open Source Catalogue 2007, Optaros (Spring 2.0 기준 ) - 27 -

1. 개요 - Spring Framework(2/3) EJB 명세와현실의괴리 원격호출기반의 EJB는객체에대해서무거운 (heavy weight) 모델임 대부분의개발자들은스테이트리스세션빈과비동기방식이필요한경우에한해서메시지드리븐빈만을사용함 EJB 의실패부분 너무복잡함 저장을위한엔티티빈은실패작임 EJB의이식성은서블릿과같은다른 J2EE 기술보다떨어짐 확장성을보장한다는 EJB의약속과달리, 성능이떨어지며확장이어려움 Spring Framework Spring이라는이름의기원은전통적인 J2EE를 겨울 에빗대어 겨울 후의 봄 으로새로운시작을의미함 Rod Johnson이창시한개발프레임워크 EJB가제공했던대부분의기능을일반 POJO(Plain Old Java Object) 를사용하여개발할수있도록지원함 엔터프라이즈어플리케이션개발의복잡성을줄이기위한목적으로개발됨 - 28 -

1. 개요 - Spring Framework(3/3) Spring Framework 는어플리케이션을구성하는 Bean 객체의생명주기를관장하는 Core 를기반 으로 DAO, ORM, AOP, JEE, Web 으로구성됨 - 29 -

2. IoC Container 개요 (1/4) 개요 프레임워크의기본적인기능인 IoC(Inversion of Control) Container 기능을제공하는서비스이다. 객체의생성시, 객체가참조하고있는타객체에대한의존성을소스코드내부에서하드코딩하는것이아닌, 소스코드외부에서설정하게함으로써, 유연성및확장성을향상시킨다. 주요기능 : Dependency Injection, Bean Lifecycle Management 오픈소스 : Spring Framework 2.5의 IoC Container를수정없이사용함. 의존성관리의중요성 - 30 -

2. IoC Container 개요 (2/4) 개요 1 업무모듈은 IoC Container 서비스에객체생성을요청한다. 2 IoC Container 는표준프레임워크설정정보에객체생성을위한종속성정보등과같은 IoC Container 설정정보를참조한다. 3 IoC Container 는설정정보에따라객체를생성하여업무모듈에게돌려준다. - 31 -

2. IoC Container 개요 (3/4) IoC(Inversion of Control) 이란? IoC는 Inversion of Control의약자로한글로 제어의역전 또는 역제어 라고부른다. 어떤모듈이제어를가진다는것은 어떤모듈을사용할것인지, 모듈의함수는언제호출할것인지 등을스스로결정한다는것을의미한다. 이러한제어가역전되었다는것은, 어떤모듈이사용할모듈을스스로결정하는것이아니라다른모듈에게선택권을넘겨준다는것을의미한다. DI(Dependency Injection) 이란? Dependency Injection이란모듈간의의존성을모듈의외부 ( 컨테이너 ) 에서주입시켜주는기능으로 Inversion of Control의한종류이다. 런타임시사용하게될의존대상과의관계를 Spring Framework 이총체적으로결정하고그결정된의존특징을런타임시부여한다. - 32 -

2. IoC Container 개요 (4/4) Non-IoC/DI vs IoC/DI Non-IoC/DI IoC/DI Bar Bar Foo package x.y; public class Foo { } public void process() { Bar bar = new Bar(); Baz baz = new Baz(); //... } Baz vs Baz Foo package x.y; public class Foo { public Foo(Bar bar, Baz baz) { //... } } <beans> <bean name="foo" class="x.y.foo"> <constructor-arg> <bean class="x.y.bar"/> </constructor-arg> <constructor-arg> <bean class="x.y.baz"/> </constructor-arg> </bean> </beans> - 33 -

2. IoC Container 기본개념 Container Spring IoC Container는객체를생성하고, 객체간의의존성을이어주는역할을한다. 설정정보 (Configuration Metadata) Spring IoC container가 객체를생성하고, 객체간의의존성을이어줄수있도록 필요한정보를제공한다. 설정정보는기본적으로 XML 형태로작성되며, 추가적으로 Java Annotation을이용하여서도설정이가능하다. Bean Spring IoC Container에의해생성되고관리되는객체를의미한다. - 34 -

2. IoC Container Container BeanFactory BeanFactory 인터페이스는 Spring IoC Container 의기능을정의하고있는기본인터페이스이다. Bean 생성및의존성주입, 생명주기관리등의기능을제공한다. ApplicationContext BeanFactory 인터페이스를상속받는 ApplicationContext 는 BeanFactory 가제공하는기능외에 Spring AOP, 메시지리소스처리 ( 국제화에사용됨 ), 이벤트처리등의기능을제공한다. 모든 ApplicationContext 구현체는 BeanFactory 의기능을모두제공하므로, 특별한경우를제외하고는 ApplicationContext 를사용하는것이바람직하다. Spring Framework 는다수의 ApplicationContext 구현체를제공한다. 다음은 ClassPathXmlApplicationContext 를생성하는예제이다. ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"services.xml", "daos.xml"}); Foo foo = (Foo)context.getBean( foo ); // an Application is also a BeanFactory (via inheritance) BeanFactory factory = context; Spring Container = Bean Factory = ApplicationContext = DI Container = IoC Container - 35 -

2. IoC Container XML 설정 (1/2) XML 설정파일 (1/2) XML 설정파일은 <beans/> element 를 root 로갖는다. 아래는기본적인 XML 설정파일의모습이다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans> - 36 -

2. IoC Container XML 설정 (2/2) XML 설정파일 (2/2) XML 설정은여러개의파일로구성될수있으며, <import/> element 를사용하여다른 XML 설정파일을 import 할수있다. <beans> <import resource="services.xml"/> <import resource="resources/messagesource.xml"/> <import resource="/resources/themesource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans> - 37 -

2. IoC Container Bean(1/42) Bean 정의 Bean 정의는 Bean 을객체화하고의존성을주입하는등의관리를위한정보를담고있다. XML 설정에서는 <bean/> element 가 Bean 정의를나타낸다. Bean 정의는아래와같은속성을가진다. <bean id="" name="" class="" factory-bean="" factory-method="" lazy-init="" dependency-check="" depends-on="" scope="" init-method="" destroy-method="" autowire="" autowire-candidate="" primary="" abstract="" parent=""> <constructor-arg/> <property/> <lookup-method/> <replaced-method/> <qualifier/> </bean> [Bean 이름 ] Bean 의이름을설정한다. [Bean Class] Bean 의 Class 를설정한다. [Bean 객체화 ] Bean 을객체화하기위한정보를설정한다. [ 의존성주입 ] Bean 의의존성주입을위한정보를설정한다. [ 메소드삽입 ] Bean 의메소드삽입을위한정보를설정한다. [ 의존성검사 ] Bean 간의의존성을검사하기위한정보를설정한다. [Bean Scope] Bean 의 Scope 을설정한다. [Bean 성질변화 ] Bean 의생명주기에서호출된메소드를설정한다. [Autowiring] Bean 들을자동을엮어주기위한정보를설정한다. [Bean 정의상속 ] Bean 정의를상속받기위한정보를설정한다. [Annotation 기반설정 ] Annotation 기반의설정에서 Bean 을찾기위한정보를설정한다. - 38 -

2. IoC Container Bean(2/42) Bean 이름 모든 Bean은하나의 id를가지며, 하나이상의 name을가질수있다. id는 container 안에서고유해야한다. <bean id="examplebean" class="example.examplebean"/> <bean name="anotherexample" class="examples.examplebeantwo"/> Bean 은 <alias/> element 를이용하여추가적인 name 을가질수있다. <alias name="fromname" alias="toname"/> Bean Class 모든 Bean은객체화를위한 Java class가필요하다. ( 예외적으로상속의경우 class가없어도된다.) <bean id="examplebean" class="example.examplebean"/> <bean name="anotherexample" class="examples.examplebeantwo"/> - 39 -

2. IoC Container Bean(3/42) Bean 객체화 (1/2) 일반적으로 Bean 객체화는 Java 언어의 new 연산자를사용한다. 이경우별도의설정은필요없다. new 연산자가아닌 static factory 메소드를사용하여 Bean 을객체화할수있다. 이경우 Constructor Injection 방식의의존성주입설정을따른다. <bean id="examplebean" class="examples.examplebean" factory-method="createinstance"/> 자신의 static factory 메소드가아닌별도의 Factory 클래스의 static 메소드를사용하여 Bean 을객체화할수있 다. 이경우역시 Constructor Injection 방식의의존성주입설정을따른다. <!-- the factory bean, which contains a method called createinstance() --> <bean id="servicelocator" class="com.foo.defaultservicelocator"> <!-- inject any dependencies required by this locator bean --> </bean> <!-- the bean to be created via the factory bean --> <bean id="examplebean" factory-bean="servicelocator" factory-method="createinstance"/> ExampleBean examplebean = new ExampleBean(); ExampleBean examplebean = ExampleBean.createInstance(); ExampleBean examplebean = DefaultServiceLocator.createInstance(); - 40 -

2. IoC Container Bean(4/42) Bean 객체화 (2/2) <bean/> element의 lazy-init attribute를사용하여 Bean 객체화시기를설정할수있다. 일반적으로 Bean 객체화는 BeanFactory가객체화되는시점에수행된다. 만약, lazy-init attribute 값이 true 인경우, 설정된 Bean의객체가실제로필요하다고요청한시점에객체화가수행된다. lazy-init attribute가설정되어있지않으면기본값을사용한다. Spring Framework의기본값은 false 이다. <bean id="lazy" class="com.foo.expensivetocreatebean" lazy-init="true"/> <bean name="not.lazy" class="com.foo.anotherbean"/> <beans/> element 의 default-lazy-init attribute 를사용하여 XML 설정파일내의모든 Bean 정의에대한 lazyinit attribute 의기본값을설정할수있다. <beans default-lazy-init="true"> <!-- no beans will be pre-instantiated... --> </beans> - 41 -

2. IoC Container Bean(5/42) 의존성주입 (1/16) 의존성주입에는 Constructor Injection과 Setter Injection의두가지방식이있다. Constructor Injection(1/3) Constructor Injection은 argument를갖는생성자를사용하여의존성을주입하는방식이다. <constructor-arg/> element를사용한다. 생성자의 argument와 <constructor-arg/> element는 class가같은것끼리매핑한다. package x.y; public class Foo { } public Foo(Bar bar, Baz baz) { //... } <beans> <bean name="foo" class="x.y.foo"> <constructor-arg> <bean class="x.y.bar"/> </constructor-arg> <constructor-arg> <bean class="x.y.baz"/> </constructor-arg> </bean> </beans> - 42 -

2. IoC Container Bean(6/42) 의존성주입 (2/16) Constructor Injection(2/3) 만약생성자가같은 class 의 argument 를가졌거나 primitive type 인경우 argument 와 <constructor-arg/> element 간의매핑이 불가능하다. 이경우, Type 을지정하거나순서를지정할수있다. package examples; public class ExampleBean { // No. of years to the calculate the Ultimate Answer private int years; // The Answer to Life, the Universe, and Everything private String ultimateanswer; } public ExampleBean(int years, String ultimateanswer) { this.years = years; this.ultimateanswer = ultimateanswer; } - 43 -

2. IoC Container Bean(7/42) 의존성주입 (3/16) Constructor Injection(3/3) Type 지정 순서지정 <bean id="examplebean" class="examples.examplebean"> <constructor-arg type="int" value="7500000"/> <constructor-arg type="java.lang.string" value="42"/> </bean> <bean id="examplebean" class="examples.examplebean"> <constructor-arg index="0" value="7500000"/> <constructor-arg index="1" value="42"/> </bean> - 44 -

2. IoC Container Bean(8/42) 의존성주입 (4/16) Setter Injection(1/2) Setter Injection 은 argument 가없는기본생성자를사용하여객체를생성한후, setter 메소드를사용하여의존성을주입하는 방식으로, <property/> element 를사용한다. Class 에 attribute( 또는 setter 메소드명 ) 과 <property/> element 의 name attribute 를사용하여매핑한다. public class ExampleBean { private AnotherBean beanone; private YetAnotherBean beantwo; private int i; public void setbeanone(anotherbean beanone) { this.beanone = beanone; } public void setbeantwo(yetanotherbean beantwo) { this.beantwo = beantwo; } } public void setintegerproperty(int i) { this.i = i; } - 45 -

2. IoC Container Bean(9/42) 의존성주입 (5/16) Setter Injection(2/2) <bean id="examplebean" class="examples.examplebean"> <!-- setter injection using the nested <ref/> element --> <property name="beanone"><ref bean="anotherexamplebean"/></property> <!-- setter injection using the neater 'ref' attribute --> <property name="beantwo" ref="yetanotherbean"/> <property name="integerproperty" value="1"/> </bean> <bean id="anotherexamplebean" class="examples.anotherbean"/> <bean id="yetanotherbean" class="examples.yetanotherbean"/> 매핑규칙은 <property/> element 의 name attribute 의첫문자를알파벳대문자로변경하고그앞에 set 을붙인 setter 메소드 를호출한다. <bean id="examplebean class="examples.examplebean"> <property name="beanone"> <ref bean="anotherexamplebean"/> </property> </bean> public class ExampleBean { public void setbeanone( AnotherBean beanone) { this.beanone = beanone; } } - 46 -

2. IoC Container Bean(10/42) 의존성주입 (6/16) 의존성상세설정 (1/11) <constructor-arg/> element 과 <property/> element 는 명확한값, 다른 Bean 에대한참조, Inner Bean, Collection, Null 등 의값을가질수있다. 명확한값 Java Primitive Type, String 등의명확한값을나타낸다. 사람이인식가능한문자열형태를값으로갖는 <value/> element 를 사용한다. Spring IoC container 가 String 값을해당하는 type 으로변환하여주입해준다. <bean id="mydatasource" class="org.apache.commons.dbcp.basicdatasource destroy-method="close"> <!-- results in a setdriverclassname(string) call --> <property name="driverclassname"> <value>com.mysql.jdbc.driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/mydb</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>masterkaoli</value> </property> </bean> - 47 -

2. IoC Container Bean(11/42) 의존성주입 (7/16) 의존성상세설정 (2/11) 다른 Bean 에대한참조 <ref/> element 를사용하여다른 Bean 객체를참조할수있다. 참조할객체를지정하는방식은 container, local, parent 등 이있다. 1. container : 가장일반적인방식으로같은 container 또는부모 container 에서객체를찾는다. <ref bean="somebean"/> 2. local : 같은 XML 설정파일내에정의된 Bean 객체를찾는다. <ref local="somebean"/> 3. parent : 부모 XML 설정파일내에정의된 Bean 객체를찾는다. <!-- in the parent context --> <bean id="accountservice" class="com.foo.simpleaccountservice"> <!-- insert dependencies as required as here --> </bean> <!-- in the child (descendant) context --> <bean id="accountservice" class="org.springframework.aop.framework.proxyfactorybean"> <property name="target"> </property> </bean> X O <ref parent="accountservice"/> - 48 -

2. IoC Container Bean(12/42) 의존성주입 (8/16) 의존성상세설정 (3/11) Inner Bean <property/> 또는 <constructor-arg/> element 안에있는 <bean/> element 를 inner bean 이라고한다. Inner bean 의 'scope' flag 와 'id', 'name' 은무시된다. Inner bean 의 scope 은항상 prototype 이다. 따라서 inner bean 을다른 bean 에주입하는것은불가 능하다. <bean id="outer" class="..."> <!-- instead of using a reference to a target bean, simply define the target bean inline --> <property name="target"> <bean class="com.example.person"> <!-- this is the inner bean --> <property name="name" value="fiona Apple"/> <property name="age" value="25"/> </bean> </property> </bean> - 49 -

2. IoC Container Bean(13/42) 의존성주입 (9/16) 의존성상세설정 (4/11) Collection(1/2) Java Collection 타입인 List, Set, Map, Properties 를표현하기위해 <list/>, <set/>, <map/>, <props/> element 가사용된다. map 의 key 와 value, set 의 value 의값은아래 element 중하나가될수있다. bean ref idref list set map props value null <bean id="morecomplexobject" class="example.complexobject"> <!-- results in a setadminemails(java.util.properties) call --> <property name="adminemails"> <props> <prop key="administrator">administrator@example.org</prop> <prop key="support">support@example.org</prop> <prop key="development">development@example.org</prop> </props> </property> <!-- results in a setsomelist(java.util.list) call --> <property name="somelist"> <list> <value>a list element followed by a reference</value> <ref bean="mydatasource" /> </list> </property>... - 50 -

2. IoC Container Bean(14/42) 의존성주입 (10/16) 의존성상세설정 (5/11) Collection(2/2)... <!-- results in a setsomemap(java.util.map) call --> <property name="somemap"> <map> <entry> <key><value>an entry</value></key> <value>just some string</value> </entry> <entry> <key><value>a ref</value></key> <ref bean="mydatasource" /> </entry> </map> </property> <!-- results in a setsomeset(java.util.set) call --> <property name="someset"> <set> <value>just some string</value> <ref bean="mydatasource" /> </set> </property> </bean> - 51 -

2. IoC Container Bean(15/42) 의존성주입 (11/16) 의존성상세설정 (6/11) Null Java 의 null 값을사용하기위해서 <null/> element 를사용한다. Spring IoC container 는 value 값이설정되어있지않은경우 빈문자열 ( ) 로인식한다. <bean class="examplebean"> <property name="email"><value/></property> </bean> 위 ExampleBean 의 email 값은 이다. 아래는 email 의값이 null 인예제이다. <bean class="examplebean"> <property name="email"><null/></property> </bean> - 52 -

2. IoC Container Bean(16/42) 의존성주입 (12/16) 의존성상세설정 (7/11) 간편한표기 1 <property/>, <constructor-arg/>, <entry/> element의 <value/> element는 value attribute로대체될수있다. <property name="myproperty"> <value>hello</value> </property> <constructor-arg> <value>hello</value> </constructor-arg> <entry key="mykey"> <value>hello</value> </entry> = = = <property name="myproperty" value="hello"/> <constructor-arg value="hello"/> <entry key="mykey" value="hello"/> - 53 -

2. IoC Container Bean(17/42) 의존성주입 (13/16) 의존성상세설정 (8/11) 간편한표기 2 <property/>, <constructor-arg/> element의 <ref/> element는 ref attribute로대체될수있다. <property name="myproperty"> <ref bean="mybean"> </property> <constructor-arg> <ref bean="mybean"> </constructor-arg> = = <property name="myproperty" ref="mybean"/> <constructor-arg ref="mybean"/> 간편한표기 3 <entry/> element 의 'key, ref element 는 'key-ref, 'value-ref' attribute 로대체될수있다. <entry> <key> <ref bean="mykeybean" /> </key> <ref bean="myvaluebean" /> </entry> = <entry key-ref="mykeybean value-ref="myvaluebean"/> - 54 -

2. IoC Container Bean(18/42) 의존성주입 (14/16) 의존성상세설정 (9/11) p-namespace(1/2) <property/> element 대신 p-namespace 를사용하여 XML 설정을작성할수있다. 아래 classic bean 과 p-namespace bean 은 동일한 Bean 설정이다. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean name="classic" class="com.example.examplebean"> <property name="email" value="foo@bar.com/> </bean> <bean name="p-namespace" class="com.example.examplebean" p:email="foo@bar.com"/> </beans> - 55 -

2. IoC Container Bean(19/42) 의존성주입 (15/16) 의존성상세설정 (10/11) p-namespace(2/2) Attribute 이름끝에 -ref 를붙이면참조로인식한다. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean name="john-classic" class="com.example.person"> <property name="name" value="john Doe"/> <property name="spouse" ref="jane"/> </bean> <bean name="john-modern" class="com.example.person" p:name="john Doe" p:spouse-ref="jane"/> <bean name="jane" class="com.example.person"> <property name="name" value="jane Doe"/> </bean> </beans> - 56 -

2. IoC Container Bean(20/42) 의존성주입 (16/16) 의존성상세설정 (11/11) Compound property name 복합형식의 property 이름도사용할수있다. <bean id="foo" class="foo.bar"> <property name="fred.bob.sammy" value="123" /> </bean> - 57 -

2. IoC Container Bean(21/42) Bean Scope(1/4) Bean Scope 은객체가유효한범위로아래 5 가지의 scope 이있다. Spring Bean 의기본 Scope 는 singleton 이다. Scope 설명 singleton 하나의 Bean 정의에대해서 Spring IoC Container 내에단하나의객체만존재한다. prototype 하나의 Bean 정의에대해서다수의객체가존재할수있다. request session global session 하나의 Bean 정의에대해서하나의 HTTP request 의생명주기안에단하나의객체만존재한다 ; 즉, 각각의 HTTP request 는자신만의객체를가진다. Web-aware Spring ApplicationContext 안에서만유효하다. 하나의 Bean 정의에대해서하나의 HTTP Session 의생명주기안에단하나의객체만존재한다. Web-aware Spring ApplicationContext 안에서만유효하다. 하나의 Bean 정의에대해서하나의 global HTTP Session 의생명주기안에단하나의객체만존재한다. 일반적으로 portlet context 안에서유효하다. Web-aware Spring ApplicationContext 안에서만유효하다. - 58 -

2. IoC Container Bean(22/42) Bean Scope(2/4) Singleton Scope Bean 이 singleton 인경우, 단하나의객체만공유된다. Spring의기본 scope은 singleton 이다. 설정하는방법은아래와같다. <bean id="accountservice" class="com.foo.defaultaccountservice"/> <bean id="accountservice" class="com.foo.defaultaccountservice" scope="singleton"/> <bean id="accountservice" class="com.foo.defaultaccountservice" singleton="true"/> - 59 -

2. IoC Container Bean(23/42) Bean Scope(3/4) Prototype Scope Singleton 이아닌 prototype scope 의형태로정의된 bean 은필요한매순간새로운 bean 객체가생성된다. 설정하는방법은아래와같다. <bean id="accountservice" class="com.foo.defaultaccountservice" scope="prototype"/> <bean id="accountservice" class="com.foo.defaultaccountservice" singleton="false"/> - 60 -

2. IoC Container Bean(24/42) Bean Scope(4/4) 기타 Scope request, session, global session은 Web 기반어플리케이션에서만유효한 scope이다. Request Scope <bean id="loginaction" class="com.foo.loginaction" scope="request"/> 위정의에따라, Spring container는모든 HTTP request에대해서 'loginaction' bean 정의에대한 LoginAction 객체를생성할것이다. 즉, 'loginaction' bean은 HTTP request 수준에한정된다 (scoped). 요청에대한처리가완료되었을때, 한정된 (scoped) bean도폐기된다. Session Scope <bean id="userpreferences" class="com.foo.userpreferences" scope="session"/> 위정의에따라, Spring container는하나의 HTTP Session 일생동안 'userpreferences' bean 정의에대한 UserPreferences 객체를생성할것이다. 즉, 'userpreferences' bean은 HTTP Session 수준에한정된다 (scoped). HTTP Session이폐기될때, 한정된 (scoped) bean도폐기된다. Global Session Scope <bean id= userpreferences" class="com.foo.userpreferences" scope="globalsession"/> global session scope은 HTTP Session scope과비슷하지만단지 portlet-based web 어플리케이션에서만사용할수있다. Portlet 명세 (specifications) 는 global Session을하나의 portlet web 어플리케이션을구성하는여러 portlet들모두가공유하는것으로정의하고있다. global session scope으로설정된 bean은 global portlet Session의일생에한정된다. - 61 -

2. IoC Container Bean(25/42) Bean 성질변화 (1/4) Lifecycle Callback Spring IoC Container는 Bean의각생명주기에호출되도록설정된메소드를호출해준다. Initialization callback org.springframework.beans.factory.initializingbean interface를구현하면 bean에필요한모든 property를설정한후, 초기화작업을수행한다. InitializingBean interface는다음메소드를명시하고있다. void afterpropertiesset() throws Exception; 일반적으로, InitializingBean interface 의사용을권장하지않는다. 왜냐하면 code 가불필요하게 Spring 과결합되기 (couple) 때 문이다. 대안으로, bean 정의는초기화메소드를지정할수있다. XML 기반설정의경우, 'init-method' attribute 를사용한다. public class ExampleBean { } public void init() { // do some initialization work } <bean id="exampleinitbean" class="examples.examplebean" init-method="init"/> - 62 -

2. IoC Container Bean(26/42) Bean 성질변화 (2/4) Lifecycle Callback Destruction callback org.springframework.beans.factory.disposablebean interface를구현하면, container가파괴될때 bean이 callback를받을수있다. DisposableBean interfce는다음메소드를명시하고있다. void destroy() throws Exception; 일반적으로, DisposableBean interface의사용을권장하지않는다. 왜냐하면 code가불필요하게 Spring과결합되기 (couple) 때문이다. 대안으로, bean 정의는초기화메소드를지정할수있다. XML 기반설정의경우, 'destroy-method' attribute를사용한다. public class ExampleBean { } public void cleanup() { // do some destruction work (like releasing pooled connections) } <bean id="exampleinitbean" class="examples.examplebean" destroy-method="cleanup"/> - 63 -

2. IoC Container Bean(27/42) Bean 성질변화 (3/4) Lifecycle Callback 기본 Instantiation & Destruction callback Spring IoC container 레벨에서기본 Instantiation & Destruction callback 메소드를지정할수있다. <beans/> element 의 default-init-method, default-destroy-method attribute 를사용한다. <beans default-init-method="init" default-destroy-method="destroy"> <bean id="blogservice" class="com.foo.defaultblogservice"> <property name="blogdao" ref="blogdao" /> </bean> </beans> - 64 -

2. IoC Container Bean(28/42) Bean 성질변화 (4/4) Knowing who you are BeanFactoryAware org.springframework.beans.factory.beanfactoryaware interface를구현한 class는자신을생성한 BeanFactory를참조할수있다. public interface BeanFactoryAware { } void setbeanfactory(beanfactory beanfactory) throws BeansException; BeanFactoryAware interface 를사용하면, 자신을생성한 BeanFactory 를알수있고, 프로그램적으로다른 bean 을검색할수 있다. 하지만이방법은 Spring 과의결합을발생시키고, Inversion of Control 스타일에도맞지않으므로피하는것이좋다. 대 안으로는 org.springframework.beans.factory.config.objectfactorycreatingfactorybean 을사용할수있다. - 65 -

2. IoC Container Annotaion XML 설정파일을사용하는대신자바어노테이션을사용할수있음 ( 자바 5 이상 ) annotation의사용으로설정파일을간결화하고, View 페이지와객체또는메소드의맵핑을명확하게할수있다 - 66 -

2. IoC Container Bean(29/42) Autowiring Spring IoC container는서로관련된 Bean 객체를자동으로엮어줄수있다. 자동엮기 (autowiring) 는각각의 bean 단위로설정되며, 자동엮기기능을사용하면 <property/> 나 <constructor-arg/> 를지정할필요가없어지므로, 타이핑일줄일수있다. 자동엮기에는 5가지모드가있으며, XML 기반설정에서는 <bean/> element의 'autowire' attribute를사용하여설정할수있다. Scope no 설명 자동엮기를사용하지않는다. Bean 에대한참조는 <ref/> element 를사용하여지정해야만한다. 이모드가기본 (default) 이다. byname Property 의이름으로자동엮기를수행한다. Property 의이름과같은이름을가진 bean 을찾아서엮어준다. bytype Property 의타입으로자동엮기를수행한다. Property 의타입과같은타입을가진 bean 을찾아서엮어준다. 만약같은타입을가진 bean 이 container 에둘이상존재할경우 exception 이발생한다. 만약같은타입을가진 bean 이존재하지않는경우, 아무일도발생하지않는다. 즉, property 에는설정되지않는다. constructor autodetect <bean/> element 의 'autowire-candidate' attribute 값을 'false' 로설정함으로써, 대상 bean 이다른 bean 과자동 으로엮이는것을방지한다. bytype 과유사하지만, 생성자 argument 에만적용된다. 만약같은타입의 bean 이존재하지않거나둘이상존재할경우, exception 이발생한다. Bean class 의성질에따라 constructor 와 bytype 모드중하나를선택한다. 만약 default 생성자가존재하면, bytype 모드가적용된다. - 67 -

2. IoC Container Bean(30/42) Annotation 기반설정 (1/12) Spring 은 Java Annotation 을사용하여 Bean 정의를설정할수있다. 이기능을사용하기위해서는다음 namespace 와 element 를추가해야한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> </beans> <context:annotation-config/> - 68 -

2. IoC Container Bean(31/42) Annotation 기반설정 (2/12) @Required @Required annotation 은 setter 메소드에적용된다. @Required annotation 이설정된 property 는 <property/>, <constructorarg/> element 를통해서명시적으로값이설정되거나, autowiring 에의해서값이설정되어야한다. public class SimpleMovieLister { private MovieFinder moviefinder; @Required public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; } } //... - 69 -

2. IoC Container Bean(32/42) Annotation 기반설정 (3/12) @Autowired(1/3) @Autowired annotation 은자동으로엮을 property 를지정하기위해사용한다. setter 메소드, 일반적인메소드, 생성자, field 등에적용된다. Setter 메소드 public class SimpleMovieLister { private MovieFinder moviefinder; @Autowired public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; } } //... - 70 -

2. IoC Container Bean(33/42) Annotation 기반설정 (4/12) @Autowired(2/3) 일반적인메소드 public class MovieRecommender { private MovieCatalog moviecatalog; private CustomerPreferenceDao customerpreferencedao; @Autowired public void prepare(moviecatalog moviecatalog, CustomerPreferenceDao customerpreferencedao) { this.moviecatalog = moviecatalog; this.customerpreferencedao = customerpreferencedao; } } //... - 71 -

2. IoC Container Bean(34/42) Annotation 기반설정 (5/12) @Autowired(3/3) 생성자및 field public class MovieRecommender { @Autowired private MovieCatalog moviecatalog; private CustomerPreferenceDao customerpreferencedao; @Autowired public MovieRecommender(CustomerPreferenceDao customerpreferencedao) { this.customerpreferencedao = customerpreferencedao; } } //... - 72 -

2. IoC Container Bean(35/42) Annotation 기반설정 (6/12) @Qualifier(1/3) @Autowired annotation 만을사용하는경우, 같은 Type 의 Bean 이둘이상존재할때문제가발생한다. 이를방지하기위해서 @Qualifier annotation 을사용하여찾을 Bean 의대상집합을좁힐수있다. @Qualifier annotation 은 field 뿐아니라생성자또 는메소드의 parameter 에도사용할수있다. Field public class MovieRecommender { @Autowired @Qualifier("main") private MovieCatalog moviecatalog; } //... - 73 -

2. IoC Container Bean(36/42) Annotation 기반설정 (7/12) @Qualifier(2/3) 메소드 Parameter public class MovieRecommender { private MovieCatalog moviecatalog; private CustomerPreferenceDao customerpreferencedao; @Autowired public void prepare(@qualifier("main") MovieCatalog moviecatalog, CustomerPreferenceDao customerpreferencedao) { this.moviecatalog = moviecatalog; this.customerpreferencedao = customerpreferencedao; } } //... - 74 -

2. IoC Container Bean(37/42) Annotation 기반설정 (7/12) @Qualifier(3/3) @Qualifier annotation 의값으로사용되는 qualifier 는 <bean/> element 의 <qualifier/> element 로설정한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/> <bean class="example.simplemoviecatalog"> <qualifier value="main"/> <!-- inject any dependencies required by this bean --> </bean> <bean class="example.simplemoviecatalog"> <qualifier value="action"/> <!-- inject any dependencies required by this bean --> </bean> <bean id="movierecommender" class="example.movierecommender"/> </beans> - 75 -

2. IoC Container Bean(38/42) Annotation 기반설정 (8/12) @Resource @Resource annotation의 name 값으로대상 bean을찾을수있다. @Resource annotation은 field 또는메소드에사용할수있다. public class SimpleMovieLister { private MovieFinder moviefinder; } @Resource(name="myMovieFinder") public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; } @Resource annotation 에 name 값이없을경우, field 명또는메소드명을이용하여대상 bean 을찾는다. public class SimpleMovieLister { private MovieFinder moviefinder; } @Resource public void setmoviefinder(moviefinder moviefinder) { this.moviefinder = moviefinder; } - 76 -

2. IoC Container Bean(39/42) Annotation 기반설정 (9/12) @PostConstruct & @PreDestroy @PostConstruct 와 @PreDestroy 는각각 Instantiation callback, Destruction callback 메소드를지정하기위해사용한다. public class CachingMovieLister { @PostConstruct public void populatemoviecache() { // populates the movie cache upon initialization... } } @PreDestroy public void clearmoviecache() { // clears the movie cache upon destruction... } - 77 -

2. IoC Container Bean(40/42) Annotation 기반설정 (10/12) Auto-detecting components(1/3) Spring 은 @Repository, @Service, @Controller annotation 을사용하여, 각각 Persistence, Service, Presentation 레이어의컴 포넌트로지정하여특별한관리기능을제공하고있다. @Repository, @Service, @Controller 는 @Component annotation 을 상속받고있다. Spring IoC Container 는 @Component annotation( 또는자손 ) 으로지정된 class 를 XML Bean 정의없이자동 으로찾을수있다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> </beans> <context:component-scan base-package="org.example"/> <context:component-scan/> element 의 base-package attribute 는컴포넌트를찾을기본 package 이다., 를사용하여다수의 기본 package 를지정할수있다. - 78 -

2. IoC Container Bean(41/42) Annotation 기반설정 (11/12) Auto-detecting components(2/3) 이름설정 @Component, @Repository, @Service, @Controller annotation 의 name 값으로 bean 의이름을지정할수있다. 아래예제의 Bean 이름은 mymovielister 이다. @Service("myMovieLister") public class SimpleMovieLister { //... } 만약 name 값을지정하지않으면, class 이름의첫문자를소문자로변환하여 Bean 이름을자동으로생성한다. 아래예제의 Bean 이름은 moviefinderimpl 이다. @Repository public class MovieFinderImpl implements MovieFinder { //... } - 79 -

2. IoC Container Bean(42/42) Annotation 기반설정 (12/12) Auto-detecting components(3/3) Scope 설정 @Scope annotation 을사용하여, 자동으로찾은 Bean 의 scope 를설정할수있다. @Scope("prototype") @Repository public class MovieFinderImpl implements MovieFinder { //... } Qualifier 설정 @Qualifier annotation 을사용하여, 자동으로찾은 Bean 의 qualifier 를설정할수있다. @Component @Qualifier("Action") public class ActionMovieCatalog implements MovieCatalog { //... } - 80 -

2. IoC Container ApplicationContext(1/2) ApplicationContext for web application(1/2) Spring 은 Web Application 에서 ApplicationContext 를쉽게사용할수있도록각종 class 들을제공하고있다. Servlet 2.4 이상 Servlet 2.4 specification 부터 Listener 를사용할수있다. Listener 를사용하여 ApplicationContext 를설정하기위해서 web.xml 파일에다음설정을추가한다. <context-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/daocontext.xml /WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> contextparam 의 contextconfiglocation 값은 Spring XML 설정파일의위치를나타낸다. - 81 -

2. IoC Container ApplicationContext(2/2) ApplicationContext for web application(2/2) Servlet 2.3 이하 Servlet 2.3 이하에서는 Listener 를사용할수없으므로, Servlet 를사용한다. web.xml 파일에다음설정을추가한다. <context-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/daocontext.xml /WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.contextloaderservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> - 82 -

LAB 201-ioc LAB 201-ioc 실습 - 83 -

2. 기타 property (1/2) Bean 설정파일사용 Bean 설정파일 <bean name="propertyservice" class="egovframework.rte.fdl.property.impl.egovpropertyserviceimpl" destroy-method="destroy"> <property name="properties"> <map> <entry key="aaaa" value="1234"/> </map> </property> </bean> 자바소스 @Resource(name="propertyService") protected EgovPropertyService propertyservice ; @Test public void testpropertiesservice() throws Exception { assertequals("1234",propertyservice.getstring("aaaa")); } - 84 -

2. 기타 property (2/2) 외부설정파일사용 (properties 파일 ) 스프링 Bean 설정파일에그파일위치를설정하여사용할수있다. <bean name="propertyservice" class="egovframework.rte.fdl.property.impl.egovpropertyserviceimpl" destroy-method="destroy"> <property name="extfilename"> <set> <map> <entry key="encoding" value="utf-8"/> <entry key="filename" value="file:./src/**/refresh-resource.properties"/> </map> <value>classpath*:properties/resource.properties</value> </set> </property> </bean> AAAA = 1234 @Resource(name="propertyService") protected EgovPropertyService propertyservice ; @Test public void testpropertiesservice() throws Exception { assertequals("1234",propertyservice.getstring("aaaa")); } properties 파일의내용을수정하고, propertyservice.refreshpropertyfiles() 를호출하여실시간으로갱신할수있다. - 85 -

2. 기타 Resource (1/2) Bean 설정 메시지 properties 파일은 classpath 상에서 egovframework-message.properties 파일이다. <bean name="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="usecodeasdefaultmessage"> <value>true</value> </property> <property name="basenames"> <list> <value>egovframework-message</value> </list> </property> </bean> properties 파일 # egovframework-message.properties 파일 Globals.DbType = mysql 자바소스 @Resource(name="messageSource") MessageSource messagesource ; String getmsg = messagesource.getmessage("resource.basic.msg1", null, Locale.getDefault() ); assertequals("get Message Success!", getmsg, "message1"); - 86 -

2. 기타 Resource (2/2) Message Locale 사용 properties 파일 # egovframework-message_ko.properties 파일 resource.locale = 메시지 1 # govframework-message_en.properties 파일 resource.locale = en_message1 자바소스 String getmsg = messagesource.getmessage("resource.locale.msg1", null, Locale.KOREAN ); assertequals("get Message Success!", getmsg, " 메시지 1"); String getmsg = messagesource.getmessage("resource.locale.msg1", null, Locale.ENGLISH ); assertequals("get Message Success!", getmsg, "en_message1"); Message Parameter resource.basic.msg3=message {0} {1} Object[] parameter = { new String("1"), new Integer(2) }; String getmsg = messagesource.getmessage("resource.basic.msg3", parameter, Locale.getDefault() ); assertequals("get Message Success!", getmsg, "message 1 2"); - 87 -

2. IoC Container 참고자료 The Spring Framework - Reference Documentation / Chapter 3. The IoC container http://static.springframework.org/spring/docs/2.5.x/reference/beans.html http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html Inversion of Control http://martinfowler.com/bliki/inversionofcontrol.html Inversion of Control Containers and the Dependency Injection pattern http://martinfowler.com/articles/injection.html - 88 -

3. AOP - 개요 (1/7) 서비스개요 객체지향프로그래밍 (Object Oriented Programming) 을보완하는개념으로어플리케이션을객체지향적으로모듈화하여작성하더라도다수의객체들에분산되어중복적으로존재하는공통관심사가여전히존재한다. AOP는이를횡단관심으로분리하여핵심관심과엮어서처리할수있는방법을제공한다. AOP 적용 객체지향개발 객체지향 + AOP 개발 - 89 -

3. AOP - 개요 (1/7) 서비스개요 객체지향프로그래밍 (Object Oriented Programming) 을보완하는개념으로어플리케이션을객체지향적으로모듈화하여작성하더라도다수의객체들에분산되어중복적으로존재하는공통관심사가여전히존재한다. AOP는이를횡단관심으로분리하여핵심관심과엮어서처리할수있는방법을제공한다. 로깅, 보안, 트랜잭션등의공통적인기능의활용을기존의비즈니스로직에영향을주지않고모듈화처리를지원하는프로그래밍기법 - 90 -

3. AOP - 개요 (2/7) 주요개념 Join Point 횡단관심 (Crosscutting Concerns) 모듈이삽입되어동작할수있는실행가능한특정위치를말함 메소드호출, 메소드실행자체, 클래스초기화, 객체생성시점등 Pointcut Pointcut은어떤클래스의어느 JoinPoint를사용할것인지를결정하는선택기능을말함 가장일반적인 Pointcut은 특정클래스에있는모든메소드호출 로구성된다. 애스펙트 (Aspect) Advice와 Pointcut의조합 어플리케이션이가지고있어야할로직과그것을실행해야하는지점을정의한것 Advice Advice는관점 (Aspect) 의실제구현체로결합점에삽입되어동작할수있는코드이다 Advice 는결합점 (JoinPoint) 과결합하여동작하는시점에따라 before advice, after advice, around advice 타입으로구분된다 특정 Join point에실행하는코드 Weaving Pointcut에의해서결정된 JoinPoint에지정된 Advice를삽입하는과정 Weaving은 AOP가기존의 Core Concerns 모듈의코드에전혀영향을주지않으면서필요한 Crosscutting Concerns 기능을추가할수있게해주는핵심적인처리과정임 - 91 -

3. AOP - 개요 (3/7) 주요개념 Advice, JoinPoint, Pointcut Pointcut JoinPoint Advice - 92 -

3. AOP - 개요 (4/7) 주요개념 Pointcut 예제 - bean() Pointcut 을이용하여종적및횡적으로빈을선택 - 93 -

3. AOP - 개요 (5/7) 주요개념 Weaving 방식 컴파일시엮기 : 별도컴파일러를통해핵심관심사모듈의사이사이에관점 (Aspect) 형태로만들어진횡단관심사코드들이삽입되어관점 (Aspect) 이적용된최종바이너리가만들어지는방식이다. (ex. AspectJ, ) 클래스로딩시엮기 : 별도의 Agent를이용하여 JVM이클래스를로딩할때해당클래스의바이너리정보를변경한다. 즉, Agent가횡단관심사코드가삽입된바이너리코드를제공함으로써 AOP를지원하게된다. (ex. AspectWerkz, ) 런타임엮기 : 소스코드나바이너리파일의변경없이프록시를이용하여 AOP를지원하는방식이다. 프록시를통해핵심관심사를구현한객체에접근하게되는데, 프록시는핵심관심사실행전후에횡단관심사를실행한다. 따라서프록시기반의런타임엮기의경우메소드호출시에만 AOP를적용할수있다는제한점이있다. (ex. Spring AOP, ) Advice 결합점결합타입 Before advice: joinpoint 전에수행되는 advice After returning advice: joinpoint가성공적으로리턴된후에동작하는 advice After throwing advice: 예외가발생하여 joinpoint가빠져나갈때수행되는 advice After (finally) advice: join point를빠져나가는 ( 정상적이거나예외적인반환 ) 방법에상관없이수행되는 advice Around advice: joinpoint 전, 후에수행되는 advice - 94 -

3. AOP - 개요 (6/7) 주요기능 횡단관심 (CrossCutting Concern) 모듈이삽입되어동작할수있도록지정하는 JointPoint 기능 횡단관심모듈을특정 JointPoint에사용할수있도록지정하는 Pointcut 기능 Pointcut 지정을위한패턴매칭표현식 Pointcut에서수행해야하는동작을지정하는 Advice 기능 Pointcut에의해서결정된 JoinPoint에지정된 Advice를삽입하여실제 AOP 방식대로동작 - 95 -

3. AOP - 개요 (7/7) 장점 중복코드의제거 횡단관심 (CrossCutting Concerns) 을여러모듈에반복적으로기술되는현상을방지 비즈니스로직의가독성향상 핵심기능코드로부터횡단관심코드를분리함으로써비즈니스로직의가독성향상 생산성향상 비즈니스로직의독립으로인한개발의집중력을높임 재사용성향상 횡단관심코드는여러모듈에서재사용될수있음 변경용이성증대 횡단관심코드가하나의모듈로관리되기때문에이에대한변경발생시용이하게수행할수있음 - 96 -

3. AOP - 설명 (1/17) Spring의 AOP 지원 스프링은프록시기반의런타임 Weaving 방식을지원한다. 스프링은 AOP 구현을위해다음세가지방식을제공한다. @AspectJ 어노테이션을이용한 AOP 구현 XML Schema를이용한 AOP 구현 스프링 API를이용한 AOP 구현 실행환경은 XML Schema 를이용한 AOP 구현방법을사용한다. - 97 -

3. AOP - 설명 (2/17) XML 스키마를이용한 AOP 지원 (1/11) 개요 Java 5 버전을사용할수없거나, XML 기반설정을선호하는경우사용한다. AOP 선언을한눈에파악할수있다. 실행환경은 XML 스키마를이용한 AOP를사용한다. - 98 -

3. AOP - 설명 (3/17) XML 스키마를이용한 AOP 지원 (2/11) Aspect 정의하기 Advice 정의 JoinPoint 정의 <bean id="adviceusingxml" class="egovframework.rte.fdl.aop.sample.adviceusingxml" /> Pointcut 정의 <aop:config> <aop:pointcut id="targetmethod" expression="execution(* egovframework.rte.fdl.aop.sample.*sample.*(..))" /> <aop:aspect ref="adviceusingxml"> <aop:before pointcut-ref="targetmethod" method="beforetargetmethod" /> <aop:after-returning pointcut-ref="targetmethod" method="afterreturningtargetmethod" returning="retval" /> <aop:after-throwing pointcut-ref="targetmethod" method="afterthrowingtargetmethod" throwing="exception" /> <aop:after pointcut-ref="targetmethod" method="aftertargetmethod" /> <aop:around pointcut-ref="targetmethod" method="aroundtargetmethod" /> </aop:aspect> </aop:config> Aspect 정의 <bean id="advicesample" class="egovframework.rte.fdl.aop.sample.advicesample" /> - 99 -

3. AOP - 설명 (4/17) XML 스키마를이용한 AOP 지원 (3/11) Advice 정의하기 before advice public class AdviceUsingXML { public void beforetargetmethod(joinpoint thisjoinpoint) { Class clazz = thisjoinpoint.gettarget().getclass(); String classname = thisjoinpoint.gettarget().getclass().getsimplename(); String methodname = thisjoinpoint.getsignature().getname(); // 대상메서드에대한로거를얻어해당로거로현재 class, method 정보로깅 Log logger = LogFactory.getLog(clazz); logger.debug(classname + "." + methodname + " executed."); } } - 100 -

3. AOP - 설명 (5/17) XML 스키마를이용한 AOP 지원 (4/11) Advice 정의하기 After returning advice After returing advice 는정상적으로메소드가실행될때수행된다. public class AdviceUsingXML { } public void afterreturningtargetmethod(joinpoint thisjoinpoint, Object retval) { System.out.println("AspectUsingAnnotation.afterReturningTargetMethod executed. + return value is [ + retval + "]"); } - 101 -

3. AOP - 설명 (6/17) XML 스키마를이용한 AOP 지원 (5/11) Advice 정의하기 After throwing advice After throwing advice 는메소드가수행중예외사항을반환하고종료하는경우수행된다. public class AdviceUsingXML {... public void afterthrowingtargetmethod(joinpoint thisjoinpoint, Exception exception) throws Exception{ System.out.println("AdviceUsingXML.afterThrowingTargetMethod executed."); System.err.println(" 에러가발생했습니다.", exception); throw new BizException(" 에러가발생했습니다.", exception); }... } - 102 -

3. AOP - 설명 (7/17) XML 스키마를이용한 AOP 지원 (6/11) Advice 정의하기 After (finally) advice After (finally) advice 는메소드수행후무조건수행된다. After advice 는정상종료와예외발생경우를모두처리해야하는경우에사용된다 ( 예 : 리소스해제작업 ) public class AdviceUsingXML { } public void aftertargetmethod(joinpoint thisjoinpoint) { System.out.println("AspectUsingAnnotation.afterTargetMethod executed."); } - 103 -

3. AOP - 설명 (8/17) XML 스키마를이용한 AOP 지원 (7/11) Advice 정의하기 Around advice Around advice 는메소드수행전후에수행된다. Return값을가공하기위해서는 Around를사용해야한다. public class AdviceUsingXML { public Object aroundtargetmethod(proceedingjoinpoint thisjoinpoint) throws Throwable { System.out.println("AspectUsingAnnotation.aroundTargetMethod start."); long time1 = System.currentTimeMillis(); Object retval = thisjoinpoint.proceed(); System.out.println("ProceedingJoinPoint executed. return value is [ + retval + "]"); retval = retval + "(modified)"; System.out.println("return value modified to [" + retval + "]"); } } long time2 = System.currentTimeMillis(); System.out.println("AspectUsingAnnotation.aroundTargetMethod end. Time(" + (time2 - time1) + ")"); return retval; - 104 -

3. AOP - 설명 (9/17) XML 스키마를이용한 AOP 지원 (8/11) Aspect 실행하기 정상실행의경우 public class AnnotationAspectTest { @Resource(name = advicesample") AdviceSample advicesample; @Test public void testadvice () throws Exception { SampleVO vo = new SampleVO();.. String resultstr = annotationadvicesample.somemethod(vo); assertequals("somemethod executed.(modified)", resultstr); } } - 105 -

3. AOP - 설명 (10/17) XML 스키마를이용한 AOP 지원 (9/11) Aspect 실행하기 정상실행인경우 콘솔로그출력 Advice 적용순서 1.before 2.around ( 대상메소드수행전 ) 3. 대상메소드 4.after-returning 5.after(finally) 6.around ( 대상메소드수행후 ) - 106 -

3. AOP - 설명 (11/17) XML 스키마를이용한 AOP 지원 (10/11) Aspect 실행하기 예외발생의경우 public class AnnotationAspectTest { @Resource(name = advicesample") AdviceSample advicesample; @Test public void testadvicewithexception() throws Exception { SampleVO vo = new SampleVO(); // exception 을발생하도록플래그설정 vo.setforceexception(true);.. try { String resultstr = annotationadvicesample.somemethod(vo); } } fail( exception 을강제로발생시켜이라인이수행될수없습니다."); } catch(exception e) {... } - 107 -

3. AOP - 설명 (12/17) XML 스키마를이용한 AOP 지원 (11/11) Aspect 실행하기 예외발생의경우 콘솔로그출력 Advice 적용순서 1.before 2.around ( 대상메소드수행전 ) 3. 대상메소드 (ArithmeticException 예외가발생한다 ) 4.afterThrowing 5.after(finally) - 108 -

3. AOP - 설명 (13/17) Pointcut 지정자 execution: 메소드실행결합점 (join points) 과일치시키는데사용된다. within: 특정타입에속하는결합점을정의한다. this: 빈참조가주어진타입의인스턴스를갖는결합점을정의한다. target: 대상객체가주어진타입을갖는결합점을정의한다. args: 인자가주어진타입의인스턴스인결합점을정의한다. @target: 수행중인객체의클래스가주어진타입의어노테이션을갖는결합점을정의한다. @args: 전달된인자의런타입타입이주어진타입의어노테이션을갖는결합점을정의한다. @within: 주어진어노테이션을갖는타입내결합점을정의한다. @annotation: 결합점의대상객체가주어진어노테이션을갖는결합점을정의한다. Pointcut 표현식조합 '&& : anypublicoperation() && intrading() ' ' : bean(*datasource) bean(*datasource) '!' :!bean(accountrepository) - 109 -

3. AOP - 설명 (14/17) Pointcut 정의예제 execution(public * *(..)) execution(* set*(..)) Pointcut execution(* com.xyz.service.accountservice.*(..)) execution(* com.xyz.service.*.*(..)) execution(* com.xyz.service..*.*(..)) within(com.xyz.service.*) within(com.xyz.service..*) this(com.xyz.service.accountservice) target(com.xyz.service.accountservice) args(java.io.serializable) @target(org.springframework.transaction.annotation.transactional) @within(org.springframework.transaction.annotation.transactional) @annotation(org.springframework.transaction.annotation.transaction al) @args(com.xyz.security.classified) bean(accountrepository)!bean(accountrepository) bean(*) bean(account*) bean(*repository) bean(accounting/*) bean(*datasource) bean(*datasource) public 메소드실행 선택된 Joinpoints 이름이 set 으로시작하는모든메소드명실행 AccountService 인터페이스의모든메소드실행 service 패키지의모든메소드실행 service 패키지와하위패키지의모든메소드실행 service 패키지내의모든결합점 service 패키지및하위패키지의모든결합점 AccountService 인터페이스를구현하는프록시개체의모든결합점 AccountService 인터페이스를구현하는대상객체의모든결합점 하나의파라미터를갖고전달된인자가 Serializable 인모든결합점 대상객체가 @Transactional 어노테이션을갖는모든결합점 대상객체의선언타입이 @Transactional 어노테이션을갖는모든결합점 실행메소드가 @Transactional 어노테이션을갖는모든결합점 단일파라미터를받고, 전달된인자타입이 @Classified 어노테이션을갖는모든결합점 accountrepository 빈 accountrepository 빈을제외한모든빈 모든빈 이름이 'account' 로시작되는모든빈 이름이 Repository 로끝나는모든빈 이름이 accounting/ 로시작하는모든빈 이름이 datasource 나 DataSource 으로끝나는모든빈 - 110 -

3. AOP - 설명 (15/17) 실행환경 AOP 가이드라인 실행환경은예외처리와트랜잭션처리에 AOP 를적용함 실행환경 AOP 가이드라인 예외처리 (1/2) 관점 (Aspect) 정의 : resources/egovframework.spring/context-aspect.xml Advice 정의 <bean id="exceptiontransfer" class="egovframework.rte.fdl.cmmn.aspect.exceptiontransfer">... </bean> <aop:config> <aop:pointcut id="servicemethod" expression="execution(* egovframework.rte.sample..impl.*impl.*(..))" /> Pointcut 정의 <aop:aspect ref="exceptiontransfer"> <aop:after-throwing throwing="exception pointcut-ref="servicemethod" method="transfer" /> </aop:aspect> </aop:config> JoinPoint 정의 Aspect 정의 - 111 -

3. AOP - 설명 (16/17) 실행환경 AOP 가이드라인 예외처리 (2/2) Advice 클래스 : egovframework.rte.fdl.cmmn.aspect.exceptiontransfer public class ExceptionTransfer { } public void transfer(joinpoint thisjoinpoint, Exception exception) throws Exception {... if (exception instanceof EgovBizException) { log.debug("exception case :: EgovBizException "); EgovBizException be = (EgovBizException) exception; getlog(clazz).error(be.getmessage(), be.getcause()); processhandling(clazz, exception, pm, exceptionhandlerservices, false); throw be; } else if (exception instanceof RuntimeException) { log.debug("runtimeexception case :: RuntimeException "); RuntimeException be = (RuntimeException) exception; getlog(clazz).error(be.getmessage(), be.getcause()); processhandling(clazz, exception, pm, exceptionhandlerservices, true);... throw be; } else if (exception instanceof FdlException) {... throw fe; } else {... throw processexception(clazz, "fail.common.msg", new String[] {}, exception, locale); } } - 112 -

3. AOP - 설명 (17/17) 실행환경 AOP 가이드라인 트랜잭션처리 관점 (Aspect) 정의 : resources/egovframework.spring/context-transaction.xml <!-- 트랜잭션관리자를설정한다. --> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> <!-- 트랜잭션 Advice 를설정한다. --> <tx:advice id="txadvice" transaction-manager="txmanager"> <tx:attributes> <tx:method name="*" rollback-for="exception"/> </tx:attributes> </tx:advice> <!-- 트랜잭션 Pointcut 를설정한다.---> <aop:config> <aop:pointcut id="requiredtx expression="execution(* egovframework.rte.sample..impl.*impl.*(..))"/> <aop:advisor advice-ref="txadvice pointcut-ref="requiredtx" /> </aop:config> - 113 -

3. AOP - 참고자료 Spring 2.5/3.0 Reference Documentation http://static.springframework.org/spring/docs/2.5.x/reference/aop.html http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html The new() Pointcut http://blog.springsource.com/2007/09/24/the-new-bean-pointcut/ - 114 -

3. AOP 부록 (1/11) @AspectJ 어노테이션을이용한 AOP 지원 (1/11) 개요 @AspectJ는 Java 5 어노테이션을사용하여일반 Java 클래스로관점 (Aspect) 을정의하는방식이다. @AspectJ 방식은 AspectJ 5 버전에서소개되었으며, Spring은 2.0 버전부터 AspectJ 5 어노테이션을지원한다. Spring AOP 실행환경은 AspectJ 컴파일러나 Weaver에대한의존성이없이 @AspectJ 어노테이션을지원한다. - 115 -

3. AOP 부록 (2/11) @AspectJ 어노테이션을이용한 AOP 지원 (2/11) @AspectJ 설정하기 <aop:aspectj-autoproxy/> Aspect 정의하기 import org.aspectj.lang.annotation.aspect; @Aspect public class AspectUsingAnnotation {.. } Pointcut 정의하기 @Aspect public class AspectUsingAnnotation {... @Pointcut("execution(public * egovframework.rte.fdl.aop.sample.*sample.*(..))") public void targetmethod() { // pointcut annotation 값을참조하기위한 dummy method }... } - 116 -

3. AOP 부록 (3/11) @AspectJ 어노테이션을이용한 AOP 지원 (3/11) Advice 정의하기 before advice Before advice 는 @Before 어노테이션을사용한다. @Aspect public class AspectUsingAnnotation { @Before("targetMethod()") public void beforetargetmethod(joinpoint thisjoinpoint) { Class clazz = thisjoinpoint.gettarget().getclass(); String classname = thisjoinpoint.gettarget().getclass().getsimplename(); String methodname = thisjoinpoint.getsignature().getname(); // 대상메서드에대한로거를얻어해당로거로현재 class, method 정보로깅 Log logger = LogFactory.getLog(clazz); logger.debug(classname + "." + methodname + " executed."); } } - 117 -

3. AOP 부록 (4/11) @AspectJ 어노테이션을이용한 AOP 지원 (4/11) Advice 정의하기 After returning advice After returing advice 는정상적으로메소드가실행될때수행된다. After returning advice 는 @AfterReturing 어노테이션을사용한다. @Aspect public class AspectUsingAnnotation { } @AfterReturning(pointcut = "targetmethod()", returning = "retval") public void afterreturningtargetmethod(joinpoint thisjoinpoint, Object retval) { System.out.println("AspectUsingAnnotation.afterReturningTargetMethod executed. + return value is [ + retval + "]"); } - 118 -

3. AOP 부록 (5/11) @AspectJ 어노테이션을이용한 AOP 지원 (5/11) Advice 정의하기 After throwingadvice After throwing advice 는메소드가수행중예외사항을반환하고종료하는경우수행된다. After throwing advice 는 @AfterThrowing 어노테이션을사용한다. @Aspect public class AspectUsingAnnotation { @AfterThrowing(pointcut = "targetmethod()", throwing = "exception") public void afterthrowingtargetmethod(joinpoint thisjoinpoint, Exception exception) throws Exception { System.out.println("AspectUsingAnnotation.afterThrowingTargetMethod executed."); System.out.println(" 에러가발생했습니다.", exception); } } throw new BizException(" 에러가발생했습니다.", exception); - 119 -

3. AOP 부록 (6/11) @AspectJ 어노테이션을이용한 AOP 지원 (6/11) Advice 정의하기 After (finally) advice After (finally) advice 는메소드수행후무조건수행된다. After advice 는정상종료와예외발생경우를모두처리해야하는경우에사용된다 ( 예 : 리소스해제작업 ) After (finally) advice 는 @After 어노테이션을사용한다. @Aspect public class AspectUsingAnnotation { } @After("targetMethod()") public void aftertargetmethod(joinpoint thisjoinpoint) { System.out.println("AspectUsingAnnotation.afterTargetMethod executed."); } - 120 -

3. AOP 부록 (7/11) @AspectJ 어노테이션을이용한 AOP 지원 (7/11) Advice 정의하기 Around advice Around advice 는메소드수행전후에수행된다. Around advice 는 @Around 어노테이션을사용한다. @Aspect public class AspectUsingAnnotation { @Around("targetMethod()") public Object aroundtargetmethod(proceedingjoinpoint thisjoinpoint) throws Throwable { System.out.println("AspectUsingAnnotation.aroundTargetMethod start."); long time1 = System.currentTimeMillis(); Object retval = thisjoinpoint.proceed(); System.out.println("ProceedingJoinPoint executed. return value is [ + retval + "]"); retval = retval + "(modified)"; System.out.println("return value modified to [" + retval + "]"); } } long time2 = System.currentTimeMillis(); System.out.println("AspectUsingAnnotation.aroundTargetMethod end. Time(" + (time2 - time1) + ")"); return retval; - 121 -

3. AOP 부록 (8/11) @AspectJ 어노테이션을이용한 AOP 지원 (8/11) Aspect 실행하기 정상실행인경우 public class AnnotationAspectTest { @Resource(name = "annotationadvicesample") AnnotationAdviceSample annotationadvicesample; @Test public void testannotationaspect() throws Exception { SampleVO vo = new SampleVO();.. String resultstr = annotationadvicesample.somemethod(vo); } } assertequals("somemethod executed.(modified)", resultstr); - 122 -

3. AOP 부록 (9/11) @AspectJ 어노테이션을이용한 AOP 지원 (9/11) Aspect 실행하기 정상실행인경우 콘솔로그출력 Advice 적용순서 1.@Before 2.@Around ( 대상메소드수행전 ) 3. 대상메소드 4.@Around ( 대상메소드수행후 ) 5.@After(finally) 6.@AfterReturning - 123 -

3. AOP 부록 (10/11) @AspectJ 어노테이션을이용한 AOP 지원 (10/11) Aspect 실행하기 예외발생의경우 public class AnnotationAspectTest { @Resource(name = "annotationadvicesample") AnnotationAdviceSample annotationadvicesample; @Test public void testannotationaspect() throws Exception { SampleVO vo = new SampleVO(); // exception 을발생하도록플래그설정 vo.setforceexception(true);.. try { String resultstr = annotationadvicesample.somemethod(vo); } } fail( exception 을강제로발생시켜이라인이수행될수없습니다."); } catch(exception e) {... } - 124 -

3. AOP 부록 (11/11) @AspectJ 어노테이션을이용한 AOP 지원 (11/11) Aspect 실행하기 예외발생의경우 콘솔로그출력 Advice 적용순서 1.@Before 2.@Around ( 대상메소드수행전 ) 3. 대상메소드 (ArithmeticException 예외가발생한다 ) 4.@After(finally) 5.@AfterThrowing - 125 -

LAB 202-aop LAB 202-aop 실습 - 126 -

4. Cache - 개요 서비스개요 빈번히사용되는컨텐츠에대해서빠른접근을가능하게하여잦은접근을통한오버헤드나시간을절약하기 위한서비스 주요기능 Cache를위한속성설정 Cache 매체 ( 메모리, 디스크등 ) 를지정 Cache 사이즈 (Disk 용량, Object 수등 ) 를지정 Cache 알고리즘 (LRU, FIFO 등 ) 을지정 Cache에대상을입력 Cache로부터대상을얻는기능 클러스터링을지원하는기능 - 127 -

4. Cache - 설명 (1/3) Cache 서비스 Cache Service는 EhCache를선정. 변경이자주일어나지않지만사용빈도가높고생성하는데비용이많이드는객체일경우, Cache를이용하면다음과같은장점을얻을수있음. 자주접근하는데이터를매번데이터베이스로부터 fetch할필요가없으므로오버헤드가줄어듬. 객체를매번생성하지않기때문에메모리를효율적으로사용할수있음. 기본사용법 Cache를사용하기위한 Cache Manager 생성샘플 // 클래스패스를이용하여설정파일읽어서 Cache Manager 생성하기. URL url = getclass().getresource("/ehcache-default.xml"); manager = new CacheManager(url); - 128 -

4. Cache - 설명 (2/3) 기본사용법 Configuration <ehcache> <diskstore path="user.dir/second"/> <cache name="samplemem" maxelementsinmemory="3" eternal="false" timetoidleseconds="360" timetoliveseconds="1000" overflowtodisk="false" diskpersistent="false" memorystoreevictionpolicy="lru"> </cache> </ehcache> Basic Usage Source 위에서정의한 Cache Manager 를사용하여 Cache 에데이터를입력 / 조회 / 삭제하는기본샘플코드 // cache Name 을가지고 cache 얻기 Cache cache = manager.getcache("samplemem"); // 1.Cache 에데이터입력 cache.put(new Element("key1", "value1")); // 2.Cache 로부터입력한데이터읽기 Element value = cache.get("key1"); // 3. Cache 에서데이터삭제 cache.remove("key1"); - 129 -

4. Cache - 설명 (3/3) Cache Algorithm LRU Algorithm FIFO Algorithm LFU Algorithm Cache Size & Device Cache에서관리해야하는정보의사이즈설정및저장디바이스관련설정 Cache Device : 디바이스관련세팅은메모리관리캐쉬의디스크관리로의이동관련설정으로메모리관리오브젝트수가넘었을때 Disk 로이동여부, flush 호출시파일로저장여부에대한세팅이있음 Cache Size : 사이즈관련세팅은메모리에서관리해야할최대오브젝트수, 디스크에서관리하는최대오브젝트수에대한세팅 Distributed Cache Ehcache는 Distributed Cache를지원하는방법으로 RMI,JGROUP,JMS등을지원함 Using Jgroups : JGroups는 multicast 기반의커뮤니케이션툴킷으로그룹을생성하고그룹멤버간에메시지를주고받을수있도록지원함 Using ActiveMQ : ActiveMQ는 JMS 메시징서비스를제공하는오픈소스 - 130 -

4. Cache - 참고자료 EhCache http://ehcache.sourceforge.net/ - 131 -

5. Compress/Decompress - 개요 서비스개요 데이터를압축하고복원하는기능을제공하는서비스로서, 데이터를효율적으로저장하고전송하기위해서원 본데이터를압축하거나, 압축된데이터를복원하여원본데이터를얻기위한서비스 주요기능 데이터압축 (Compress) 데이터의복원을위하여비손실압축방식을이용하여압축 데이터복원 (Decompress) 압축된데이터복원 - 132 -

5. Compress/Decompress - 설명 (1/3) Compress/Decompress 서비스 다양한압축방식과개발자들에게편리한 API를제공하는 Jakarta Commons의 Compress 를사용 Jakarta Commons의 Compress에서지원하는 tar, zip and bzip2 파일등을지원함 Commons Compress에서제공하고있는 API (http://commons.apache.org/compress/apidocs/index.html) org.apache.commons.compress.archivers org.apache.commons.compress.archivers.ar org.apache.commons.compress.archivers.cpio org.apache.commons.compress.archivers.jar org.apache.commons.compress.archivers.tar org.apache.commons.compress.archivers.zip org.apache.commons.compress.changes org.apache.commons.compress.compressors org.apache.commons.compress.compressors.bzip2 org.apache.commons.compress.compressors.gzip org.apache.commons.compress.utils - 133 -

5. Compress/Decompress - 설명 (2/3) Commons Compress 를사용한간단한예제 (Archive) org.apache.commons.compress.archivers 패키지에속한 ArchiveInputStream 클래스를사용하여 compress/decompress 로구성됨.. // Archive final File output = new File(dir, "bla.zip"); final File file1 = getfile("test1.xml"); final File file2 = getfile("test2.xml"); { final OutputStream out = new FileOutputStream(output); final ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("zip", out);... } os.putarchiveentry(new ZipArchiveEntry("testdata/test1.xml")); IOUtils.copy(new FileInputStream(file1), os); os.closearchiveentry(); os.putarchiveentry(new ZipArchiveEntry("testdata/test2.xml")); IOUtils.copy(new FileInputStream(file2), os); os.closearchiveentry(); os.close(); - 134 -

5. Compress/Decompress - 설명 (3/3) Commons Compress 를사용한간단한예제 (Unarchive ) org.apache.commons.compress.archivers 패키지에속한 ArchiveInputStream 클래스를사용하여 compress/decompress 로구성됨. //Unarchive List results = new ArrayList(); { final InputStream is = new FileInputStream(output); final ArchiveInputStream in = new ArchiveStreamFactory(). createarchiveinputstream("zip", is);. } File result = File.createTempFile("dir-result", ""); result.delete(); result.mkdir(); ZipArchiveEntry entry = null; while((entry = (ZipArchiveEntry)in.getNextEntry())!= null) { File outfile = new File(result.getCanonicalPath() + "/result/" + entry.getname()); outfile.getparentfile().mkdirs(); OutputStream out = new FileOutputStream(outfile); IOUtils.copy(in, out); out.close(); results.add(outfile); } in.close(); - 135 -

5. Compress/Decompress - 참고자료 압축알고리즘 http://kaistizen.net/project/zip/knowledge.html Apache Commons Compress http://commons.apache.org/compress/index.html Commons Compress 1.1 API http://commons.apache.org/compress/apidocs/index.html - 136 -

6. Encryption/Decryption - 개요 (1/2) 서비스개요 암호화 (Encryption,Ciphering) 는메시지의내용이불명확하도록평문을재구성하여암호문을만드는것인데, 이때사용되는메시지의재구성방법을암호화알고리즘 (Encryption Algorithm) 이라고부른다. 암호화알고리즘에서는암호화의비밀성을높이기위해키 (Key) 를사용하기도한다. 복호화 (Decryption,deciphering) 란암호화의역과정으로, 불명확한메시지로부터본래의메시지를환원하는과정이다. Jasypt는오픈소스 Java library로개발자는암호화관련깊은지식이없어도암복호화프로그램을개발할수있도록지원한다. 여기서설명하는부분은암복호화모듈로사용한 API 중심으로설명하겠다. 주요기능 Password Encoder Jasypt 의 ConfigurablePasswordEncryptor 를통해패스워드인코딩을지원한다. ( 기본알고리즘 : SHA-256) General Cryptography Service setalgorithm( ), setblocksize( ), setpasswordencoder( ) 메소드를통해암복호화에대한알고리즘등을설정한다. 기본알고리즘은 PBEWithSHA1AndDESede, 기본블럭사이즈는 1024로처리된다. byte[], BigDecimal, File에대하여암호화및복화화서비스를제공한다. - 137 -

6. Encryption/Decryption 개요 (2/2) ARIA Algorithm Cryptography Service 국정원의 ARIA 알고리즘을통한암복화서비스를제공한다. setblocksize( ), setpasswordencoder( ) 메소드를통해암복호화에대한정보를설정한다. 기본블럭사이즈는 1024로처리된다. byte[], File에대하여암호화및복화화서비스를제공한다 Digest Service Hash Function을통한 Message Digest 서비스를제공한다. setalgorithm( ), setplaindigest( ) 메소드를통해 Digest 방식에대한정보를설정한다. 기본알고리즘은 SHA-256이며, 기본 PlainDigest 설정은 false로처리된다. (PainDigest가 true이면 1000 iterations, 8 salt byte size가적용된다.) byte[] 에대한 digest 및 matches 서비스가제공된다. - 138 -

6. Encryption/Decryption - 설명 (1/5) Property 설정 # Message digest algorithm using EgovPasswordEncoder.. crypto.password.algorithm=sha-256 # hashed password (ex: egovframe (SHA-256) => gdyys/izqy86vcwht8emcyfqy1ahw2vtlg+/fznqtrq=) crypto.hashed.password=gdyys/izqy86vcwht8emcyfqy1ahw2vtlg+/fznqtrq= crypto.password.algorithm : 패스워드인코더에사용될 hash function 알고리즘 crypto.hashed.password : 패스워드에대한 hash value (egovframework.rte.fdl.cryptography.egovpasswordencoder의 main 메소드에의해해당값을얻어기록한다.) Properties 파일지정 <context:property-placeholder location="classpath*:/meta-inf/spring/crypto_config.properties,classpath*:/meta- INF/spring/password.properties" /> <!-- recommended location method is using file prefix.. ex) "file:/home/properties/crypto_config.properties" --> - 139 -

6. Encryption/Decryption - 설명 (2/5) XML 설정 <bean id="passwordencoder" class="egovframework.rte.fdl.cryptography.egovpasswordencoder"> <property name="algorithm" value="${crypto.password.algorithm}" /><!-- default : SHA-256 --> <property name="hashedpassword" value="${crypto.hashed.password}" /> </bean> <bean id="ariacryptoservice" class="egovframework.rte.fdl.cryptography.impl.egovariacryptoserviceimpl"> <property name="passwordencoder" ref="passwordencoder" /> <property name="blocksize" value="1025" /><!-- default : 1024 --> </bean> <bean id="digestservice" class="egovframework.rte.fdl.cryptography.impl.egovdigestserviceimpl"> <property name="algorithm" value="sha-256" /><!-- default : SHA-256 --> <property name="plaindigest" value="false" /><!-- default : false --> </bean> <bean id="generalcryptoservice" class="egovframework.rte.fdl.cryptography.impl.egovgeneralcryptoserviceimpl"> <property name="passwordencoder" ref="passwordencoder" /> <property name="algorithm" value="pbewithsha1anddesede" /><!-- default : PBEWithSHA1AndDESede --> <property name="blocksize" value="1024" /><!-- default : 1024 --> </bean> - 140 -

6. Encryption/Decryption - 설명 (3/5) Encryption texts Guide Program @Test public void teststring() { String[] teststring = { "This is a testing...\nhello!", " 한글테스트입니다...", "!@#$%^&*()_+ ~{}:\"<>?-=\\`[];',./" }; try { For (String str : teststring) { byte[] encrypted = cryptoservice.encrypt(str.getbytes("utf-8"), password); byte[] decrypted = cryptoservice.decrypt(encrypted, password); } assertequals(str, new String(decrypted, "UTF-8")); } } catch (UnsupportedEncodingException uee) { uee.printstacktrace(); fail(); } - 141 -

6. Encryption/Decryption - 설명 (4/5) Encryption file Guide Program @Test public void testfile() { String filepath = "/META-INF/spring/file/test.hwp"; File srcfile = new File(this.getClass().getResource(filePath).getFile()); File trgtfile; File decryptedfile; try { trgtfile = File.createTempFile("tmp", "encrypted"); trgtfile.deleteonexit(); cryptoservice.encrypt(srcfile, password, trgtfile); decryptedfile = File.createTempFile("tmp", "decrypted"); decryptedfile.deleteonexit(); cryptoservice.decrypt(trgtfile, password, decryptedfile); } asserttrue("decrypted file not same!!", checkfilewithhashfunction(srcfile, decryptedfile)); } catch (Exception ex) { ex.printstacktrace(); fail(ex.getmessage()); } - 142 -

6. Encryption/Decryption - 설명 (5/5) Message Digest Guide Program @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/meta-inf/spring/*.xml" }) public class EgovDigestServiceTest { @Resource(name="digestService") EgovDigestService digestservice; @Test public void testdigest() { String data = "egovframe"; byte[] digested = digestservice.digest(data.getbytes()); } } asserttrue(digestservice.matches(data.getbytes(), digested)); - 143 -

6. Encryption/Decryption - 참고자료 JASYPT class API http://www.jasypt.org/api/jasypt/apidocs/index.html - 144 -

7. Excel - 개요 서비스개요 Excel 파일포맷을다룰수있는자바라이브러리를제공하여 Java 어플리케이션에서도 Excel 파일을다룰수있는서비스 Apache POI 오픈소스를사용하여 Excel파일접근및 Excel업 / 다운로드기능을서비스함 주요기능 엑셀파일을읽어특정셀의값조회 엑셀파일내특정셀의내용을변경 엑셀파일내특정셀의속성 ( 폰트, 사이즈등 ) 변경 엑셀파일생성 엑셀파일다운로드 엑셀파일의속성 ( 셀의크기, Border의속성, 셀의색상, 정렬등 ) 변경 엑셀파일문서의속성 (Header, Footer) 을변경 공통템플릿사용을통한일관성제공 - 145 -

7. Excel - 설명 (1/13) 주요기능 Excel 파일생성 HSSFWorkbook 인스턴스를생성하여 Excel sheet 를추가생성 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet1 = wb.createsheet(sheetname1); HSSFSheet sheet2 = wb.createsheet(sheetname2); HSSFSheet sheet = wb.createsheet(); // 엑셀파일생성 HSSFWorkbook tmp = excelservice.createworkbook(wb, filename); // 파일존재확인 asserttrue(egovfileutil.isexistsfile(sb.tostring())); // 저장된 Sheet 명일치점검 assertequals(sheetname1, tmp.getsheetname(0)); assertequals(sheetname2, tmp.getsheetname(1)); - 146 -

7. Excel - 설명 (2/13) 주요기능 Excel 파일수정 저장된엑셀파일을로드할수있음 지정한 sheet 에 row 와 cell 객체를생성하여텍스트를저장하고수정할수있음 // 엑셀파일로드 HSSFWorkbook wb = excelservice.loadworkbook(filename); HSSFSheet sheet = wb.getsheetat(0); HSSFRow row = sheet.createrow( rownum ); row.setheight( (short) 0x349 ); HSSFCell cell = row.createcell( cellnum ); cell.setcelltype( HSSFCell.CELL_TYPE_STRING ); cell.setcellvalue( new HSSFRichTextString(content) ); cell.setcellstyle( cs ); sheet.setcolumnwidth( (short) 20, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) ); FileOutputStream out = new FileOutputStream(filename); wb.write(out); out.close(); - 147 -

7. Excel - 설명 (3/13) 주요기능 Excel 파일속성수정 엑셀파일의속성 ( 셀의크기, Border 의속성, 셀의색상, 정렬등 ) 을수정 HSSFFont, HSSFCellStyle 클래스를이용하여셀에적용된폰트, 색상및정렬등을설정할수있음 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet1 = wb.createsheet("new sheet"); HSSFSheet sheet2 = wb.createsheet("second sheet"); // 셀의크기 sheet1.setdefaultrowheight(rowheight); sheet1.setdefaultcolumnwidth(columnwidth); HSSFFont f2 = wb.createfont(); HSSFCellStyle cs = wb.createcellstyle(); cs = wb.createcellstyle(); cs.setfont( f2 ); cs.setwraptext( true ); // 정렬 cs.setalignment(hssfcellstyle.align_right); cs.setfillpattern(hssfcellstyle.diamonds); // 무늬스타일 // 셀의색상 cs.setfillforegroundcolor( new HSSFColor.BLUE().getIndex()); // 무늬색 cs.setfillbackgroundcolor( new HSSFColor.RED().getIndex()); // 배경색 sheet1.setdefaultcolumnstyle((short) 0, cs); - 148 -

7. Excel - 설명 (4/13) 주요기능 Excel 문서속성수정 엑셀파일문서의속성 (Header/Footer) 을수정 HSSFHeader, HSSFFooter 클래스로엑셀문서의 Header 와 Footer 의값과속성을설정 // 엑셀파일로드 HSSFWorkbook wb = excelservice.loadworkbook(filename); HSSFSheet sheet = wb.createsheet("doc test sheet"); HSSFRow row = sheet.createrow(1); HSSFCell cell = row.createcell((short) 1); cell.setcellvalue(new HSSFRichTextString("Header/Footer Test")); // Header HSSFHeader header = sheet.getheader(); header.setcenter("center Header"); header.setleft("left Header"); header.setright(hssfheader.font("stencil-normal", "Italic") + HSSFHeader.fontSize((short) 16) + "Right Stencil-Normal Italic font and size 16"); // Footer HSSFFooter footer = sheet.getfooter(); footer.setcenter(hssfheader.font("fixedsys", "Normal") + HSSFHeader.fontSize((short) 12) + "- 1 -"); footer.setleft("left Footer"); footer.setright("right Footer"); // 엑셀파일저장 FileOutputStream out = new FileOutputStream(sb.toString()); wb.write(out); out.close(); - 149 -

7. Excel - 설명 (5/13) 주요기능 셀내용추출 엑셀파일을읽어특정셀의값을얻어옴 HSSFCell 클래스의 getrichstringcellvalue, getnumericcellvalue, getstringcellvalue 등다양한 type 의 Cell 내용을추출 // 엑셀파일로드 HSSFWorkbook wb = excelservice.loadworkbook(sb.tostring()); HSSFSheet sheet = wb.createsheet("cell test sheet2"); sheet.setcolumnwidth((short) 3, (short) 200); // column Width HSSFCellStyle cs = wb.createcellstyle(); HSSFFont font = wb.createfont(); font.setfontheight((short) 16); font.setboldweight((short) 3); font.setfontname("fixedsys"); cs.setfont(font); cs.setalignment(hssfcellstyle.align_right); // cell 정렬 cs.setwraptext( true ); for (int i = 0; i < 100; i++) { HSSFRow row = sheet.createrow(i); row.setheight((short)300); // row 의 height 설정 for (int j = 0; j < 5; j++) { HSSFCell cell = row.createcell((short) j); cell.setcellvalue( new HSSFRichTextString("row " + i + ", cell " + j)); cell.setcellstyle( cs ); } } // 엑셀파일저장 FileOutputStream out = new FileOutputStream(sb.toString()); wb.write(out); out.close(); - 150 -

7. Excel - 설명 (6/13) 주요기능 셀속성추출 특정셀의속성 ( 폰트, 사이즈등 ) 을수정 HSSFFont, HSSFCellStyle 등의클래스를이용하여셀의폰트, 사이즈등의셀속성을수정 // 엑셀파일로드 HSSFWorkbook wb = excelservice.loadworkbook(sb.tostring()); HSSFSheet sheet = wb.createsheet("cell test sheet2"); sheet.setcolumnwidth((short) 3, (short) 200); // column Width HSSFCellStyle cs = wb.createcellstyle(); HSSFFont font = wb.createfont(); font.setfontheight((short) 16); font.setboldweight((short) 3); font.setfontname("fixedsys"); cs.setfont(font); cs.setalignment(hssfcellstyle.align_right); // cell 정렬 cs.setwraptext( true ); for (int i = 0; i < 100; i++) { HSSFRow row = sheet.createrow(i); row.setheight((short)300); // row 의 height 설정 for (int j = 0; j < 5; j++) { HSSFCell cell = row.createcell((short) j); cell.setcellvalue(new HSSFRichTextString("row " + i + ", cell " + j)); cell.setcellstyle( cs ); } } // 엑셀파일저장 FileOutputStream out = new FileOutputStream(sb.toString()); wb.write(out); out.close(); - 151 -

7. Excel - 설명 (7/13) 주요기능 공통템플릿사용 공통템플릿을사용하여일관성을유지한다. jxls 오픈소스를사용하여작성된템플릿에지정된값을저장 List<PersonHourVO> persons = new ArrayList<PersonHourVO>(); PersonHourVO person = new PersonHourVO(); person.setname("yegor Kozlov"); person.setid("yk"); person.setmon(5.0); person.settue(8.0); person.setwed(10.0); person.setthu(5.0); person.setfri(5.0); person.setsat(7.0); person.setsun(6.0); persons.add(person); PersonHourVO person1 = new PersonHourVO(); person1.setname("gisella Bronzetti"); person1.setid("gb"); person1.setmon(4.0); person1.settue(3.0); person1.setwed(1.0); person1.setthu(3.5); person1.setsun(4.0); persons.add(person1); Map<String, Object> beans = new HashMap<String, Object>(); beans.put("persons", persons); XLSTransformer transformer = new XLSTransformer(); transformer.transformxls(filename, beans, sbresult.tostring()); - 152 -

7. Excel - 설명 (8/13) 주요기능 공통템플릿사용 공통템플릿을사용하여일관성을유지한다. jxls 오픈소스를사용하여작성된템플릿에지정된값을저장 - 153 -

7. Excel - 설명 (9/13) 엑셀다운로드 Configuration <bean id="categoryexcelview" class="egovframework.rte.fdl.excel.download.categoryexcelview" /> <bean class="org.springframework.web.servlet.view.beannameviewresolver"> <property name="order" value="0" /> </bean> Controller 클래스 (Map 을사용할경우 ) @RequestMapping("/sale/listExcelCategory.do") public ModelAndView selectcategorylist() throws Exception { List<Map> lists = new ArrayList<Map>(); Map<String, String> mapcategory = new HashMap<String, String>(); mapcategory.put("id", "0000000001"); mapcategory.put("name", "Sample Test"); mapcategory.put("description", "This is initial test data."); mapcategory.put("useyn", "Y"); mapcategory.put("reguser", "test"); lists.add(mapcategory); Map<String, Object> map = new HashMap<String, Object>(); map.put("category", lists); } return new ModelAndView("categoryExcelView", "categorymap", map); - 154 -

7. Excel - 설명 (10/13) 엑셀다운로드 Controller 클래스 (VO 를사용한경우 ) @RequestMapping("/sale/listExcelCategory.do") public ModelAndView selectcategorylist() throws Exception { List<UsersVO> lists = new ArrayList<UsersVO>(); UsersVO users = new UsersVO(); users.setid("0000000001"); users.setname("sample Test"); users.setdescription("this is initial test data."); users.setuseyn("y"); users.setreguser("test"); lists.add(users); Map<String, Object> map = new HashMap<String, Object>(); map.put("category", lists); } return new ModelAndView("categoryExcelView", "categorymap", map); - 155 -

7. Excel - 설명 (11/13) 엑셀다운로드 ExcelView 클래스 public class CategoryExcelView extends AbstractExcelView { @Override protected void buildexceldocument(map model, HSSFWorkbook wb, HttpServletRequest req, HttpServletResponse resp) throws Exception { HSSFSheet sheet = wb.createsheet("user List"); sheet.setdefaultcolumnwidth((short) 12); HSSFCell cell = getcell(sheet, 0, 0); settext(cell, "User List"); settext(getcell(sheet, 2, 0), "id"); settext(getcell(sheet, 2, 1), "name");.. Controller 의 return 한객체의파라미터 Map<String, Object> map= (Map<String, Object>) model.get("categorymap"); List<Object> categories = (List<Object>) map.get("category"); if (categories.size() > 0) { Object obj = categories.get(0); } for (int i = 0; i < categories.size(); i++) { Map<String, String> category = (Map<String, String>) categories.get(i); cell = getcell(sheet, 3 + i, 0); settext(cell, category.get("id")); - 156 -

7. Excel - 설명 (12/13) 엑셀업로드 Configuration <bean id="excelservice class="egovframework.rte.fdl.excel.impl.egovexcelserviceimpl"> <property name="mapclass" value="egovframework.rte.cvpl.service.impl.egovexceltestmapping" /> <property name="sqlmapclient" ref="sqlmapclient" /> </bean> VO 작성 public class EmpVO implements Serializable{ private BigDecimal empno; private String empname; private String job; public BigDecimal getempno() { return empno; } public void setempno(bigdecimal empno) { this.empno = empno; } public String getempname() { return empname; } public void setempname(string empname) { this.empname = empname; } } public String getjob() { return job; } public void setjob(string job) { this.job = job; } - 157 -

7. Excel - 설명 (13/13) 엑셀업로드 Mapping 클래스 public class EgovExcelTestMapping extends EgovExcelMapping { @Override public EmpVO mappingcolumn(hssfrow row) { HSSFCell cell0 = row.getcell((short) 0); HSSFCell cell1 = row.getcell((short) 1); HSSFCell cell2 = row.getcell((short) 2); EmpVO vo = new EmpVO(); vo.setempno(new BigDecimal (cell0.getnumericcellvalue())); vo.setempname(cell1.getrichstringcellvalue().tostring()); vo.setjob(cell2.getrichstringcellvalue().tostring()); } } Query return vo; <sqlmap namespace="empbatchinsert"> <typealias alias="empvo" type="egovframework.rte.fdl.excel.vo.empvo" /> <insert id="insertempusingbatch" parameterclass="empvo"> <![CDATA[ insert into EMP ( EMP_NO, EMP_NAME, JOB ) values ( #empno#, #empname#, #job# ) ]]> </insert> </sqlmap> excelservice.uploadexcel( insertempusingbatch, fileinputstream); - 158 -

7. Excel - 참고자료 The Apache POI Project http://poi.apache.org jxls http://jxls.sourceforge.net/ - 159 -

8. File Handling - 개요 서비스개요 File 에대한생성및접근, 변경등과같이 File 을 Access 하는기능을제공하는서비스 시스템을개발할때필요한문자열데이터를다루기위해다양한기능을사용하도록서비스함 주요기능 File 생성 특정위치에 File 생성 File Access File에대한접근및수정 파일위치는절대경로, 상대경로등다양한형식지원 File을읽고수정할때 File Caching 기능제공 - 160 -

8. File Handling - 설명 (1/5) Jakarta Commons Virtual File System(VFS) 란 파일처리를추상화하여간편하고쉽게사용할수있는아파치의 Jakarta Commons Virtual File System (VFS) 를 File Handling 기능의기반오픈소스로채택함 Jakarta Commons Virtual File System (VFS) 는파일시스템에접근하기위한 API를제공하며, Local disk, HTTP server, ZIP 파일내부등다양한파일시스템에대한단일한 view를제공 다양한파일시스템에대한일관된접근 API를제공한다. 다양한파일시스템을지원한다. 다양한파일시스템을하나의로컬파일시스템처럼접근가능하도록한다. 파일접근시파일캐싱을통하여성능을향상시킨다. - 161 -

8. File Handling - 설명 (2/5) FileSystemManager Commons Virtual File System (VFS) 을사용하기위해서는 FileSystemManager 인터페이스가필요 FileSystemManager 인스턴스를얻는가장간단한방법은 VFS.getManager() 스태틱메소드를사용 FileSystemManager fsmanager = VFS.getManager(); FileObject jarfile = fsmanager.resolvefile( jar:lib/ajarfile.jar ); FileObject 파일및폴더를 FileObject 인스턴스로표현하여파일을생성 / 삭제하거나파일리스트검색및파일읽기 / 쓰기 등가능 // Locate the Jar file FileSystemManager fsmanager = VFS.getManager(); FileObject jarfile = fsmanager.resolvefile( jar:lib/ajarfile.jar" ); // List the children of the Jar file FileObject[] children = jarfile.getchildren(); System.out.println( Children of " + jarfile.getname().geturi() ); for ( int i = 0; i < children.length; i++ ) { System.out.println( children[ i ].getname().getbasename() ); } - 162 -

8. File Handling - 설명 (3/5) 파일생성 FileObject 의 createfile() 메소드사용 public void testceatefile() throws Exception { FileSystemManager manager = VFS.getManager(); FileObject basedir = manager.resolvefile(system.getproperty( user.dir )); final FileObject file = manager.resolvefile(basedir, testfolder/file1.txt ); // 모든파일삭제 file.delete(selectors.select_files); assertfalse(file.exists()); // 파일생성 file.createfile(); asserttrue(file.exists()); } - 163 -

8. File Handling - 설명 (4/5) 파일접근 파일쓰기 FileObject file = manager.resolvefile(basedir, testfolder/file1.txt ); FileContent filecontent = file.getcontent(); // 파일쓰기 OutputStream os = filecontent.getoutputstream(); String string = test 입니다. ; os.write(string.getbytes()); os.flush(); os.close(); assertnotsame(0, filecontent.getsize()); 파일읽기 FileObject writtenfile = manager.resolvefile(basedir, testfolder/file1.txt ); FileContent writtencontents = writtenfile.getcontent(); InputStream is = writtencontents.getinputstream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); for (String line = ; (line = reader.readline())!= null; sb.append(line)); is.close(); assertequals(sb.tostring(), string); - 164 -

8. File Handling - 설명 (5/5) 파일캐싱 파일쓰기 // 캐싱 Manager 생성 DefaultFileSystemManager fs = new DefaultFileSystemManager(); fs.setfilescache(manager.getfilescache()); // zip, jar, tgz, tar, tbz2, file if (!fs.hasprovider( file )) { fs.addprovider( file, new DefaultLocalFileProvider()); } fs.setcachestrategy(cachestrategy.on_resolve); fs.init(); // 캐싱객체생성 FileObject fobase2 = fs.resolvefile(testfolder); FileObject cachedfolder = fobase2.resolvefile(scratchfolder.getname().getpath()); // 파일이존재하지않음 FileObject[] fos = cachedfolder.getchildren(); assertfalse(contains(fos, file1.txt )); // 파일생성 scratchfolder.resolvefile("file1.txt").createfile(); // 파일존재함 // BUT cachedfolder 에는파일이존재하지않음 fos = cachedfolder.getchildren(); assertfalse(contains(fos, file1.txt )); - 165 -

8. File Handling - 참고자료 Apache Commons VFS http://commons.apache.org/vfs Apache Commons IO http://commons.apache.org/io - 166 -

9. File Upload/Download - 개요 서비스개요 파일을클라이언트로부터서버로업로드하거나서버로부터클라이언트로다운로드할때반복적으로일어나 는 Overhead 를피하기위해단순한패턴및인터페이스제공 주요기능 HTTP 기반파일업로드 HTTP request(multipart Request) 를파싱 업로드크기및디렉토리위치에대한설정 복수개의파일을동시에업로드 - 167 -

9. File Upload/Download - 설명 (1/4) File Upload/Download 서비스 다양한파일업로드 API를제공하는 Commons FileUpload를채택 Spring 에서는 Commons FileUpload 를사용하여싱글파일업로드에대하여가이드함 멀티플파일업로드를지원하도록 CommonsMultipartResolver를사용함. (Spring mvc 2.5.5 Multipart Multi file upload 지원부분은 Wiki를참조 ) 데이터전송방식 GET방식 : POST 방식 : URL 에폼데이터가노출되기때문에입력내용의길이제한이있고 256byte~4096byte 까지의데이터를전송할수있음. URL 에노출되지않고데이터를전송하기때문에입력내용의길이에제한을받지않음. ENCTYPE 속성의 "multipart/form-data : 파일이나용량이큰데이터를전송할때는폼데이터전송방식사용 - 168 -

9. File Upload/Download - 설명 (2/4) File Upload 구현예제 Step 1 빈설정파일에다음과같이 CommonsMultipartResolver 를정의함. <!-- MULTIPART RESOLVERS --> <bean id="spring.regularcommonsmultipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolver"> <property name="maxuploadsize" value="100000000" /> <property name="maxinmemorysize" value="100000000" /> </bean> Step 2 컨트롤러의 property 로파일의업로드위치를지정해주고컨트롤러에서 setter 메소드를통해지정된파일업로드위치를불 러올수있음 # PATH 위치는설정시변경 # windows NT 일경우 file.upload.path=c:\\temp # Unix 일경우 file.upload.path=/usr/file/upload - 169 -

9. File Upload/Download - 설명 (3/4) File Upload 구현 Setp 3 파일업로드를위해 JSP 파일의입력폼타입을 file 로지정하고 form 의 enctype 을 multipart/form-data 로지정함 <form method="post" action="<c:url value='/upload/genericmulti.do'/>" enctype="multipart/form-data"> <p>type: <input type="text" name="type" value="genericfilemulti" size="60" /> </p> <p>file1: <input type="file" name="file[]" size="60" /> </p> <p>file2: <input type="file" name="file[]" size="60" /> </p> <p> <input type="submit" value="upload" /> </p> </form> Setp 4 Controller 를구현 @Controller("genericFileUploadController") public class GenericFileUploadController { @Resource(name = "multipartresolver") CommonsMultipartResolver multipartresolver; @Resource(name = "fileuploadproperties") Properties fileuploadproperties; @SuppressWarnings("unchecked") @RequestMapping(value = "/upload/genericmulti.do") public String multipartprocess(final HttpServletRequest request, Model model) throws Exception { final long starttime = System.nanoTime();... 이하생략 ( 자세한설명은 wiki File Upload/Download 참조 ) - 170 -

9. File Upload/Download - 설명 (4/4) File Download 구현 DownloadController 클래스예시.. @Controller("downloadController") public class DownloadController { @Resource(name = "fileuploadproperties") Properties fileuploadproperties; @RequestMapping(value = "/download/downloadfile.do") public void downloadfile( @RequestParam(value = "requestedfile") String requestedfile, HttpServletResponse response) throws Exception { String uploadpath = fileuploadproperties.getproperty("file.upload.path"); File ufile = new File(uploadPath, requestedfile); int fsize = (int) ufile.length(); if (fsize > 0) { BufferedInputStream in = new BufferedInputStream( new FileInputStream(uFile)); // String mimetype = servletcontext.getmimetype(requestedfile); String mimetype = "text/html";.. response.setbuffersize(fsize);d response.setcontenttype(mimetype); - 171 -

9. File Upload/Download - 참고자료 Spring's multipart (fileupload) support http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-multipart http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-multipart commons.apache.org {fileupload} http://commons.apache.org/fileupload/ commons.apache.org{empty-parse} http://commons.apache.org/fileupload/faq.html#empty-parse - 172 -

10. FTP - 개요 서비스개요 네트워크상에존재하는타어플리케이션과데이터 ( 파일 ) 을주고받기위해 FTP(File Transfer Protocol) Client 기능을제공하는서비스 주요기능 FTP Server 연결 파일주고받을 FTP Server 와연결 파일송신 FTP Server 에파일송신 파일수신 FTP Server 에서파일을수신 - 173 -

10. FTP 설명 (1/7) FTP 서비스 Jakarta Commons 의 Net 에서지원하는것은단순클라이언트측의기본적인 Internet Protocol 로구현한 FTP 기능을 편리하게제공 Jakarta Commons 의 Net 은 network utility collection Jakarta Commons Net Jakarta Commons Net 프로젝트에서지원하는프로토콜 FTP/FTPS NNTP SMTP POP3 Telnet TFTP Finger Whois rexec/rcmd/rlogin Time (rdate) and Daytime Echo Discard NTP/SNTP - 174 -

10. FTP 설명 (2/7) org.apache.commons.net.ftp의논리적흐름 논리적흐름 1 FTP Client를생성한다. 2 FTP Server에연결한다. 3 응답이정상적인지확인한다. 4 FTP Server에로그인한다. 5 접속하여여러가지작업 (list, get, put 등 ) 을한다. 6 FTP Server에서로그아웃한다. 7 FTP Server 와의연결을끊는다. - 175 -

10. FTP 설명 (3/7) FTP접속사용예제리스트 파일리스트보기 파일다운로드 (get) 파일업로드 (put) 파일업로드 (append) 파일이름변경 (rename) 파일삭제 (delete) Directory생성 OS 커맨드입력하기 파일및전송상태설정 - 176 -

10. FTP 설명 (4/7) FTP 접속사용예제 파일리스트보기 FTPFile[] ftpfiles = client.listfiles("/"); if(ftpfiles!= null ){ for (int i = 0; i < ftpfiles.length; i++) { FTPFile file = ftpfiles[i]; logger.info(file.tostring()); // 파일정보 logger.info(file.getname()); // 파일명 logger.info(file.getsize()); // 파일사이즈 } } 파일다운로드 (GET) File get_file = new File("c:\\temp\\test.jpg"); FileOutputStream outputstream = new FileOutputStream(get_file); boolean result = client.retrievefile("/public/test.jpg", outputstream); outputstream.close(); - 177 -

10. FTP 설명 (5/7) FTP 접속사용예제 파일업로드 (PUT) File put_file = new File("c:\\temp\\test.jpg"); inputstream = new FileInputStream(put_file); boolean result = client.storefile("/public/test.jpg", inputstream); inputstream.close(); 파일업로드 (APPEND) File append_file = new File("c:\\temp\\test.jpg"); inputstream = new FileInputStream(append_file); boolean result = client.appendfile("/public/test.jpg", inputstream); inputstream.close(); 파일이름변경 (RENAME) boolean result = client.rename("/public/ 바꾸기전.jpg", "/public/ 바꾼후.jpg"); - 178 -

10. FTP 설명 (6/7) FTP 접속사용예제 파일삭제 (DELETE) boolean result = client.deletefile("/public/ 삭제할.jpg"); Dircetory 생성 boolean result = client.makedirectory("/public/test"); - 179 -

10. FTP 설명 (7/7) FTP 접속사용예제 OS 커맨드입력하기 client.sendcommand(ftpcommand.make_directory,"/public/test"); 파일및전송상태설정 /* 파일타입 */ client.setfiletype(ftp.binary_file_type); /* 파일전송형태 */ client.setfiletransfermode(ftp.compressed_transfer_mode); - 180 -

10. FTP - 참고자료 Jakarta Commons Net http://commons.apache.org/net/ Commons Net 2.0 API http://commons.apache.org/net/apidocs/index.html - 181 -

11. ID Generation 개요 (1/3) 서비스개요 다양한형식의 ID 구조및다양한방식의 ID 생성알고리즘을제공하여시스템에서사용하는 ID(Identifier) 를생 성하는서비스 - 182 -

11. ID Generation 개요 (2/3) 주요기능 UUID(Universal Unique Identifier) 생성 : UUID(Universal Unique Identifier) 를생성한다. Sequence ID 생성 : 순차적으로증가또는감소하는 Sequence ID를생성한다. 시스템에서는다수의 Sequence ID가사용되므로, 각각의 Sequence ID는구별된다. 시스템의재시작시에도 Sequence ID는마지막생성된 ID의다음 ID를생성한다. Sequence ID 생성 : DB의 SEQUENCE를활용하여 ID를생성한다. Table ID 생성 : 키제공을위한테이블을지정하여 ID를생성한다. - 183 -

11. ID Generation 개요 (3/3) UUID(Universally Unique Identifier) 란 UUID는 OSF(Open Software Foundation) 에의해제정된고유식별자 (Identifier) 에대한표준이다. UID는 16- byte (128-bit) 의숫자로구성된다. UUID를표현하는방식에대한특별한규정은없으나, 일반적으로 16진법으로 8-4-4-4-12 형식으로표현한다. 550e8400-e29b-41d4-a716-446655440000 UUID는다음 5개의 Version이존재한다. Version 1 (MAC Address) UUID를생성시키는컴퓨터의 MAC 어드레스와시간정보를이용하여 UUID를생성한다. 컴퓨터의 MAC 어드레스를이용하므로어떤컴퓨터에서생성했는지정보가남기때문에보안에문제가있다. Version 2 (DCE Security) POSIX UID를이용하여 UUID를생성한다. Version 3 (MD5 Hash) URL로부터 MD5를이용하여 UUID를생성한다. Version 4 (Random) Random Number를이용하여 UUID를생성한다. Version 5 (SHA-1 Hash) SHA-1 Hashing을이용하여 UUID를생성한다. - 184 -

11. ID Generation UUID Generation(1/4) 개요 새로운 ID 를생성하기위해 UUID 생성알고리즘을이용하여 16 바이트길이의 ID 를생성한다. String 타입의 ID 생성과 BigDecimal 타입의 ID 생성을지원한다. 지원하는방법은설정에따라서 Mac Address Base Service, IP Address Base Service, No Address Base Service 세가지유형이있다. Mac Address Base Service(1/2) MAC Address 를기반으로유일한 Id 를생성하는 UUIdGenerationService 설정 <bean name="uuidgenerationservice class="egovframework.rte.fdl.idgnr.impl.egovuuidgnrservice"> <property name="address"> <value>00:00:f0:79:19:5b</value> </property> </bean> - 185 -

11. ID Generation UUID Generation(2/4) Mac Address Base Service(2/2) Sample @Resource(name="UUIdGenerationService") private EgovIdGnrService uuidgenerationservice; @Test public void testuuidgeneration() throws Exception { assertnotnull(uuidgenerationservice.getnextstringid()); assertnotnull(uuidgenerationservice.getnextbigdecimalid()); } - 186 -

11. ID Generation UUID Generation(3/4) IP Address Base Service IP Address 를기반으로유일한 Id 를생성하는 UUIdGenerationService 설정 <bean name="uuidgenerationservicewithip" class="egovframework.rte.fdl.idgnr.impl.egovuuidgnrservice"> <property name="address"> <value>100.128.120.107</value> </property> </bean> Sample @Resource(name="UUIdGenerationServiceWithIP") private EgovIdGnrService uuidgenerationservicewithip; @Test public void testuuidgenerationip() throws Exception { assertnotnull(uuidgenerationservicewithip.getnextstringid()); assertnotnull(uuidgenerationservicewithip.getnextbigdecimalid()); } - 187 -

11. ID Generation UUID Generation(4/4) No Address Base Service IP Address 설정없이 Math.random() 을이용하여주소정보를생성하고유일한 Id 를생성하는 UUIdGenerationService 설정 <bean name="uuidgenerationservicewithoutaddress" class="egovframework.rte.fdl.idgnr.impl.egovuuidgnrservice /> Sample @Resource(name="UUIdGenerationServiceWithoutAddress") private EgovIdGnrService uuidgenerationservicewithoutaddress; @Test public void testuuidgenerationnoaddress() throws Exception { assertnotnull(uuidgenerationservicewithoutaddress.getnextstringid()); assertnotnull(uuidgenerationservicewithoutaddress.getnextbigdecimalid()); } - 188 -

11. ID Generation Sequence Id Generation(1/4) 개요 새로운 ID 를생성하기위해 Database 의 SEQUENCE 를사용하는서비스이다. 서비스를이용하는시스템에서 Query 를지정하여아이디를생성할수있도록하고 Basic Type Service 와 BigDecimal Type Service 두가지를 지원한다. Basic Type Service(1/2) 기본타입 ID 를제공하는서비스로 int, short, byte, long 유형의 ID 를제공한다. DB Schema 설정 CREATE SEQUENCE idstest MINVALUE 0; <bean name="primarytypesequenceids class="egovframework.rte.fdl.idgnr.impl.egovsequenceidgnrservice destroy-method="destroy"> <property name="datasource" ref="datasource"/> <property name="query" value="select idstest.nextval FROM DUAL"/> </bean> - 189 -

11. ID Generation Sequence Id Generation(2/4) Basic Type Service(2/2) Sample @Resource(name="primaryTypeSequenceIds") private EgovIdGnrService primarytypesequenceids; @Test public void testprimarytypeidgeneration() throws Exception { //int assertnotnull(primarytypesequenceids.getnextintegerid()); //short assertnotnull(primarytypesequenceids.getnextshortid()); //byte assertnotnull(primarytypesequenceids.getnextbyteid()); //long assertnotnull(primarytypesequenceids.getnextlongid()); } - 190 -

11. ID Generation Sequence Id Generation(3/4) BigDecimal Type Service(1/2) BigDecimal ID 를제공하는서비스로기본타입 ID 제공서비스설정에추가적으로 usebigdecimals 을 true 로 설정하여사용하도록한다. DB Schema 설정 CREATE SEQUENCE idstest MINVALUE 0; <bean name="bigdecimaltypesequenceids" class="egovframework.rte.fdl.idgnr.impl.egovsequenceidgnrservice" destroy-method="destroy"> <property name="datasource" ref="datasource"/> <property name="query" value="select idstest.nextval FROM DUAL"/> <property name="usebigdecimals" value="true"/> </bean> - 191 -

11. ID Generation Sequence Id Generation(4/4) BigDecimal Type Service(2/2) Sample @Resource(name="bigDecimalTypeSequenceIds") private EgovIdGnrService bigdecimaltypesequenceids; @Test public void testbigdecimaltypeidgeneration() throws Exception { //BigDecimal assertnotnull(bigdecimaltypesequenceids.getnextbigdecimalid()); } DB 벤더별 SEQUENCE 및 Query 설정 DB 벤더별로 SEQUENCE 에대한지원여부및사용방식이다르므로이를고려하여설정해야한다. (DB 벤 더별 SEQUENCE 지원여부및설정방식은 wiki 참조 ) - 192 -

11. ID Generation Table Id Generation(1/6) 개요 새로운아이디를얻기위해서별도의테이블을생성하고키값과키값에해당하는아이디값을입력하여관리 하는기능을제공하는서비스로 table_name(char 또는 VARCHAR 타입 ), next_id(integer 또는 DECIMAL type) 두칼럼을필요로한다. 별도의테이블에설정된정보만을사용하여제공하는 Basic Service 와 String ID 의경우에적용이가능한 prefix 와채울문자열지정이가능한 Strategy Base Service 를제공한다. Basic Service(1/3) 테이블에지정된정보에의해서아이디를생성하는서비스로사용하고자하는시스템에서테이블을생성해서 사용할수있다. DB Schema ID Generation 서비스를쓰고자하는시스템에서미리생성해야할 DB Schema 정보임 CREATE TABLE ids ( table_name varchar(16) NOT NULL, next_id DECIMAL(30) NOT NULL, PRIMARY KEY (table_name)); INSERT INTO ids VALUES('id','0'); - 193 -

11. ID Generation Table Id Generation(2/6) Basic Service(2/3) 설정 <bean name="basicservice" class="egovframework.rte.fdl.idgnr.impl.egovtableidgnrservice" destroy-method="destroy"> <property name="datasource" ref="datasource"/> <property name="blocksize" value="10"/> <property name="table" value="ids"/> <property name="tablename" value="id"/> </bean> blocksize: Id Generation 내부적으로사용하는정보로 ID 요청시마다 DB 접속을하지않기위한정보 ( 지정 한횟수마다 DB 접속처리 ) table: 생성하는테이블정보로사용처에서테이블명변경가능 tablename: 사용하고자하는아이디개별인식을위한키값 ( 대개의경우는테이블별로아이디가필요하기 에 tablename 이라고지정함 ) - 194 -

11. ID Generation Table Id Generation(3/6) Basic Service(3/3) Sample @Resource(name="basicService") private EgovIdGnrService basicservice; @Test public void testbasicservice() throws Exception { //int assertnotnull(basicservice.getnextintegerid()); //short assertnotnull(basicservice.getnextshortid()); //byte assertnotnull(basicservice.getnextbyteid()); //long assertnotnull(basicservice.getnextlongid()); //BigDecimal assertnotnull(basicservice.getnextbigdecimalid()); //String assertnotnull(basicservice.getnextstringid()); } - 195 -

11. ID Generation Table Id Generation(4/6) Strategy Base Service(1/3) 아이디생성을위한룰을등록하고룰에맞는아이디를생성할수있도록지원하는서비스로위의 Basic Service 에서추가적으로 Strategy 정보설정을추가하여사용할수있다. 단, 이서비스는 String 타입의 ID 만을 제공한다. DB Schema CREATE TABLE idttest( table_name varchar(16) NOT NULL, next_id DECIMAL(30) NOT NULL, PRIMARY KEY (table_name)); INSERT INTO idttest VALUES('test','0'); - 196 -

11. ID Generation Table Id Generation(5/6) Strategy Base Service(2/3) 설정 <bean name="ids-testwithgenerationstrategy class="egovframework.rte.fdl.idgnr.impl.egovtableidgnrservice" destroy-method="destroy"> <property name="datasource" ref="datasource"/> <property name="strategy" ref="strategy"/> <property name="blocksize" value="1"/> <property name="table" value="idttest"/> <property name="tablename" value="test"/> </bean> <bean name="strategy class="egovframework.rte.fdl.idgnr.impl.strategy.egovidgnrstrategyimpl"> <property name="prefix" value="test-"/> <property name="cipers" value="5"/> <property name="fillchar" value="*"/> </bean> strategy: 아래에정의된 MixPrefix 의 bean name 설정 prefix: 아이디의앞에고정적으로붙이고자하는설정값지정 cipers: prefix 를제외한아이디의길이지정 fillchar: 0 을대신하여표현되는문자 - 197 -

11. ID Generation Table Id Generation(4/4) Strategy Base Service(3/3) Sample @Resource(name="Ids-TestWithGenerationStrategy") private EgovIdGnrService idstestwithgenerationstrategy; @Test public void testidgenstrategy() throws Exception { initializenextlongid("test", 1); } // prefix : TEST-, cipers : 5, fillchar :*) for (int i = 0; i < 5; i++) { assertequals("test-****" + (i + 1), idstestwithgenerationstrategy.getnextstringid()); } - 198 -

12. Logging - 개요 서비스개요 Logging 은시스템의개발이나운용시발생할수있는어플리케이션내부정보에대해서, 시스템의외부저장 소에기록하여, 시스템의상황을쉽게파악할수있게지원하는서비스 주요기능 로깅환경설정지원 서브시스템별상세한로그정책부여 다양한형식 ( 날짜형식, 시간형식등 ) 의로그메시지형태지정 다양한매체 (File, DBMS, Message, Mail 등 ) 에대한기록기능설정 로그기록 레벨 (debug, info, warn, error, fatal 등 ) 별로로그를기록 - 199 -

12. Logging - 설명 (1/5) Logging 서비스 시스템의개발이나운용시발생할수있는사항에대해서, 시스템의외부저장소에기록하여, 시스템의상황을 쉽게파악할수있음. 많은개발자가 Log 을출력하기위해일반적으로사용하는방식은 System.out.println() 임. 하지만이방식은간편한반면에다음과같은이유로권장하지않음. 콘솔로그를출력파일로리다이렉트할지라도, 어플리케이션서버가재시작할때파일이 overwrite될수도있음. 개발 / 테스팅시점에만 System.out.println() 을사용하고운영으로이관하기전에삭제하는것은좋은방법이아님. System.out.println() 호출은디스크 I/O동안동기화 (synchronized) 처리가되므로시스템의 throughput을떨어뜨림. 기본적으로 stack trace 결과는콘솔에남는다. 하지만시스템운영중콘솔을통해 Exception을추적하는것은바람직하지못함. - 200 -

12. Logging - 설명 (2/5) Log4j 환경설정하는방법 프로그래밍내에서직접설정하는방법 설정파일을사용하는방법 중요컴포넌트설명 컴포넌트 Logger Appender Layout 설명 로그의주체 ( 로그파일을작성하는클래스 ) 설정을제외한거의모든로깅기능이이를통해처리됨. 어플리케이션별로사용할로거 ( 로거명기반 ) 를정의하고이에대해로그레벨과 Appender 를지정할수있음. 로그를출력하는위치를의미하며, Log4J API 문서의 XXXAppender 로끝나는클래스들의이름을보면, 출력위치를어느정도짐작할수있음. Appender 의출력포맷 - 일자, 시간, 클래스명등여러가지정보를선택하여로그정보내용으로지정할수있음. - 201 -

12. Logging - 설명 (3/5) 로그레벨지정하기 log4j 에서는기본적으로 debug, info, warn, error, fatal 의다섯가지로그레벨이있음 (FATAL > ERROR > WARN > INFO > DEBUG > TRACE) 로그레벨 설명 Fatal - 아주심각한에러가발생한상태를나타냄. 시스템적으로심각한문제가발생해서어플리케이션작동이불가능할경우가해당하는데, 일반적으로는어플리케이션에서는사용할일이없음. Error - 요청을처리하는중문제가발생한상태를나타냄 Warn - 처리가능한문제이지만, 향후시스템에러의원인이될수있는경고성메시지를나타냄. Info - 로그인, 상태변경과같은정보성메시지를나타냄. Debug - 개발시디버그용도로사용할메시지를나타냄. Trace - log4j1.2.12 에서신규추가된레벨으로서. 디버그레벨이너무광범위한것을해결하기위해서좀더상세한상태를나타냄. - 202 -

12. Logging - 설명 (4/5) Appender(1/2) log4j 는콘솔, 파일, DB, socket, message, mail 등다양한로그출력대상과방법을지원하는데, 이에대해 log4j 의 Appender 로정의할수있다. Appender 설명 ConsoleAppender - 콘솔화면으로출력하기위한 appender 임 - org.apache.log4j.consoleappender : Console 화면으로출력하기위한 Appender FileAppender - FileAppender 는로깅을파일에하고싶을때사용함. RollingFileAppender DailyRollingFileAppender - FileAppender 는지정한파일에로그가계속남으므로한파일의크기가지나치게커질수있으며, 계획적인로그관리가불가능해짐. - RollingFileAppender 는파일의크기또는파일백업인덱스등의지정을통해서특정크기이상파일의크기가커지게되면기존파일을백업파일로바꾸고, 다시처음부터로깅을시작함 - 설정한날짜또는조건에맞춰로깅을수행함. - 생성자 DailyRollingFileAppender(Layout layout, String filename, String datepattern); 를이용 해서객체의생성과함께 log 가 roll 되는시간을지정해줄수도있고기본생성자로생성후 setdatepattern() 을이용해서지정해줄수도있음. - 203 -

12. Logging - 설명 (5/5) Appender(2/2) Appender 설명 JDBCAppender - DB 에로그를출력하기위한 Appender 로하위에 Driver, URL, User, Password, Sql 과같은 parameter 를정의할수있음. - 다음은 log4j.xml 파일내의 JDBCAppender 에대한속성정의내용임. EgovDBAppender ( 전자정부확장 Appender) - log4j-1.3alpha-8 의 DBAppender 를 extends 하고있으며 usesupportsgetgeneratedkeys flag 에따라 JDBC3.0 의 getgeneratedkeys 를사용하지않는옵션추가한 Appeder 임. (Oracle 인경우 DBAppender 를그냥쓸때 getgeneratedkeys 실행시 허용되지않는작업 에러가발생하는문제를회피하기위해확장 ) EgovJDBCAppender ( 전자정부확장 Appender) - Singleton 을구현하고있으며, spring 의 datasource bean 을 injection 할수있도록 Annotation Bean 으로도설정되어있어야함. - log4j 의 JDBCAppender 을 extends 하고있으며 JDBCAppender 는 log4j 의접속설정을따라매번 Connection 을직접생성하게되나, EgovJDBCAppender 는 Spring 의 datasource 를 Annotation 형식으로 injection 하여사용할수있게확장한 Appender 임. - 204 -

12. Logging - 참고자료 Apache Logging Services Project http://logging.apache.org/index.html - 205 -

13. Mail - 개요 서비스개요 E-mail 을송신하는기능을제공하는서비스 주요기능 E-mail 송신 SMTP 표준을준수하여 E-mail 송신 E-Mail 송신시간단히텍스트만보내기 E-Mail 송신시파일첨부하기 E-Mail 송신시 URL을통해첨부하기 E-Mail 송신시 HTML 이메일보내기 E-Mail 송신시인증처리하기 - 206 -

13. Mail 설명 (1/5 ) Mail 서비스 전자정부프레임워크에서는 Mail 발송을쉽게처리하기위해 Jakarta Commons Email API를사용 Commons Email은내부적으로 Java Mail API와 JavaBeans Activation API 를제공 Mail 서비스의종류 간단히텍스트만보내기 파일첨부하기 URL을통해첨부하기 HTML 이메일보내기 인증처리하기 - 207 -

13. Mail 설명 (2/5 ) 간단히텍스트만보내기 org.apache.commons.mail.simpleemail 은가장중심이되는 org.apache.commons.mail.email을상속받아 setmsg(java.lang.string msg) 만을구현한가장기본적인클래스 SMTP서버지정 : sethostname(java.lang.string ahostname) 받는사람의메일주소 : addto(java.lang.string email) or addto(java.lang.string email, java.lang.string name) 보내는사람의메일주소 : setfrom(java.lang.string email) or setfrom(java.lang.string email, java.lang.string name) 여러사람에게메일을보낼경우 : addto 함수의추가 - 208 -

13. Mail 설명 (3/5 ) 간단히텍스트만보내기 (Source) public static void main(string args[])throws MailException { SimpleEmail email = new SimpleEmail(); // sethostname 에실제메일서버정보 email.setcharset("euc-kr"); // 한글인코딩 email.sethostname("mail.myserver.com"); //SMTP 서버설정 try { email.addto( egov@somewhere.org", egov man"); // 수신자추가 } catch (EmailException e) { e.printstacktrace(); } try { email.setfrom("me@apache.org", "Me"); // 보내는사람 } catch (EmailException e) { e.printstacktrace(); } email.setsubject("test message"); // 메일제목 email.setcontent("simple 메일 Test 입니다 ", "text/plain; charset=euc-kr"); try { email.send(); } catch (EmailException e) {.. - 209 -

13. Mail 설명 (4/5 ) Mail 에파일첨부하기 ( 특징 ) org.apache.commons.mail.simpleemail 은가장중심이되는 org.apache.commons.mail.email을상속받아 setmsg(java.lang.string msg) 만을구현한가장기본적인클래스 첨부파일을보내려면 org.apache.commons.mail.emailattachment 클래스와 org.apache.commons.mail.multipartemail 클래스를사용하면됨 파일경로와파일설명등을추가하여 setname(java.lang.string name) 을통해첨부되는파일명을설정한다. 그후 MultiPartEmail 을통해 SimpleEmail 처럼기본메일정보를설정 그리고 MultiPartEmail의 attach() 함수를통해첨부파일을추가하여전송 만약첨부파일이두개이상이라면 EmailAttachment 를여러개생성하여파일정보를설정한후 attach() 를통해추가 EmailAttachment 객체를생성한뒤 email.attach() 를사용해서첨부할파일을추가해주기만하면된다. 실제파일명은한글이포함되더라도, EmailAttachment.setName() 메소드를사용해서파일명을변경해서전송할수도있다. 주의할점은 1.0 버전의 Commons Email은파일명을한글로전달할경우, 파일명이올바르게전달되지않고깨진다는점이다. ( 파일자체는올바르게전송된다.) 따라서 1.0 버전의 Common Email을사용하여파일을전송할때에는알파벳과숫자로만구성된이름의파일을전송한다. - 210 -

13. Mail 설명 (5/5 ) Mail 에파일첨부하기 (Source) // 첨부할 attachment 정보를생성합니다 EmailAttachment attachment = new EmailAttachment(); attachment.setpath("c:\\xxxx.jpg"); attachment.setdisposition(emailattachment.attachment); attachment.setdescription(" 첨부관련 TEST 입니다 "); attachment.setname("xxxx.jpg"); // // 기본메일정보를생성합니다 MultiPartEmail email = new MultiPartEmail(); email.setcharset("euc-kr");// 한글인코딩 email.sethostname("mail.myserver.com"); email.addto("egov@egov.org", " 전자정부 "); email.setfrom("egovto@egov.org", "Me"); email.setsubject(" 전자정부첨부파일 TEST 입니다 "); email.setmsg(" 여기는첨부관련내용을입력합니다 "); // 생성한 attachment 를추가합니다 email.attach(attachment); // 메일을전송합니다 email.send(); - 211 -

13. Mail - 참고자료 Apache Commons-Email UserGuide http://commons.apache.org/email/userguide.html Commons-Email http://jakarta.apache.org/commons/email/index.html Commons-Email API http://jakarta.apache.org/commons/email/apidocs/index.html - 212 -

14. Marshalling/Unmarshalling - 개요 서비스개요 객체를특정데이터형식으로변환하고, 반대로특정데이터형식으로작성된데이터를객체로변환하는기능을제공하는서비스 메모리상에존재하는객체를물리적장치에저장하거나네트워크를통해전송하기위해사용 Spring Web Service OXM WS는 Server와 Client 두대상간의데이터를주고받는기술중에하나이다. 정보를요청하는쪽이 Client이다.(Client는 Server 가될수도있고일반사용자가될수도있다.) 요청한정보를받아서알맞게처리후결과값을리턴하는쪽이 Server이다. Client <------ XML ------> Server WS는 XML(WSDL) 형식으로데이터를주고받는다. 따라서이 XML를객체화하거나객체를 XML화해야한다. 그것이 Marshalling,Unmarshalling이다. OXM Utill은 JAXB,Castor,XMLBeans,JiBX,XStream.. 등여러가지가있다. Client(OXM) <------ XML(WSDL) ------> (OXM)Server - 213 -

14. Marshalling/Unmarshalling - 설명 (1/6) 주요기능 Marshalling 객체를특정데이터형식으로변환 변환된데이터는 Unmarshalling 기능을이용하여원본객체로생성가능해야함 Unmarshalling 특정데이터형식으로작성된정보를이용하여, 해당하는객체생성 생성된객체는 Marshalling 기능을이용하여원본데이터로변환가능해야함 Castor 와 XMLBeans 의 Marshaller, Unmarshaller 사용하기 Spring's OXM은다양한 Java-XML Binding 오픈소스를지원한다. 여기서는오픈소스 Castor와 XMLBeans를사용하여구현한가이드프로그램을제시한다. Castor Configuration <bean id="divertcastor" class="egovframework.rte.fdl.divert.divertcastor"> <property name="marshaller" ref="castormarshaller" /> <property name="unmarshaller" ref="castormarshaller" /> </bean> <bean id="castormarshaller" class="org.springframework.oxm.castor.castormarshaller" /> - 214 -

14. Marshalling/Unmarshalling - 설명 (2/6) Castor Guide Program(Java Object 의데이터를 XML 문서로 DataBinding Sample Source ) @Resource(name = "castormarshaller") private Marshaller marshaller; public void testmarshalling() { try { FileOutputStream os = null; List<Writer> book2writers = new ArrayList<Writer>(); book2writers.add(new Writer("J,J.R 툴킨 ")); book2writers.add(new Writer("J.J.T 툴킨 ")); BookMg bookmg2 = new BookMg("9780446618502", " 반지의제왕 ", book2writers);? os = new FileOutputStream("CasterBook.xml"); marshaller.marshal(bookmg2, new StreamResult(os));? } catch (Exception e) { logger.debug(e.getmessage()); e.printstacktrace(system.err); fail("testmarshalling failed!"); } } - 215 -

14. Marshalling/Unmarshalling - 설명 (3/6) Castor Guide Program(XML 문서를 JavaObject 로 DataBinding Sample Source ) @Resource(name = "castormarshaller") private Unmarshaller unmarshaller; @Test public void testunmarshalling() { FileInputStream is = null; try { is = new FileInputStream("CasterBook.xml"); bookmg = (BookMg) unmarshaller.unmarshal(new StreamSource(is)); writers = bookmg.getwriters(); for (Iterator i = writers.iterator(); i.hasnext(); ) { Writer writer = (Writer)i.next(); } }... } - 216 -

14. Marshalling/Unmarshalling - 설명 (4/6) XMLBeans Configuration <bean id="divertxmlbeans" class="egovframework.rte.fdl.divert.divertxmlbeans"> <property name="marshaller" ref="xmlbeansmarshaller" /> <property name="unmarshaller" ref="xmlbeansmarshaller" /> </bean> <bean id="xmlbeansmarshaller" class="org.springframework.oxm.xmlbeans.xmlbeansmarshaller" /> - 217 -

14. Marshalling/Unmarshalling - 설명 (5/6) XMLBeans Guide Program(Java Object 의데이터를 XML 문서로 DataBinding Sample Source ) @Resource(name = "xmlbeansmarshaller") private Marshaller marshaller; @Test public void testmarshalling() { FileOutputStream os = null; userdoc = UserinfoDocument.Factory.newInstance(); userelement = userdoc.addnewuserinfo(); userelement.setname(" 홍길동 "); userelement.setage(31); userelement.setphone(022770918); xmloptions = new XmlOptions(); xmloptions.setsaveprettyprint(); xmloptions.setsaveprettyprintindent(4); xmloptions.setcharacterencoding("euc-kr"); try { os = new FileOutputStream("XMLBeanGen.xml"); marshaller.marshal(userdoc, new StreamResult(os)); }catch(exception ee) { - 218 -

14. Marshalling/Unmarshalling 설명 (6/6) XMLBeans Guide Program(XML 문서를 JavaObject 로 DataBinding Sample Source ) @Resource(name = "xmlbeansmarshaller") private Unmarshaller unmarshaller; @Test public void testunmarshalling() { FileInputStream is = null; try { is = new FileInputStream("XMLBeanGen.xml"); userdoc = (UserinfoDocument) unmarshaller.unmarshal(new StreamSource(is)); userelement = userdoc.getuserinfo(); }catch(filenotfoundexception fnde){ fnde.getstacktrace(); fail("testunmarshalling failed!"); } catch(ioexception ioe){ ioe.getstacktrace(); }... } - 219 -

14. Marshalling/Unmarshalling - 참고자료 Spring Framework OXM class API http://static.springframework.org/spring-ws/sites/1.5/apidocs/org/springframework/oxm/packagesummary.html Castor http://www.castor.org/ XMLBeans http://xmlbeans.apache.org/ - 220 -

15. Object Pooling - 개요 서비스개요 객체에대한 Pooling기능을제공하는서비스이다. 객체의생성비용이크고, 생성횟수가많으며, 평균적으로사용되는객체의수가적은경우, 성능을향상시키기위해서사용한다. Object Pool은소프트웨어디자인패턴으로서, 객체를필요에따라생성하고파괴하는방식이아닌, 적절한개수의객체를미리사용가능한상태로생성하여이를이용하는방식이다. Client는 Pool에객체를요청하여객체를얻은후, 업무를수행한다. 얻어온객체를이용하여업무수행을끝마친후, 객체를파괴하는것이아니라 Pool에게돌려주어다른 Client가사용할수있도록한다. Object Pooling은객체생성비용이크고, 객체생성횟수가많으며, 평균적으로사용되는객체의수가적은경우, 높은성능의향상을가져다준다. 주요기능 Pool 초기화 (Initialization) 특정객체에대한 Pool 생성 Pool 초기값및최대값을설정하면, 초기값개수만큼객체를생성하여 Pool에추가함 객체할당 (Allocate) Pool에사용가능한객체가있을경우, 객체를할당하고사용가능한객체가없을경우, 만약 Pool 크기가최대값보다작으면새로운객체를생성하여할당하고, Pool의크기가최대값인경우, 예외처리를수행함 - 221 -

15. Object Pooling - 설명 (1/5) 객체반환 (Release) 사용이완료된객체를 Pool 로반환하고, Pool 로반환된객체는재사용할수있도록초기화함 ObjectPool Guide Program Configration <bean id="dbcpobjectpool" class="egovframework.rte.fdl.objectpool.dbcp.dbcpobjectpoolset"> <property name="pool" ref="dbcpobjectpooler" /> </bean> <bean id="dbcpobjectpooler" class="egovframework.rte.fdl.objectpool.dbcp.dbcpobjectpool" /> - 222 -

15. Object Pooling - 설명 (2/5) ObjectPool 설정필드 설정 설명 maxactive 커넥션풀이제공할최대커넥션개수 whenexhaustedaction 커넥션풀에서가져올수있는커넥션이없을때어떻게동작할지를지정한다. maxwait 사용되지않고풀에저장될수있는최대커넥션개수. 음수일경우제한이없다. maxidle 사용되지않고풀에저장될수있는최소커넥션개수. testonborrow True 일경우커넥션풀에서커넥션을가져올때커넥션이유효한지의여부를검사한다. testonreturn True 일경우커넥션풀에서커넥션을반환할떄커넥션이유효한지의여부를검사한다. timebetweenevctiionrunsmillis 사용되지않는커넥션을추출하는쓰레드의실행주기를지정한다. numtestsperevictionrun 사용되지않는커넥션을몇개검사할지지정한다. minevictableidletimemillis 사용되지않는커넥션을추출할때이속성에서지정한시간이상비활성화상태인커넥션만추출한다. testwhileidle True 일경우비활성화커넥션을추출할떄커넥션이유효한지의여부를검사해서유효하지않은켜넥션을풀에서제거한다. - 223 -

15. Object Pooling - 설명 (3/5) Guide Program jdbc_driver,username,password 를 jdbc.properties 로부터읽어온다. private void loadproperties() throws IOException { String filename_ = Thread.currentThread().getContextClassLoader().getResource("jdbc.properties").getFile(); Properties props = null; FileInputStream fis = null; props = new Properties(); fis = new FileInputStream(fileName_); props.load(new BufferedInputStream(fis)); fis.close(); g_driver = props.getproperty("driver"); g_url = props.getproperty("dburl"); g_user = props.getproperty("username"); g_password = props.getproperty("password"); } - 224 -

15. Object Pooling - 설명 (4/5) Guide Program jdbc.properties 를통해서데이터베이스접속정보를얻어온다. private void setupdriver(string driver,string url,string user,string password)throws Exception { Class.forName(driver); ObjectPool 설정세팅 GenericObjectPool connectionpool = new GenericObjectPool(null); connectionpool.setmaxactive(maxactive); connectionpool.settestwhileidle(testwhileidle); 실제 DB와의커넥션을 connectionpool.setnumtestsperevictionrun(numtestsperevictionrun); 연결해주는팩토리생성 ConnectionFactory connectionfactory = new DriverManagerConnectionFactory(url,user,password); PoolableConnectionFactory poolableconnectionfactory = new PoolableConnectionFactory(connectionFactory, connectionpool, null, null, false, true); PoolingDriver poolingdriver = new PoolingDriver(); poolingdriver.registerpool("database", connectionpool); } Connection Pool 이 PoolableConnection 객체를생성할때사용할 PoolableConnectionFactory 생성 - 225 -

15. Object Pooling - 설명 (5/5) Guide Program DbcpObjectpoolTest.java 은가이드프로그램을이용한테스트프로그램이다. @Resource(name = "dbcpobjectpooler") private DbcpObjectpool pool; @Test public void runmodule() { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; String sql = "select * from emp"; try { con = pool.getconnection(); pstmt = con.preparestatement(sql); rs = pstmt.executequery(); logger.debug("module1"); while(rs.next(){ logger.debug(rs.getstring("ename")); } } - 226 -

15. Object Pooling - 참고자료 Apache Commons Pool class API http://commons.apache.org/pool/api-1.4/index.html - 227 -

16. Property - 개요 서비스개요 외부파일이나환경정보에구성되어있는 key, value의쌍을내부적으로가지고있으며, 어플리케이션이이특정 key에대한 value에접근할수있도록해주는서비스 주로시스템의설치환경에관련된정보나, 잦은정보의변경이요구되는경우외부에서그정보를관리하게함으로써시스템의가변성을향상시킴 주요기능 외부별도의파일에설정정보를저장 외부파일은절대 / 상대경로나클래스패스로접근하여사용 다양한 Character Set을지원 서버의재기동없이프로퍼티를적용 문자열 key에모든객체를 value에저장 Key 문자열을가지고 value 객체조회 전체 key-value 쌍을가져오는기능제공 - 228 -

16. Property - 설명 (1/5) Property 시스템의설치환경에관련된정보나, 잦은정보의변경이요구되는경우외부에서그정보를관리하게함 시스템의유연성을높일수있음 Spring Bean 설정파일에관리하고자하는정보를입력 (Bean 설정파일사용 ) 하거나외부파일에정보입력후에 Bean 설정파일에서그파일위치를입력하여이용 - 229 -

16. Property - 설명 (2/5) Bean 설정파일사용 (1/2) Configuration <bean name="propertyservice class="egovframework.rte.fdl.property.impl.egovpropertyserviceimpl destroy-method="destroy"> <property name="properties"> <map> <entry key="aaaa" value="1234"/> </map> </property> </bean> Sample Source @Resource(name="propertyService") protected EgovPropertyService propertyservice ; @Test public void testpropertiesservice() throws Exception { assertequals("1234",propertyservice.getstring("aaaa")); } - 230 -

16. Property - 설명 (3/5) Bean 설정파일사용 (2/2) 제공유형별설정 / 사용방법 제공유형 설정방법 사용방법 String key= A value= ABC propertyservice.getstring( A ) boolean key= B value= true propertyservice.getboolean( B ) int key= C value= 123 propertyservice.getint( C ) long key= D value= 123 propertyservice.getlong( D ) short key= E value= 123 propertyservice.getshort( E ) float key= F value= 123 propertyservice.getfloat( F ) Vector key= G value= 123,456 propertyservice.getvector( G ) - 231 -

16. Property - 설명 (4/5) 외부설정파일사용 (1/2) Configuration <bean name="propertyservice" class="egovframework.rte.fdl.property.impl.egovpropertyserviceimpl destroy-method="destroy > <property name="extfilename"> <set> <map> <entry key="encoding" value="utf-8"/> <entry key="filename" value="file:./src/**/refresh-resource.properties"/> </map> <value>classpath*:properties/resource.properties</value> </set> </property> </bean> properties AAAA=1234-232 -

16. Property - 설명 (5/5) 외부설정파일사용 (2/2) Sample Source @Resource(name="propertyService") protected EgovPropertyService propertyservice ; @Test public void testpropertiesservice() throws Exception { assertequals("1234",propertyservice.getstring("aaaa")); } 실시간갱신방법 외부파일에기재된 property 내용수정 propertyservice.refreshpropertyfiles() 호출 - 233 -

17. Resource - 개요 서비스개요 국제화 (Internationalization) 및현지화 (Localization) 등을지원하기위하여, key값을이용하여, 각국가및언어에해당하는메시지를읽어오는서비스 주요기능 메시지참조 국가및언어에따라미리저장되어있는메시지정보에서, 특정 key 값에해당하는메시지를조회함 - 234 -

17. Resource - 설명 (1/5) Spring Message Source Spring 은 MessageSource 인터페이스를확장하여어플리케이션에서사용하는메시지에대한일관된처리및 국제화를지원함 Message 맛보기예제 (1/2) 환경설정 MessageSource 를구현한 bean 을설정 아래설정에서 egovframework-message 로지정한파일은실제로는 egovframework-message.properties 로정의되어 있음 <bean name="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="usecodeasdefaultmessage"> <value>true</value> </property> <property name="basenames"> <list> <value>egovframework-message</value> </list> </property> </bean> - 235 -

17. Resource - 설명 (2/5) Message 맛보기예제 (2/2) 메시지사용예제 messagesource.getmessage() 메소드를이용하여 Message 를얻음 //egovframework-message.properties 에정의된메시지내용. resource.basic.msg1=message1 @Resource(name="messageSource") MessageSource messagesource ; String getmsg = messagesource.getmessage("resource.basic.msg1", null, Locale.getDefault() ); assertequals("get Message Success!", getmsg, "message1"); - 236 -

17. Resource - 설명 (3/5) Message Locale 사용 (1/2) 동일한메시지키를가지고언어별로별도로설정관리하여사용자에따라서사용자에맞는언어로메시지를제공할수있음 환경설정 egovframework-message-locale 로지정한파일을 egovframework-message-locale_ko.properties, egovframeworkmessage-locale_en.properties로정의하고동일한메시지키에해당하는메시지를달리지정함 <bean name="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="usecodeasdefaultmessage"> <value>true</value> </property> <property name="basenames"> <list> <value>egovframework-message-locale </value> </list> </property> </bean> - 237 -

17. Resource - 설명 (4/5) Message Locale 사용 (2/2) Propreties File 설정 //egovframework-message-locale_ko.properties 파일내용 resource.locale.msg1= 메시지 1 //egovframework-message-locale_en.properties 파일내용 resource.locale.msg1=en_message1 사용예제 Locale 정보에따라서추출되는메시지의내용이달라짐 //egovframework-message.properties 에정의된메시지내용. resource.basic.msg1=message1 String getmsg = messagesource.getmessage("resource.locale.msg1", null, Locale.KOREAN ); assertequals("get Message Success!", getmsg, " 메시지 1"); String getmsg = messagesource.getmessage("resource.locale.msg1", null, Locale.ENGLISH ); assertequals("get Message Success!", getmsg, "en_message1"); - 238 -

17. Resource - 설명 (5/5) Message Parameter 프로그램수행중에발생되는메시지에파라미터를추가하여제공 메시지정의시 {0},{1} 등으로파라미터선언 resource.basic.msg3=message {0} {1} 사용예제 parameter 에 1 과 2 를지정하여 getmessage 의두번째인자에넣고호출하면리턴메시지로 message 1 2 를얻음 Object[] parameter = { new String("1"), new Integer(2) }; String getmsg = messagesource.getmessage("resource.basic.msg3", parameter, Locale.getDefault() ); assertequals("get Message Success!", getmsg, "message 1 2"); - 239 -

17. Resource - 참고자료 The Spring Framework - Reference Documentation http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#context-functionality-messagesource http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#contextfunctionality-messagesource - 240 -

18. Scheduling - 개요 서비스개요 어플리케이션서버내에서주기적이거나반복적인작업을지원하는서비스 주요기능 속성 ( 반복주기, 반복회수등 ) 을지정및변경하는기능을제공 주기적이거나반복적으로수행될작업을선언하여관리 주기적이거나반복적으로수행될작업들의주기, 반복회수등을선언하여관리 Unix의 Cron command와유사한형태의표기법지원 - 241 -

18. Scheduling - 설명 (1/11) Quartz 스케쥴러 오픈소스작업스케줄링프레임워크 자바로구현되어있으며독립어플리케이션혹은 J2EE환경에서통합되어실행됨 다양한작업스케줄링지원 Unix 시스템의 cron 과유사한표현식지원 확장가능한리스너제공 오류시작업복구 POJO 혹은 EJB 작업지원 JTA 트랜잭션지원 클러스터링지원 멀티쓰레딩지원 RMI를통한리모트사용지원 - 242 -

18. Scheduling - 설명 (2/11) Quartz 스케쥴러주요요소 Scheduler Quartz 실행환경을관리하는핵심개체 Job 사용자가수행할작업을정의하는인터페이스로서 Trigger 개체를이용하여스케줄링됨. JobDetail What? Job JobDetail When? Trigger 작업명과작업그룹과같은수행할 Job 에대한상세 Trigger 정보를정의하는개체 Scheduler 정의한 Job 개체의실행스케줄을정의하는개체로서 Scheduler 개체에게 Job 수행시점을알려주는개체 Quartz 스케줄러특징 수행작업을정의하는 Job과실행스케줄을정의하는 Trigger를분리함으로써유연성을제공함 Job 과실행스케쥴을정의한경우, Job은그대로두고실행스케쥴만을변경할수있음 하나의 Job에여러개의실행스케쥴을정의할수있음 - 243 -

18. Scheduling - 설명 (3/11) Quartz 스케쥴러사용예제 (1/2) 사용자정의 Job 사용자는업무처리를수행할 Job 개체를생성하기위해 org.quartz.job 인터페이스를구현하고심각한오류가발생한경우 JobExecutionException 예외를던질수있음 Job 인터페이스는단일메소드로 execute() 가정의되어있음 public class DumbJob implements Job { public void execute(jobexecutioncontext context) throws JobExecutionException { System.out.println("DumbJob is executing."); } } - 244 -

18. Scheduling - 설명 (4/11) Quartz 스케쥴러사용예제 (2/2) Quartz 스케줄등록 1 우선 Job 설정을위해 JobDetail 클래스를정의한다. 2 TriggerUtils을이용하여매일 8시30분실행하는 Trigger를생성한다. 3 마지막으로, Scheduler에 JobDetail과 Trigger를등록한다. JobDetail jobdetail = new JobDetail("myJob",// Job 명 sched.default_group, // Job 그룹명 ('null' 값인경우 DEFAULT_GROUP 으로정의됨 ) DumbJob.class); // 실행할 Job 클래스 Trigger trigger = TriggerUtils.makeDailyTrigger(8, 30); // 매일 08 시 30 분실행 trigger.setstarttime(new Date()); // 즉시시작 trigger.setname("mytrigger"); sched.schedulejob(jobdetail, trigger); - 245 -

18. Scheduling - 설명 (5/11) Spring 과 Quartz 통합 Spring은 Scheduling 지원을위한통합클래스를제공함 Spring의 Quartz 작업생성방법 JobDetailBean을이용한방법으로, QuartzJobBean을상속받아 Job 클래스생성 MethodInvokingJobDetailFactoryBean을이용하여 Bean 객체의메소드직접호출 - 246 -

18. Scheduling - 설명 (6/11) JobDetailBean을이용한작업생성 (1/2) Job 작성 QuartzJobBean은 Quartz Job 인터페이스구현체 아래예제의 SayHelloJob 클래스는작업생성을위해 QuartzJobBean의 executeinternal(..) 함수를오버라이드함 package egovframework.rte.fdl.scheduling.sample; public class SayHelloJob extends QuartzJobBean { } private String name; public void setname(string name) { this.name = name; } @Override protected void executeinternal(jobexecutioncontext ctx) throws JobExecutionException { System.out.println("Hello, " + name); } - 247 -

18. Scheduling - 설명 (7/11) JobDetailBean을이용한작업생성 (2/2) JobDetailBean 설정 JobDetail 작업실행에필요한정보를담고있는객체 Spring은 JobDetail 빈생성을위해 JobDetailBean을제공함 jobdataasmap 개체를이용하여 JobDetail 개체에 Job 설정에필요한속성정보를전달함 <bean id="jobdetailbean" class="org.springframework.scheduling.quartz.jobdetailbean"> <property name="jobclass" value="egovframework.rte.fdl.scheduling.sample.sayhellojob" /> <property name="jobdataasmap"> <map> <entry key="name" value="jobdetail" /> </map> </property> </bean> - 248 -

18. Scheduling - 설명 (8/11) MethodInvokingJobDetailFactoryBean을이용한작업생성 작업수행을할 Bean 클래스정의 package egovframework.rte.fdl.scheduling.sample; public class SayHelloService { } public void sayhello() { System.out.println("Hello"); } 정의한 Bean 객체의메소드를직접호출하는작업을생성하기위해 MethodInvokingJobDetailFactoryBean 정 의 <bean id="sayhelloservice" class="egovframework.rte.fdl.scheduling.sample.sayhelloservice"> <property name="name" value="factorybean" /> </bean> <bean id="jobdetailfactorybean" class="org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean"> <property name="targetobject" ref="sayhelloservice" /> <property name="targetmethod" value="sayhello" /> <property name="concurrent" value="false" /> </bean> - 249 -

18. Scheduling - 설명 (9/11) 작업스케쥴링 (1/2) SimpleTrigger 특정시간, 반복회수, 대기시간과같은단순스케쥴링에사용됨 CronTrigger 유닉스의 Cron 명령어와유사하며, 복잡한스케쥴링에사용됨 CronTrigger 는달력을이용하듯특정시간, 요일, 월에 Job 을수행하도록설정할수있음 SimpleTriggerBean 을이용한설정예 <bean id="simpletrigger" class="org.springframework.scheduling.quartz.simpletriggerbean"> <property name="jobdetail" ref="jobdetailbean" /> <!-- 즉시시작 --> <property name="startdelay" value="0" /> <!-- 매 10 초마다실행 --> <property name="repeatinterval" value="10000" /> </bean> - 250 -

18. Scheduling - 설명 (10/11) 작업스케쥴링 (2/2) CronTriggerBean 을이용한설정 <bean id="crontrigger" class="org.springframework.scheduling.quartz.crontriggerbean"> <property name="jobdetail" ref="jobdetailfactorybean" /> <!-- 매 10 초마다실행 --> <property name="cronexpression" value="*/10 * * * *?" /> </bean> 크론표현식 초 (0-59) 분 (0-59) 시간 (0-23) 날짜 (1-31) 월 (1-12) 요일 (1-7) 년도 ( 옵션 ) 특수문자 1. * : 항상실행의의미 2.? : 날짜와요일은상호배타적이므로둘중하나를설정하지않음을표시함 사용예제 1. 0 15 10? * * 매일 10시 15분에실행 2. 0 15 10 15 *? 매월 15일 10시15분에실행 크론표현식에대한자세한설명은아래사이트참조 http://www.opensymphony.com/quartz/wikidocs/crontriggers Tutorial.html - 251 -

18. Scheduling - 설명 (11/11) 작업시작하기 스케줄링한작업의시작을위해 Spring 은 SchedulerFactoryBean 을제공함 <bean id="scheduler class="org.springframework.scheduling.quartz.schedulerfactorybean"> <property name="triggers"> <list> <ref bean="simpletrigger" /> <ref bean="crontrigger" /> </list> </property> </bean> - 252 -

18. Scheduling - 참고자료 Quartz 매뉴얼 http://www.opensymphony.com/quartz/wikidocs/tutorial.html Spring Scheduling 매뉴얼 http://static.springframework.org/spring/docs/2.5.x/reference/scheduling.html Quartz API http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html Spring API http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/scheduling/quartz/packagesummary.html http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/scheduling/packagesummary.html Quartz Cron 표현식 http://www.opensymphony.com/quartz/wikidocs/crontriggers%20tutorial.html - 253 -

19. Server Security - 개요 서비스개요 응용프로그램작성시발생될수있는보안상의문제점은인증및접근제어, 계정관리, 정보통제및환경설정등의상황에서발생할수있으며이에대한대응을위한서비스제공 기존의 Servlet spec에서 Security의한계 container 이식성, config. Requirements, 제한된웹요청 security의한계 서비스레이어보안및도메인객체레벨보안미지원 주요기능 인증 Web URL 페이지인증 Method invocation 인증 권한부여 세션관리 - 254 -

19. Server Security - 설명 (1/24) Why Spring Security? 엔터프라이즈어플리케이션을위한인증 (Authentication), 권한처리 (Authorization) 서비스를제공하는강력하고유연한보안솔루션 Servlet Filter 와 Java AOP 를통한 Interception를사용하여보안을강제하며 Spring의 IoC 와 lifecycle 서비스기반으로동작 authentication, Web URL authorization, Method 호출 authorization, 도메인객체기반의 security 처리, 채널보안 (https 강제 ), Human user 인식등의주요기능을제공 Web request 보안에더하여 Service Layer 및인스턴스수준의보안제공으로 Layering issue 해결및웹클라이언트외의다양한 rich 클라이언트 / 웹서비스에대한보안제어를지원 재사용성, 이식성, 코드품질, 레퍼런스 ( 정부, 은행, 대학, 기업등많은 business field), 다양한타프레임워크지원, community Spring Security는편의성뿐아니라보안레이어컴포넌트의재사용성이높은오픈소스보안프레임워크 - 255 -

19. Server Security - 설명 (2/24) Architecture 일반적인웹어플리케이션의인증절차 전형적인웹리소스접근개념도 [ 그림 ] - 256 -

19. Server Security - 설명 (3/24) Architecture HTTP Request Filter Chain - AuthenticationProcessingFilter AuthenticationProcessingFilter 와 dependencies - 257 -

19. Server Security - 설명 (4/24) Architecture DB Schema(1/4) 자원 자원 - 역할매핑 자원 ID 권한 자원 ID 자원명자원패턴설명자원유형정렬순서생성일자수정일자 사용자 사용자 ID 사용자이름패스워드사용여부 역할 권한역할명권한설명생성일자수정일자 권한계층 부모역할자식역할 사용자 - 권한매핑 사용자 ID 권한 - 258 -