NeoDEEX Deveoper Guide

Size: px
Start display at page:

Download "NeoDEEX Deveoper Guide"

Transcription

1 NeoDEEX Developer Guide For Standard Edition 컨설팅서비스그룹

2 NeoDEEX Overview NeoDEEX 개요 목차 NeoDEEX Overview... 1 NeoDEEX 개요... 1 NEODEEX 의기능... 2 NEODEEX 의에디션별차이점... 5 NEODEEX STANDARD 에디션에서의기능... 5 NEODEEX 를이용한예제... 7 NeoDEEX Features... 9 데이터액세스기능... 9 데이터액세스클래스생성방법 일반적인데이터액세스사용방법 조회기능 추가 / 수정 / 삭제기능 매개변수가있는경우의사용방법 테이블이름을매핑하는방법 데이터액세스관련예외를처리하는방법 다건의쿼리명령을실행하는방법 타임아웃설정방법 트랜잭션의사용방법 이식성 VS 성능 NEODEEX 에서권장되는데이터액세스코드작성방법 Fox Query 기능 Foxml 및 QueryMapper Foxml 관련 API 의사용 Fox Query 편집기 쿼리실행및매개변수설정 쿼리자동생성 매개변수자동추출 탭을통한다양한뷰를지원 소스코드자동생성 트랜잭션및컴포넌트서비스기능 트랜잭션개요 로컬트랜잭션 vs. 분산트랜잭션 분산트랜잭션프레임워크비교 트랜잭션사용 FoxTransaction 특성 트랜잭션시작과종료 트랜잭션범위및전파 트랜잭션격리수준및타임아웃설정 컴포넌트베이스클래스 (FoxComponentBase) 데이터액세스컴포넌트 (DAC) 베이스클래스 수정해야함 비즈니스로직컴포넌트 (BLC) 베이스클래스 수정해야함 비즈니스로직계층아키텍처 로깅기능 파일로그작성방법 콘솔로그작성방법 로그수준을이용하는방법 구성설정기능 구성섹션을정의하는방법 외부파일을구성파일로사용하는방법 NeoDEEX Developer Guide i

3 NeoDEEX Overview NeoDEEX 개요 NeoDEEX Overview 이문서는개발자를위한 NeoDEEX 에대한개발자가이드문서이다. 이문서에서는 NeoDEEX 에대한개략 적인개요와더불어 NeoDEEX 가제공하는다양한기능에대해서소개한다. 주 ) 이자료는 preview 버전을기준으로작성되었기에, 언급된모든내용은최종버전에서예고없이변경될 수있다. NeoDEEX 개요 NeoDEEX 는 Microsoft.NET 응용프로그램을개발하기위한기본적인.NET 기반모듈들을포함하고있는프레임워크로, 드원테크놀러지 ( 에서다년간의프레임워크에관련된노하우및기술을바탕으로만들어진프레임워크이다. 특히, NeoDEEX 4.0( 코드명 Fox Framework) 은기존의 NeoDEEX 2.X 기술기반프레임워크를전반적으로리팩토링하여새로이개발된프레임워크로서, 개발생산성향상과응용프로그램의성능및안정성향상에큰비중을두어보강된제품이다. NeoDEEX 는이미포스코건설, 현대중공업, 한국토지신탁, 경신공업, 한일월드, 대우엔지니어링등과 같은수많은기업프로젝트에서사용되고있으며, 특히 현대중공업의경우에는전사개발프레임워크로서 NeoDEEX 가채택되었으며, 모든.NET 프로젝트에서 NeoDEEX 를사용하고있다. NeoDEEX 는크게 Free 에디션과 Standard 에디션, Enterprise 에디션으로구분할수있으며, 이문서에서설명할 Standard 에디션은데이터액세스기능과트랜잭션을관리하고비즈니스로직컴포넌트에대한컴포넌트서비스를제공하는기능및구성설정관련기능과로깅기능이포함된에디션이다. Standard 에디션의목적은다양한비즈니스로직을처리하는다계층어플리케이션에서비즈니스로직컴포넌트와데이터액세스컴포넌트를보다쉽게작성할수있도록돕는것이며, 이를통해웹어플리케이션, 스마트클라이언트어플리케이션등의서버측모듈을개발할수있다. Standard 에디션이제공하는트랜잭션및컴포넌트서비스기능은보다빠르고쉽게서버측모듈을개발할수있도록해주며, 복잡한트랜잭션모델을간소화할수있을뿐만아니라비즈니스로직을손쉽게확장할수있는기능을제공한다. 이를통해보다높은개발생산성을확보할수있고안정적인서버모듈들을작성할수있다. NeoDEEX Developer Guide 1

4 NeoDEEX Overview NEODEEX 의기능 이문서에서는 Standard 에디션에서제공하는기능인데이터액세스, 구성설정, 로깅기능, 트랜잭션컴포넌트서비스를모두다룬다. 이문서는 NeoDEEX 에대한기능및장점들을소개하고있으며, 실제.NET 관련프로젝트개발에 NeoDEEX 를사용할경우, 좀더쉽고빠르고, 반복적인코딩이필요없는개발을할수있을것이다. NEODEEX 의기능 NeoDEEX 4.0 을사용하면다음과같은기능을이용할수있다. Data Access 기능 단일데이터 API 로다양한데이터베이스로의접근가능 (Unified Data Access). 손쉽고간단한 API 를통해데이터액세스가능. 자동적인 Connection 관리제공. SQL Server, OLE DB, ODBC, Oracle(ODP.NET), DB2 지원. Logging 기능 다양한매체에로그를기록할수있는유연한로깅인프라지원 Debugger/Console/Text File/Database 등기본로깅매체제공 강력한 Text File 로깅지원 ( 일별 / 주별로깅, 파일크기제한, 초당 4 만개의로깅성능 ) 커스텀로깅매체지원 Configuration 기능 간결하고확장가능한 NeoDEEX Configuration 인프라 외부 Configuration 파일지원 Configuration 변경시설정다시로드 여러응용프로그램에서하나의구성파일공유가능. 사용자정의구성섹션작성가능. 데이터베이스프로파일기능 Fox Data Access 를통해수행되는모든쿼리에대한로그기록 사용자 ID, DB Access 시간, 매개변수값등다양한정보포함 로그필터링지원 NeoDEEX Developer Guide 2

5 NeoDEEX Overview NEODEEX 의기능 Fox Logging 을통한로그기록 : 다양한매체에쿼리로그기록가능 고유 ID 를통해성능추적가능 (Fox Performance Trace 연계 ) Fox Query 기능제공 ibatis 스타일의 SQL 맵 XML 파일 (foxml 파일 ) 기능 간결한 XML 스키마를통한손쉬운 XML 편집 Foxml 파일변경탐지및캐시자동업데이트 Visual Studio 에통합된전용에디터제공 (Fox Query Editor) 매개변수자동추출및쿼리자동생성기능제공 쿼리를수행하는 C# 코드생성및 Visual Studio 통합 Fox SQL 애드인지원 SQL 쿼리문장을 C# 소스코드에손쉽게붙여넣기위한 Visual Studio 애드인 Fox Data Access 기반의 C# 코드생성 Fox Query 를사용하지않을경우유용 Transaction 기능 AOP 기반의강력한분산 / 로컬트랜잭션제어프레임워크 분산 / 로컬트랜잭션컨트롤러선택가능 TheOne.Transactions 네임스페이스를통해선언적트랜잭션을제공하며기존 COM+ 의불편한기능및성 능개선. 사용자정의 AOP 특성지원. 즉, Execution Extension 을통해컴포넌트의전처리 (preprocessing) 및후처 리 (postprocessing) 가가능하며이를통해비즈니스로직컴포넌트와데이터액세스컴포넌트의확장가능. Fox Performance Trace 를통해컴포넌트의수행성능추적가능 성능추적기능지원 다계층어플리케이션의구간별성능자동측정 클라이언트 / 웹서비스 /Biz 컴포넌트 /Dac 컴포넌트 /DB 계층성능측정 낮은오버헤드로시스템운영시에도적용가능 Fox Logging 을통한성능정보로깅 NeoDEEX Developer Guide 3

6 NeoDEEX Overview NEODEEX 의기능 성능모니터지원 Fox Performance Trace 에의해발생된성능정보모니터링및분석 성능자료실시간모니터링 성능자료데이터베이스기록 성능분석보고서제공 웹서비스기능지원 WCF 기반웹서비스구현을간편하게해주는커뮤니케이션인프라 재사용이가능한공통 WCF 서비스및컴포넌트를통해개발생산성극대화 데이터압축및대용량데이터전송기능을통한성능향상 UI 모델관련지원 프리젠테이션계층의메뉴와화면 ( 뷰 ) 들제어를위한데이터구조및 UI 모델제공 MVVM 패턴적용 어플리케이션메뉴데이터모델기본제공 메뉴데이터베이스스키마기본제공 스마트클라이언트화면 DLL 다운로더제공 WinForm 지원 WinForm 기반의클라이언트개발프레임워크 UI 개발을위한풍부한기능의베이스클래스들제공 다양한기본 UI 요소들제공 다양한화면템플릿제공 DevExpress 기반의 UI 세트제공 ( 타컨트롤슈트사용가능 ) WPF 기술지원 WPF 기반의클라이언트개발프레임워크 UI 개발을위한풍부한기능의베이스클래스들제공 다양한기본 UI 요소들제공 위에서나열한기능들은 NeoDEEX 의 Enterprise 에디션에서제공하는기능들을나열한것이다. 그렇기에, NeoDEEX Developer Guide 4

7 NeoDEEX Overview NEODEEX 의에디션별차이점 Standard 에디션에서는일부기능이지원되지않을수있다. NEODEEX 의에디션별차이점 NeoDEEX 는현재 4.0 버전까지출시되었으며, 4.0 버전에는완전한서버프레임워크를제공하는 Free 에디 션과운영, 관리적인요소들도포함하고있는 Standard 에디션, 그리고프레임워크에있는모든기능을사용 할수있는 Enterprise 에디션의 3 가지에디션으로구성되어있다. 각에디션에서제공하는기능들을간략하게요약하면 [ 표 1] 과같다. 기능 에디션 Free 에디션 Standard 에디션 Enterprise 에디션 Fox Configuration O O O Fox Logging O ( 일부로깅기능제외 ) O O Fox Data Access O O O Fox Transaction O (Local Transaction 등일 O O 부기능제외 ) Fox DB Profile X O O Fox Query X O O Fox Trace Performance X O ( 일부실시간모니터링및 O 분석도구제외 ) Fox Web Service X X O Fox Win Form X X O Fox WPF X X O UI Template X X O 개발표준가이드문 서 X X O Trial Edition X O O 표 1. 각에디션별제공하는기능 NEODEEX STANDARD 에디션에서의기능 NeoDEEX Standard 에디션에서지원하는기능을크게나누어보면 [ 표 2] 와같이요약해볼수있다. 기능 설명 NeoDEEX Developer Guide 5

8 NeoDEEX Overview NEODEEX STANDARD 에디션에서의기능 Fox Configuration 간결하고확장가능한 NeoDEEX Configuration 인프라 외부 Configuration 파일지원 Configuration 변경시설정다시로드 Fox Logging 다양한매체에로그를기록할수있는유연한로깅인프라 Debugger/Console/Text File/Database 등기본로깅매체제공 강력한 Text File 로깅지원 ( 일별 / 주별로깅, 파일크기제한, 초당 4 만개의로깅성능 ) 커스텀로깅매체지원이용이함로깅범위제어가용이함 Fox Data Access 다양한데이터베이스에대해사용하기편리한 API 제공 SQL Server, Oracle, DB2, OLEDB, ODBC 기본지원 로컬트랜잭션및분산트랜잭션지원 데이터베이스별특화된기능지원 Fox DB Profile Fox Data Access 를통해수행되는모든쿼리에대한로그기록 사용자 ID, DB Access 시간, 매개변수값등다양한정보포함 로그필터링 Fox Logging 을통한로그기록 : 다양한매체에쿼리로그기록가능 고유 ID 를통해성능추적가능 (Fox Performance Trace 연계 ) Fox Query ibatis 스타일의 SQL 맵 XML 파일 (foxml 파일 ) 기능 간결한 XML 스키마를통한손쉬운 XML 편집 Foxml 파일변경탐지및캐시자동업데이트 Visual Studio 에통합된전용에디터제공 (Fox Query Editor) 매개변수자동추출및쿼리자동생성기능제공쿼리를수행하는 C# 코드생성및 Visual Studio 통합 Fox SQL Paste Add-in SQL 쿼리문장을 C# 소스코드에쉽게삽입하기위한 Visual Studio 애드인 Fox Data Access 기반의 C# 코드생성 Fox Query 를사용하지않을경우유용 Fox Transaction AOP 기반의강력한분산 / 로컬트랜잭션제어프레임워크 AOP (attribute 사용 ) 기반트랜잭션제어 분산 / 로컬트랜잭션컨트롤러선택가능트랜잭션처리성능향상 Fox Performance Trace 를통해컴포넌트의수행성능추적가능사용자정의 AOP 특성지원 Fox Performance Trace 다계층어플리케이션의구간별성능자동측정클라이언트 / 웹서비스 /Biz 컴포넌트 /Dac 컴포넌트 /DB 계층성능측정어플리케이션의성능지표파악이손쉬움낮은오버헤드로시스템운영시에도적용가능 Fox Logging 을통한성능정보로깅 NeoDEEX Developer Guide 6

9 NeoDEEX Overview NEODEEX 를이용한예제 Fox Performance Monitor Fox Performance Trace 에의해발생된성능정보모니터링및분석 성능자료실시간모니터링 표 2. NeoDEEX Standard 에디션에서제공하는기능 [ 표 2] 에서설명한기능들대해서는이문서의중 / 후반부에설명할것이며, 우선간단하게나마 NeoDEEX 를 이용하여데이터액세스를하는방법을알아보도록하자. NEODEEX 를이용한예제 일반적으로데이터베이스에접근하여데이터의조회및추가, 수정, 삭제에관련된작업을하기위해서 는.NET 프레임워크에서제공하는 ADO.NET 을이용하여코드를작성하게된다. ADO.NET 을사용하여테이 블에존재하는특정데이터를업데이트하는일반적인경우의코드작성방법은 [ 리스트 1] 과같다. // SqlConnection 객체를생성한다. SqlConnection connection = new SqlConnection("Server=ServerName;DataBase=Northwind;UID=UserID;PWD=Password"); // SqlCommand 객체를생성한다. SqlCommand command = new SqlCommand("SELECT * FROM Employees", connection); SqlDataAdapter adapter = new SqlDataAdapter(command); DataSet ds = new DataSet(); // Open 메서드를사용하여연결을연다. connection.open(); try // 명령을실행한다. adapter.fill(ds); catch (SqlException ex) MessageBox.Show(ex.ToString()); finally // 연결이열려있는상태라면, 연결을닫는다. if (connection.state == ConnectionState.Open) connection.close(); 리스트 1. ADO.NET 을사용하여데이터를업데이트하는일반적인코드 ADO.NET 을사용하는경우에는, ADO.NET 에서제공하는 SqlConnection 클래스및 SqlCommand 클래스, 그리고데이터조회의경우에는데이터조회의결과를 DataSet 객체또는 DataTable 객체에담기위한 SqlDataAdapter 클래스를생성하는코드를작성해야한다. 이러한코드의작성방법은일반적으로사용되는방법이며, 여타다른프레임워크에서제공하는데이터베이스의헬퍼클래스를사용하는경우에도 Connection 과 Command 객체는생성해야할필요가있다. 그렇다면, NeoDEEX 를사용하는경우에어떻게코드를작성하는지를보도록하자. NeoDEEX 에서는데이터 소스의종류에상관없이접근이가능한 FoxDbAccess 라는클래스를제공하고있기때문에이클래스를이용 NeoDEEX Developer Guide 7

10 NeoDEEX Overview NEODEEX 를이용한예제 하여쉽게코드를작성할수있다. NeoDEEX 를사용하는경우의코드작성방법은 [ 리스트 2] 와같다. // DbAccess 객체를생성한다. FoxSqlDbAccess access = new FoxSqlDbAccess("Server=ServerName;DataBase=Northwind;UID=UserID;PWD=Password"); try // ExecuteSqlDataSet 메서드를사용하여쿼리를실행한다. int result = access.executesqldataset("select * FROM Employees"); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 2. NeoDEEX 를사용하여데이터를업데이트하는일반적인코드 [ 리스트 1] 과 [ 리스트 2] 에작성된코드를비교해보도록하자. ADO.NET 을이용하는 [ 리스트 1] 의코드에비 해 NeoDEEX 를이용하는 [ 리스트 2] 의코드가훨씬더사용이편리하고간단함을볼수있다. 또한, NeoDEEX 를통해반복적인코드를크게줄여줄수있기때문에, 개발생산성의향상을도모할수있다. 참고 NeoDEEX 를사용하기위해서는전역어셈블리캐시 (GAC, Global Assembly Cache) 또는로컬에위치한어셈블리를참조해야한다. 그렇기때문에, 전역어셈블리캐시또는로컬에위한 TheOne.4.0.dll 어셈블리와 TheOne.Data.4.0.dll 어셈블리 (Oracle 데이터소스에접근하려는경우에는 TheOne.Data.Oracle.4.0.dll 어셈블리 ) 를먼저프로젝트에참조하도록하자. NeoDEEX Developer Guide 8

11 데이터액세스기능 NeoDEEX Features [ 표 2] 에서이미설명한것처럼, NeoDEEX 의 Standard 에디션은데이터액세스기능과트랜잭션처리등다 양한기능들을제공하고있다. 지금부터는 Standard 에디션에서제공하는기능에대한설명및사용방법에 대해서알아보도록하겠다. 데이터액세스기능 NeoDEEX 는다양한.NET 데이터공급자를단일 API 를통해호출할수있도록하는기능을제공하는추상클래스인 FoxDbAccess 클래스를제공하고있다. 기존 ADO.NET 의경우에는특정.NET 데이터공급자에대해서사용할수있는특정클래스들 ( 예를들면, SqlConnection, OracleConnection 등 ) 을사용하여데이터베이스관련작업을수행할수있었지만, NeoDEEX 에서는마찬가지의방법을제공할뿐만아니라, 일종의공용클래스인 FoxDbAccess 를사용하여대부분의데이터공급자를지원할수가있다. FoxDbAccess 클래스자체에는 ADO.NET 에서지원하는모든기능들이구현되어있기때문에, 어느데이터공급자를사용하든지에상관없이일관적으로데이터베이스관련처리를수행할수있다. FoxDbAccess 클래스와 FoxDbAccess 클래스를구현하고있는다른클래스들과의도식관계는 [ 그림 1] 과 같다. 그림 1. FoxDbAccess 클래스와 FoxDbAccess 클래스를구현하는구체 (concrete) 클래스들 [ 그림 1] 에서볼수있듯이, 사용하려는.NET 데이터공급자에적합한클래스의인스턴스 (FoxSqlDbAccess, FoxOdbcAccess, FoxOleDbAccess, FoxOracleDbAccess 클래스의인스턴스 ) 를생성하여, 각.NET 데이터공급자로접근하는코드를작성할수있다. 뿐만아니라, FoxDbAccess 클래스를사용하여다양한.NET 데이터공급자를지원하도록하는방식도사용할수있다. 각.NET 데이터공급자별로사용해야하는클래스들은 [ 표 3] 에기술되어있다. 데이터소스네임스페이스클래스명 SQL Server TheOne.Data.SqlClient FoxSqlDbAccess ODBC Provider TheOne.Data.Odbc FoxOdbcDbAccess NeoDEEX Developer Guide 9

12 데이터액세스기능 OLE DB Provider TheOne.Data.OleDb FoxOleDbAccess Oracle TheOne.Data.Oracle FoxOracleDbAccess ODP.NET TheOne.Data.Odp FoxOdpDbAccess 표 3. 데이터소스에따른네임스페이스및클래스정보 사용할수있는클래스들을알아보았으니, 이제부터는이러한클래스들을이용하여코드를작성하는방법에 대한설명을하도록하겠다. 데이터액세스클래스생성방법 먼저,.NET 데이터공급자에관계없이데이터액세스클래스를생성하기위해서는 [ 리스트 3] 과같이추상베이스클래스인 FoxDbAccess 클래스를선언하고 FoxDatabaseFactory 의 CreateDatabase() 메서드를사용하여 FoxDbAccess 의개체인스턴스를생성하면된다. CreateDatabase() 메서드를호출하게되면, 내부적으로데이터베이스에대한연결문자열은설정파일의 <database> 섹션에설정된기본데이터베이스연결문자열 (defaultconnectionstring 으로지정된연결문자열 ) 을읽어들이게된다. // FoxDatabaseFactory.CreateDatabase() 메서드를이용하여 DbAccess 클래스를생성한다. // CreateDatabase() 메서드에인자값이없는경우에는, // <database> 섹션의 defaultdatabase 특성에정의된값이기본값으로사용된다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); 리스트 3. 일반적인 FoxDbAccess 클래스생성방법 구성설정파일의섹션들에대해서는이후에설명하겠지만, 참고를위해서 <database> 섹션의예를일부보 여주면 [ 리스트 4] 와같다. <?xml version="1.0" encoding="utf-8"?> <theone.configuration> <database defaultconnectionstring="default"> <connectionstrings> <add name="default" encrypted="false" connectionstring="data Source=.\SQLEXPRESS;AttachDbFileName= DataDirectory FoxTestDb.mdf; Integrated Security=True;User Instance=True" type="theone.data.sqlclient.foxsqldbaccess, TheOne.Data.4.0" commandtimeout="60"/> 리스트 4. 데이터베이스연결문자열설정 데이터베이스연결문자열은 <theone.configuration><database><connectionstrings> 노드에추가하면된다. 여러개의데이터베이스문자열을추가할수있으며, 상황에따라필요한연결문자열을선별하여사용할수있다. [ 리스트 3] 의코드처럼 FoxDatabaseFactory 의 CreateDatabase() 메서드를호출한경우에는상기연결문자열중 defaultconnectionstring 에지정된연결문자열이사용된다. 상기설정에서 defaultconnectionstring 의값은 Defualt 이기에, [ 리스트 3] 은 Default 에해당하는연결문자열을사용하게되는것이다. 만약, 구성설정파일 (web.cofing 나 app.config) 에특정연결문자열을지정해두고, 그키명칭을사용하여 FoxDbAccess 클래스를생성하고자하는경우에는, [ 리스트 5] 와같이 CreateDatabase 메서드의인자로연 NeoDEEX Developer Guide 10

13 데이터액세스기능 결문자열의키이름을지정하면된다. // <databasesection> 섹션에정의된연결문자열중, 특정연결문자열을사용하고싶은경우에는 // CreateDatabase() 메서드의인자값으로, <add> 요소에정의된이름을지정하면된다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase("Default"); 리스트 5. 특정연결문자열을사용하는 DbAccess 클래스생성방법 기본적으로, NeoDEEX 는 [ 리스트 5] 에서보여진것과같이팩토리패턴을통해데이터액세스객체를생성하 도록권장하고있다. 설정파일을이용하면설령데이터베이스연결문자열이변경된다하더라도코드를변경 하거나다시빌드를하지않아도되기때문이다. 중요 만약, [ 리스트 5] 과같이 DatabaseFactory.CreateDatabase() 메서드를이용하여 DbAccess 클래스를생성 하는경우라면, 구성파일에는반드시 <database> 섹션이정의되어야한다. <theone.configuration> <database defaultconnectionstring="default"> <connectionstrings> <add name="default" encrypted="false" connectionstring="data Source=.\SQLEXPRESS;AttachDbFileName= DataDirectory FoxTestDb.mdf; Integrated Security=True;User Instance=True" type="theone.data.sqlclient.foxsqldbaccess, TheOne.Data.4.0" commandtimeout="60"/> </connectionstrings> </theone.configuration> <database> 섹션을내부에는.NET 데이터공급자별데이터베이스연결문자열을다양하게정의할수있 다. 다양한연결문자열을미리지정해두고, 비즈니스코드에서필요에따라연결문자열을바꾸어사용할수 있다. <database> 섹션에서제공하는 defaultconnectionstring 특성을지정한다면 ( 상기예의경우, Default 가지 정되어있다 ), FoxDatabaseFactory.CreateDatabase() 메서드를사용하는경우 defaultconnectionstring 특성에정의된연결설정 ( 예제의경우, Default) 을기반으로하는 FoxDbAccess 클래스가생성된다. 기본적으로는이와같이인자값을갖지않는 FoxDatabaseFactory.CreateDatabase() 메서드를사용하는코딩패턴이권장된다. 그이유는만약.NET 데이터공급자가변경되어다른연결문자열을사용해야하는경우간단하게 defaultconnectionstring 특성에정의된값만을변경하여데이터베이스연결을변경할수있기때문이다. 만약, 응용프로그램에서접근하는.NET 데이터공급자가고정되어있는경우라면, 성능향상을위하여접근하려는.NET 데이터공급자에맞는클래스를사용하는방법이권장된다. 예를들어, 데이터소스가 Microsoft SQL Server 라면앞서설명한 FoxDbAccess 클래스를사용하는대신에 [ 리스트 6] 에서와같이, FoxSqlDbAccess 클래스를직접적으로사용하는방법이권장된다. // Microsoft SQL Server 를데이터소스로사용하는경우라면, FoxSqlDbAccess 클래스를직접사용하도록한다. NeoDEEX Developer Guide 11

14 데이터액세스기능 FoxSqlDbAccess access = (FoxSqlDbAccess)FoxDatabaseFactory.CreateDatabase(); 리스트 6. 일반적인 FoxSqlDbAccess 클래스생성방법 (1) 만일, CreateDatabase 메서드를사용하지않고, 직접데이터베이스연결문자열을사용하여 SqlDbAccess 클래스를생성하고싶다면그또한가능하다. [ 리스트 7] 은직접데이터베이스연결문자열을지정하여데이터 베이스클래스를생성하는코드를보여주고있다. string connstring = "Data Source=.\SQLEXPRESS;AttachDbFileName= DataDirectory FoxTestDb.mdf;"; SqlDbAccess access = new SqlDbAccess(connString); 리스트 7. 데이터베이스연결문자열이용하여 SqlDbAccess 클래스를생성하는방법 혹은, 구성파일의 <connectionstrings> 섹션에서데이터베이스연결문자열을읽어와서 SqlDbAccess 클래스를생성할수도있다. 구성파일의 <connectionstrings> 섹션에 Default 이라는이름으로연결문자열이정의되었다면, [ 리스트 8] 과같이 ConfigurationManager.ConnectionStrings 을사용하여데이터베이스연결문자열을읽어올수있고, 그연결문자열을사용하여 SqlDbAccess 클래스를생성할수있다. string connstring = ConfigurationManager.ConnectionStrings["Default"].ConnectionString; SqlDbAccess access = new SqlDbAccess(connString); 리스트 8. <connectionstrings> 섹션을이용하여 SqlDbAccess 클래스를생성하는방법 상기방법중편한방법을사용하여 SqlDbAccess 클래스를생성및사용할수있지만, [ 리스트 6] 에서와같 이 FoxDatabaseFactory.CreateDatabase() 메서드를이용하여인스턴스를생성하고구체적인클래스인 SqlDbAccess 클래스로형변환하는방식이권장되는방식이다. 주의 구성파일의 <database> 섹션에정의된데이터베이스연결문자열정보를읽어오기위해서는 ConfigurationManager.ConnectionStrings[ 섹션요소명 ].ConnectionString 속성을이용하면된다. 단, 섹 션요소명 은대 / 소문자를구분하므로, 정확하게기재하여야한다. 일반적인데이터액세스사용방법 FoxDbAccess 클래스및그의파생클래스들은데이터의조회 / 추가 / 수정 / 삭제에관련된작업을수행하는경 우에사용할수있는메서드들을제공한다. 조회기능 먼저, 데이터를조회하는방법부터살펴보도록하자. 데이터의조회시에사용할수있는메서드로는 ExecuteSqlDataSet 메서드와 ExecuteSpDataSet 메서드가있다. 두메서드모두반환값은 DataSet 이다. NeoDEEX Developer Guide 12

15 데이터액세스기능 중요 앞에서설명한 ExecuteSqlDataSet 메서드와 ExecuteSpDataSet 메서드모두동일한기능을수행하는메서드이다. 그렇다면, 차이점은무엇일까? ExecuteSqlDataSet 메서드의경우는 일반쿼리문 을실행하고자할때사용하는메서드이고, ExecuteSpDataSet 메서드의경우는 저장프로시저 를실행하고자할때사용하는메서드이다. 결국, 실행하려는쿼리의종류에따라각메서드를구분해서사용하면된다. 또한, 메서드를사용한이후에도메서드의이름만으로도쿼리의종류를 일반쿼리문 을사용하는지, 저장프로시저 를사용하는지를쉽게확인할수있다. 데이터처리메서드들은이와같이 ExecuteSql 로시작하는메서드와 ExecuteSp 로시작하는메서드로일관 되게명명되어있다. ExecuteSqlDataSet 메서드를사용하는경우, [ 리스트 9] 와같이간단하게코드를작성할수있다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees"; try // ExecuteSqlDataSet 메서드가실행되면, 데이터의결과가담긴 DataSet 객체가반환된다. DataSet ds = access.executesqldataset(selectstatement); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 9. ExecuteSqlDataSet 메서드의사용방법 만약, 일반쿼리문이아닌저장프로시저를실행시키는경우라면, [ 리스트 9] 에정의된 selectstatement 변수 에실행할저장프로시저명을지정한후, ExecuteSqlDataSet 메서드대신 ExecuteSpDataSet 메서드로변 경하여호출하면된다. 또한, ExecuteSqlDataSet( 또는 ExecteSpDataSet) 메서드와동일한기능을수행하는 ExecuteSql( 또는 ExecuteSp) 메서드를제공하고있다. ExecuteSql 메서드를사용하는코드는 [ 리스트 10] 와같다. // DbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees"; // DataSet 객체를생성한다. DataSet ds = new DataSet(); try // ExecuteSql 메서드는데이터의결과가포함될 DataSet 객체를인자로취한다. NeoDEEX Developer Guide 13

16 데이터액세스기능 int result = access.executesql(selectstatement, ds); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 10. ExecuteSql 메서드의사용방법 중요 ExecuteSqlDataSet( 또는 ExecuteSpDataSet) 메서드와 ExecuteSql( 또는 ExecuteSp) 메서드는동일한데이터조회기능을수행하는메서드이다. 그렇다면, NeoDEEX 에서는왜동일한기능을수행하는 2 가지의메서드를제공하고있는것일까? ExecuteSql( 또는 ExecuteSp) 메서드는다음과같은경우에사용하면효율적이기때문이다. 1. Typed DataSet 객체를사용하는경우 2. 이미생성해놓은 DataSet 객체에 DataTable 을추가하고자하는경우 3. 여러쿼리를통해단일 DataSet 객체를구성하려는경우 위와같은차이점을가지고있기때문에, 필요에따라서각메서드를구분해서사용하는것이좋다. 기본적으 로는 ExecuteSqlDataSet( 또는 ExecuteSpDataSet) 메서드를사용하는것을권장한다. 추가 / 수정 / 삭제기능 다음으로는결과집합 (Result Set) 을반환하지않는데이터의추가 / 수정 / 삭제시에사용할수있는메서드인 ExecuteSqlNonQuery( 또는 ExecuteSpNonQuery) 메서드에대해서알아보도록하자. 이는 ADO.NET 의 ExecuteNonQuery 메서드와사용방법이상당히유사하며그의대체메서드라봐도무방하다. [ 리스트 11] 은 ExecuteSqlNonQuery 메서드의사용방법을보여준다. ExecuteSqlNonQuery 메서드의반환값은 ADO.NET 의 ExecuteNonQuery 메서드와마찬가지로쿼리에의해영향을받은레코드의수가반환된다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string updatestatement = "UPDATE Employees SET Country = 'AMERICA' WHERE Country = 'USA'"; try // 데이터의추가 / 수정 / 삭제시에는 ExecuteSqlNonQuery() 메서드를사용한다. int result = access.executesqlnonquery(updatestatement); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); NeoDEEX Developer Guide 14

17 데이터액세스기능 리스트 11. ExecuteSqlNonQuery 메서드의사용방법 단일값을반환받고자하는경우는 ExecuteSqlScalar( 또는 ExecuteSpScalar) 메서드를사용하여코드를 작성하도록한다. 이는 ADO.NET 의 ExecuteScalar 메서드와사용방법이상당히유사하며그의대체메서드 라고볼수있다. [ 리스트 12] 은 ExecuteSqlScalar 메서드의사용방법을보여주고있다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement = "SELECT TOP 1 EmployeeID FROM Employees ORDER BY EmployeeID DESC"; try // 단일결과값을반환받고자하는경우에는 ExecuteSqlScalar() 메서드를사용한다. string result = access.executesqlscalar(selectstatement).tostring(); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 12. ExecuteSqlNonScalar 메서드의사용방법 마지막으로, ExecuteSqlReader( 또는 ExecuteSpReader) 메서드에대해서알아보도록하자. ExecuteSqlReader( 또는 ExecuteSpReader) 메서드는 DataReader 객체를반환받고자하는경우에사용하는메서드이며, ADO.NET 의 ExecuteReader 메서드와사용방법이상당히유사하다. [ 리스트 13] 은이메서드의사용방법을보여주고있다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees"; try // DataReader 객체를반환받고자하는경우에는 ExecuteSqlReader() 메서드를사용한다. SqlDataReader result = access.executesqlreader(selectstatement) as SqlDataReader; // 실행결과에따른로직 ( 생략 ) // DataReader 를닫는다. result.close(); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 13. ExecuteSqlReader 메서드의사용방법 지금까지설명한메서드들을간단히정리해보면, [ 표 4] 와같다. 메서드 설명 ExecuteSp 저장프로시저를사용하는경우에사용하는메서드로, 매개변수에반드시데이터 NeoDEEX Developer Guide 15

18 데이터액세스기능 가포함될 DataSet 객체가추가되어야한다. 이메서드는영향을받은행의개 수를반환한다. ExecuteSpDataSet ExecuteSpNonQuery ExecuteSpReader ExecuteSpScalar ExecuteSql ExecuteSqlDataSet ExecuteSqlNonQuery ExecuteSqlReader ExecuteSqlScalar 저장프로시저를사용하는경우에사용하는메서드로, SELECT 연산을수행하는경우에사용되는메서드이다. 이메서드는 DataSet 객체를반환한다. 저장프로시저를사용하는경우에사용하는메서드로, INSERT/UPDATE/DELETE 연산을수행하는경우에사용되는메서드이다. 이메서드는영향을받은행의개수를반환한다. 저장프로시저를사용하는경우에사용하는메서드로, DataReader 객체를반환값으로받고자할때사용하는메서드이다. 이메서드는 IDataReader 객체를반환한다. 저장프로시저를사용하는경우에사용하는메서드로, 단일값을반환값으로받고자할때사용하는메서드이다. 이메서드는 object 객체를반환한다. 일반쿼리문을사용하는경우에사용하는메서드로, 매개변수에반드시데이터가포함될 DataSet 객체가추가되어야한다. 이메서드는영향을받은행의개수를반환한다. 일반쿼리문을사용하는경우에사용하는메서드로, SELECT 연산을수행하는경우에사용되는메서드이다. 이메서드는 DataSet 객체를반환한다. 일반쿼리문을사용하는경우에사용하는메서드로, INSERT/UPDATE/DELETE 연산을수행하는경우에사용되는메서드이다. 이메서드는영향을받은행의개수를반환한다. 일반쿼리문을사용하는경우에사용하는메서드로, DataReader 객체를반환값으로받고자할때사용하는메서드이다. 이메서드는 IDataReader 객체를반환한다. 일반쿼리문을사용하는경우에사용하는메서드로, 단일값을반환값으로받고자할때사용하는메서드이다. 이메서드는 object 객체를반환한다. 표 4. FoxDbAccess 클래스및 FoxDbAccess 클래스를구현하고있는클래스에서제공하는메서드들 매개변수가있는경우의사용방법 지금까지는매개변수를사용하지않고쿼리를실행하는방법을설명하였다. 지금부터는매개변수를포함하는 쿼리를사용해야하는경우, 앞서설명한메서드들을어떻게다루어야하는지를알아보도록하겠다. 앞에서설명한모든메서드들은쿼리문에서사용할매개변수들을인자로받을수있는오버로드메서드들을 제공하고있다. 따라서, 사용할매개변수를생성한후 Execute* 메서드들의인자로넣어주기만하면된다 NeoDEEX 에서는인자로사용할수있는객체를생성하는방법으로크게 2 가지방법을제공하고있다. 첫번 째방법으로는 IEnumerable<IDataParameter> 컬렉션을생성하여사용하는것이고, 두번째방법으로는 NeoDEEX 에서제공되는클래스인 FoxDbParamCollection 을이용하여객체를생성하는것이다. 먼저, IEnumerable<IDataParameter> 컬렉션을사용하는방법부터보도록하자. IEnumerable<IDataParameter> 컬렉션을사용하는방법은 IDataParameter 인터페이스를구현하고있는 NeoDEEX Developer Guide 16

19 데이터액세스기능 객체들을사용하여 List<T> 컬렉션을생성하면된다. 예를들어, 데이터소스가 Microsoft SQL Server 인경 우라면, IDataParameter 인터페이스를구현하고있는 SqlParameter 클래스를이용하여 List<SqlParameter> 컬렉션을생성할수있다. [ 리스트 14] 는이를처리하는코드를보여주고있다. // 데이터소스가 SQL Server 인경우에는 SqlParameter 클래스를생성하여사용한다. SqlParameter param1 = new SqlParameter("@ProductID", SqlDbType.Integer); param1.value = 1; List<SqlParameter> parameters = new List<SqlParameter>( new SqlParameter[] param1 ); // 쿼리를실행한다. access.executesqlnonquery(selectstatement, parameters); 리스트 14. List<SqlParameter> 클래스를사용하는방법 다음으로는, FoxDbParamCollection 클래스를사용하는방법을알아보도록하자. FoxDbParamCollection 클래스는 FoxDbAccess 클래스와마찬가지로추상클래스이기때문에, 직접적으로객체를생성할수는없다. 그러므로, 접근하고자하는.NET 데이터공급자를위한매개변수용클래스 ( 즉, FoxDbParamCollection 에서파생된클래스 ) 를사용해야한다. FoxDbParamCollection 클래스와그의파생클래스들의관계는 [ 그림 2] 와같다. 그림 2. FoxDbParamCollection 클래스와그의파생클래스들 FoxDbParamCollection 클래스를얻기위한가장쉬운방법은 [ 리스트 15] 에서보여지는것처럼, FoxDbAccess 클래스에있는 CreateParamCollection 메서드를이용하는방법이다. CreateParamCollection 메서드를사용하여얻어진 FoxDbParamCollection 에필요한매개변수에대한정보를 Add 메서드를이용하여정의한다. FoxDbParamCollection 클래스를사용함으로써, 데이터소스에상관없이통합 (Unified) 매개변수형식을사용할수있는장점이있는반면에, 명시적으로매개변수형식을선언하지못하므로성능이약간떨어질수있다는단점을가지게된다. // DbAccess 객체를생성한다. DbAccess access = DatabaseFactory.CreateDatabase(); // DBParamCollection 객체를얻는다. FoxDbParamCollection parameters = access.createparamcollection(); parameters.addwithvalue("@parametername", DbType.String, 20, " 매개변수값 "); // 쿼리를실행한다. NeoDEEX Developer Guide 17

20 데이터액세스기능 access.executesqlnonquery(selectstatement, parameters); 리스트 15. CreateParamCollection 메서드를사용하는방법 또한, 데이터소스로 Microsoft SQL Server 를사용하는경우라면, [ 리스트 16] 과같이간단하게명시적으로 FoxSqlParamCollection 클래스를생성하여사용할수도있다. 그리고, 매개변수의개수만큼 Add 메서드를 통해필요한매개변수에대한정의를하도록한다. // 데이터소스가 SQL Server 인경우에는 SqlParamCollection 클래스를생성하여사용한다. FoxSqlParamCollection parameters = new FoxSqlParamCollection(); parameters.addwithvalue("@parametername", SqlDbType.VarChar, 20, " 매개변수값 "); // 쿼리를실행한다. access.executesqlnonquery(selectstatement, parameters); 리스트 16. FoxSqlParamCollection 클래스를사용하는방법 지금까지매개변수가필요한경우에사용할수있는방법에대해서설명하였다. 이방법들에대한장점과단 점은 [ 표 5] 와같다. 방법장점단점 IEnumerable<IDataParameter> 를사용하는방법 FoxDbParamCollection 을사용하는방법 접근하려는데이터소스의종류에따라인스턴스를생성하므로, 형변환이발생하지않는다. 사용방법을개발자가잘알고있다. ( 기존 ADO.NET 에서의매개변수선언과동일하다.) 접근하려는데이터소스의종류에따라인스턴스를생성하므로, 형변환이발생하지않는다. 매개변수의이름및형식, 값등을간편하게정의할수있다. 데이터소스에대한직접적인접근을시도하므로, 성능이가장좋다. 데이터소스의종류에따라, 적합한 IDataParameter 를사용해야한다. 매개변수가많은경우에, 각각의매개변수에대한선언및구성이필요하다. 객체생성과동시에값을지정하기가어렵다. 데이터소스의종류에따라, 적합한 FoxDbParamCollection 을사용해야한다. 표 5. 매개변수를사용하는각방법에대한장점과단점 NeoDEEX 에서는마지막으로설명한방법인 FoxDbParamCollection 클래스를이용하여매개변수를구성하는 것을권장하고있다. NeoDEEX Developer Guide 18

21 데이터액세스기능 테이블이름을매핑하는방법 앞에서도설명했듯이, 데이터를조회하는경우에사용할수있는메서드에는 ExecuteSqlDataSet( 또는 ExecuteSpDataSet) 메서드와 ExecuteSql( 또는 ExecuteSp) 메서드가있다. 그렇다면, 다중쿼리를실행하 는경우, 그얻은결과로채워지는 DataSet 객체내의 DataTable 객체의이름은어떻게정의될까? NeoDEEX 에서는기본적으로 DataTable 객체의이름을 Table 로지정하고있다. 그렇기때문에, 3 개의결과값을반환하는쿼리를실행하였을경우에, DataSet 객체내에존재하는 DataTable 객체의이름은각각 Table, Table1, Table2 가된다. 이러한명명규칙은 ADO.NET 이수행하는기본적인명명방식과동일하다. 특별한경우가아닌이상 DataTable 객체의이름을지정하거나변경할필요가없긴하지만, DataTable 객체의이름을좀더명확하게지정해야하는경우도있을수있다. 특히, Typed DataSet 을사용하는경우에는반드시테이블의이름을명시해주어야한다. 그러한경우에는 ExecuteSqlDataSet( 또는 ExecuteSpDataSet) 메서드와 ExecuteSql( 또는 ExecuteSp) 메서드에서제공하는오버로드메서드를사용해서, 반환되는 DataTable 객체의이름을명시적으로지정하면된다. [ 리스트 17] 은 DataTable 객체에이름을부여하는방법을보여주고있다. // 실행시킬쿼리문 ( 총 3 개의결과집합을반환한다.) string selectstatement = "SELECT * FROM Employees; SELECT * FROM Products; SELECT * FROM Orders"; // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // DataTable 의이름과매핑할매핑테이블이름을 string[] 로선언한다. string[] mappingname = new string[3] "Employees", "Products", "Orders" ; // ExecuteSqlDataSet 메서드를통해쿼리를실행한다. DataSet ds = access.executesqldataset(selectstatement, mappingname); 리스트 17. DataTable 객체의이름을지정하는방법 [ 리스트 17] 의코드를실행하면, 3 개의 DataTable 을갖는 DatqaSet 객체가생성되며, 각각의 DataTable 은 Employees, Products, Orders 라는이름을가지게된다. 사실이는내부적으로 ADO.NET 에의해서자 동적으로처리되는과정이다. 데이터액세스관련예외를처리하는방법 ADO.NET 을사용하는경우, 예외에대한처리를하기위해서는예외에대한일반클래스인 Exception 클래스를이용하거나, 좀더자세한예외를알기위해 Exception 클래스에서파생된클래스 ( 데이터소스가 Microsoft SQL Server 인경우에는 SqlException 클래스, ODBC 인경우에는 OdbcException 클래스등 ) 를사용해야한다. 이러한특정예외클래스들을사용하는경우에는각각의데이터소스에맞는예외클래스를선택하여사용해야한다. 즉, 어떠한데이터소스를사용하는지에따라서로다른예외클래스를사용해야한다는것이다. 하지만, NeoDEEX 를사용하는경우라면이러한예외처리를간단하게할수있다. NeoDEEX 는데이터에관 련된단일예외클래스인 FoxDbException 클래스를제공하고있다. 따라서, 접근하려는데이터소스에관계 NeoDEEX Developer Guide 19

22 데이터액세스기능 없이 FoxDbException 클래스를사용하여예외를처리하면된다. [ 리스트 18] 은 FoxDbException 클래스를사용하는방법을보여주고있다. // try 블록안에서처리하지않아도되는로직을작성한다. try // try 블록안에서처리해야하는로직을작성한다. // 데이터소스의종류에상관없이, FoxDbException 클래스를통해예외처리가가능하다. catch (FoxDbException ex) // 예외에관련된코드정보를확인하고자하는경우에사용한다. MessageBox.Show(ex.Code.ToString()); // 예외에관련된코드정보및내용을확인하고자하는경우에사용한다. MessageBox.Show(ex.Message); // 예외와관련된실제예외클래스에대한내용을확인하고자하는경우에사용한다. MessageBox.Show(ex.InnerException.ToString()); // 예외에관련된코드정보및내용과스택추적정보를확인하고자하는경우에사용한다. MessageBox.Show(ex.ToString()); 리스트 18. FoxDbException 클래스의사용방법 [ 리스트 18] 에서볼수있듯이, FoxDbException 클래스는 Code 와 Message 라는속성을제공하고있다. Code 속성을통해데이터베이스에서발생한오류코드를, Message 속성을통해오류코드및오류메시지를, 그리고 InnerException 속성을통해오류에대한실제예외 (Exception) 정보를확인할수있다. 마지막으로, ToString 메서드를통해, 예외에관련된코드정보및예외내용그리고스택추적정보의확인이가능하다. 다건의쿼리명령을실행하는방법 지금까지보여준예제에서는단일쿼리를수행하는방법을설명하고있었다. 만약, 단일쿼리를여러번실행 해야하는경우라면어떻게해야할까? ADO.NET 을이용하는경우에는, [ 리스트 19] 와같이명령을실행할 각각의 Command 객체를생성하여명령을실행해야한다 중요 기본적으로다건의쿼리를수행하려면트랜잭션환경하에서구동하도록코드를작성하는것이원칙이지만, 이번단락에서는트랜잭션개념을제외한코드예를보여주고있다. 트랜잭션과관계된부분은밑의섹션에서 설명하므로다건의쿼리수행을트랜잭션환경하에서구동하도록하는방법은그곳에서다루도록하겠다. string connectionstring = " Server=ServerName;DataBase=Northwind;UID=UserID;PWD=Password;"; SqlConnection connection = null; SqlCommand command1 = null; SqlCommand command2 = null; // SqlConnection 객체를생성한다. connection = new SqlConnection(connectionString); NeoDEEX Developer Guide 20

23 데이터액세스기능 // 데이터베이스로의연결을연다. connection.open(); try // SqlCommand 객체를생성한다. command1 = new SqlCommand("DELETE FROM Employees WHERE EmployeeID = 1", connection); // 첫번째쿼리를실행한다. command1.executenonquery(); // SqlCommand 객체를생성한다. // 이와같이실행할명령별로 Command 객체를만드는방법은 // ADO.NET 을이용하여코드를작성하는경우에권장되는패턴이다. command2 = new SqlCommand("DELETE FROM Employees WHERE EmployeeID = 2", connection); // 두번째쿼리를실행한다. command2.executenonquery(); catch (SqlException ex) MessageBox.Show(ex.ToString()); finally // 데이터베이스로의연결을닫는다. if (connection.state == ConnectionState.Open) connection.close(); 리스트 19. 여러건의쿼리를수행하는경우에작성해야하는 ADO.NET 의코드 [ 리스트 19] 에서볼수있듯이, 다중의쿼리를실행하기전에 SqlConnection 객체의 Open 메서드를통해 데이터베이스로의연결을열고, 쿼리를실행한후열린연결을닫기위해 Close 메서드를호출하도록코드를 작성해야한다. 이와같이명시적으로데이터베이스로의연결을열고닫는기능을수행하는메서드를 NeoDEEX 역시제공하 고있다. FoxDbAccess 클래스에있는 Open 메서드와 Close 메서드가그러한역할을수행하는메서드이다. [ 리스트 20] 은 NeoDEEX 를사용하여다중의쿼리를수행하는방법을설명하고있다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // Open 메서드를이용하여명시적으로 Connection 을연다. access.open(); try // 첫번째쿼리를실행한다. access.executesqlnonquery("delete FROM Employees WHERE EmployeeID = 1"); // 두번째쿼리를실행한다. access.executesqlnonquery("delete FROM Employees WHERE EmployeeID = 2"); catch (DBException ex) MessageBox.Show(ex.ToString()); finally // Close 메서드를이용하여명시적으로 Connection 을닫는다. access.close(); NeoDEEX Developer Guide 21

24 데이터액세스기능 리스트 20. 다중쿼리를수행하는경우에작성해야하는 NeoDEEX 의코드 [ 리스트 19] 에서는쿼리수만큼 SqlCommand 객체를생성하는작업과생성된 SqlCommand 객체의 Connection 속성을 SqlConnection 객체와연결시키는작업을반복해야했지만, NeoDEEX 를사용하는경우 에는그러한작업없이, [ 리스트 20] 에서볼수있는것처럼간단하게쿼리실행메서드만을정의하면된다. 또한, FoxDbAccess 클래스의 Close 메서드는내부적으로연결상태에대한검사를수행하므로, [ 리스트 19] 에서와같이 ConnectionState 에대한별도의검사를수행하는구문없이사용할수있다. 타임아웃설정방법 NeoDEEX 에서명령에대한타임아웃을설정하기위해서는 FoxDbAccess 클래스에있는 CommandTimeout 속성을사용하면된다. 타임아웃시간은초단위로설정되며, 기본적으로는 30 초로설정되어있다. [ 리스트 21] 는타임아웃을 20 초로설정하는코드이다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 타임아웃을설정한다. access.commandtimeout = 20; 리스트 21. CommandTimeout 속성을이용하여타임아웃설정하기 하지만, 명령에대한타임아웃은코드로설정하기보다는데이터베이스연결문자열에서지정하는것이바람 직하다. [ 리스트 22] 는데이터베이스연결문자열에서타임아웃을설정한예를보여주고있다. <?xml version="1.0" encoding="utf-8"?> <theone.configuration> <database defaultconnectionstring="default"> <connectionstrings> <add name="default" encrypted="false" connectionstring="data Source=.\SQLEXPRESS;AttachDbFileName= DataDirectory FoxTestDb.mdf; Integrated Security=True;User Instance=True" type="theone.data.sqlclient.foxsqldbaccess, TheOne.Data.4.0" commandtimeout="60"/> 리스트 22. 연결문자열에 CommandTimeout 설정하기 다만, [ 리스트 21] 처럼 CommandTimeout 속성을이용하는경우, FoxDbAccess 클래스를통해수행되는각 각의명령 (Command) 에대해타임아웃을쉽게설정할수있다는장점이있다. 트랜잭션의사용방법 NeoDEEX 는 Fox Transaction 을통해분산트랜잭션기법을지원할뿐만아니라 ADO.NET 이지원하는자체 적인로컬트랜잭션기능도포함하고있다. 그렇다면, 트랜잭션이필요한경우어떠한식으로트랜잭션처리를 해야하는지하나씩살펴보도록하자. NeoDEEX Developer Guide 22

25 데이터액세스기능 FoxDbAccess 클래스는기본적으로로컬트랜잭션에대한연산을제공하는메서드인 BeginTrans 메서드와 CommitTrans 메서드, 그리고 RollbackTrans 메서드도제공하고있다. 그러므로, 분산트랜잭션을사용하지않고로컬트랜잭션을사용해야하는경우라면, [ 리스트 23] 와같이이들메서드를이용하여로컬트랜잭션에대한처리를할수있다. 이방식은 ADO.NET 이제공하는트랜잭션메서드들을사용하는방식과거의동일하지만, 그사용법이현저히편리하다는장점이있다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // Open 메서드를이용하여명시적으로 Connection 을연다 ( 반드시필요!) access.open(); // 로컬트랜잭션을명시적으로시작한다. access.begintrans(); try access.executesqlnonquery("insert INTO Territories VALUES ('99998', 'Seattle', 2)"); access.executesqlnonquery("insert INTO Territories VALUES ('99999', 'Seattle', 2)"); // 정상적으로데이터연산이종료되면, CommitTrans 메서드를호출하여트랜잭션에대한처리를완료한다. access.committrans(); catch (FoxDbException ex) // 예외가발생한경우에는 RollbackTrans 메서드를호출하여, 트랜잭션을롤백시킨다. access.rollbacktrans(); finally // Close 메서드를이용하여명시적으로 Connection 을닫는다. access.close(); 리스트 23. NeoDEEX 를이용하여로컬트랜잭션을사용하는방법 NeoDEEX 를이용하는경우에는 [ 리스트 23] 에서볼수있듯이, 데이터연산의시작지점과종료지점에서 BeginTrans 메서드와 CommitTrans 메서드를사용하기만하면, 추가적으로트랜잭션에대한처리를할필요가없게된다. 예외가발생하더라도, catch 블록에서 RollbackTrans 메서드를호출하도록코드를작성해줌으로써, 트랜잭션에대한롤백처리가쉽게가능하게된다. 중요 로컬트랜잭션에관련된처리를하기위해서, BeginTrans 메서드나 CommitTrans 메서드, 그리고 RollbackTrans 메서드를사용하는경우에는 FoxDbAccess 클래스 ( 혹은그의파생클래스 ) 에있는 Open 메서드와 Close 메서드를이용하여명시적으로연결을열고, 닫아주는코드를작성해야한다. 그렇지않으면, 코드를실행하는경우에 트랜잭션이시작되지않았습니다. 와같은예외메시지를보게된다. 만약,.NET 프레임워크 2.0 부터새롭게등장한 System.Transactions 네임스페이스에있는 TransactionScope 클래스를기존의코드에서이용하고있는경우라면, [ 리스트 24] 과같이단순하게 TransactionScope 클래스를사용하도록코드를변경하기만하면된다. 이와같은경우에는명시적으로 NeoDEEX Developer Guide 23

26 데이터액세스기능 BeginTrans 메서드, CommitTrans 메서드그리고 RollbackTrans 메서드를호출하여트랜잭션을시작하지않 아도됨에주의하도록하자. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // TransactionScope 클래스를사용하여트랜잭션에관련된처리를위임한다. using (TransactionScope scope = new TransactionScope()) // Open 메서드를이용하여명시적으로 Connection 을연다. access.open(); try access.executesqlnonquery("insert INTO Territories VALUES ('99998', 'Seattle', 2)"); access.executesqlnonquery("insert INTO Territories VALUES ('99999', 'Seattle', 2)"); // 트랜잭션을완료하기위해 Complete 메서드를호출한다. scope.complete(); catch (FoxDbException ex) // 트랜잭션을종료하기위해 Dispose 메서드를호출한다. scope.dispose(); finally // Close 메서드를이용하여명시적으로 Connection 을닫는다. access.close(); 리스트 24. TransactionScope 클래스를사용하는트랜잭션처리방법 상기방식들은 ADO.NET 에서제공하는트랜잭션처리방식을 NeoDEEX 에서도거의동일한수준으로사용할수있도록지원하는형태라고보면된다. 하지만, NeoDEEX 는이러한방식외에도분산트랜잭션을위한단순하면서도효율적인방식을추가적으로제공하고있다. 그리고, 이방식이트랜잭션처리시에가장권장되는방식이기도하다. N-Tier 아키텍처상에서트랜잭션의시작및관리는업무로직서비스계층 (Business Logic Service Layer) 계층에서담당하곤하며, 이를위해서각업무마다 Business Logic 클래스를작성하는것이일반적이다. 즉, 데이터베이스에쿼리를실행하는역할을하는것이 Data Access 클래스라면, 그러한다양한 Data Access 메서드들을호출하여로직수행의중심이되는것이 Business Logic 클래스인것이다. [ 그림 3] 은 N-Tier 아키텍처에서의서버측의컴포넌트구성을보여주고있다. NeoDEEX Developer Guide 24

27 데이터액세스기능 그림 3. N-Tier 아키텍처상의서버측구성 좀더간단한구성이라면 DSL(Data Access Service Layer) 과 BSL(Business Logic Service Layer) 을하나 의계층으로구성할수도있겠지만, 상기그림은가장기본적인설계구조를추상적으로그려낸것이다. 예를들어, 제품데이터를다루는클래스가있다고가정해보자. 그리고, 그클래스안에는제품상세정보를업데이트하는메서드등이존재한다고가정해보자. 제품정보를업데이트하는메서드는여러개의쿼리를수행해야할수있으며, 그렇기에이메서드는트랜잭션환경하에서동작해야만한다. 예를들면, 위에서설명한 [ 리스트 23] 나 [ 리스트 24] 과같은코드를사용해야할것이다. 하지만, NeoDEEX 의트랜잭션기능을활용하면 [ 리스트 25] 와같이획기적으로코드를관리할수있다. [FoxTransaction] public class Product : TheOne.Transactions.FoxComponentBase private FoxDbAccess DbAccess; public void Product() DbAccess = (FoxDbAccess)FoxDatabaseFactory.CreateDatabase("Product"); [AutoComplete] public void UpdateProduct() string sql = string.empty; sql dbo.tb_products SET ProductName = ' 우산 ' WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); sql dbo.tb_products_log SET UpdateDate = getdate() WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); // 다른메서드들 NeoDEEX Developer Guide 25

28 데이터액세스기능 리스트 25. NeoDEEX 의분산트랜잭션기능을사용하는방법 단지트랜잭션이필요한메서드의상단에 [FoxAutoComplete] 라는어트리뷰트를지정하기만하면된다. 그러면, NeoDEEX 가내부적으로트랜잭션을모두관리하게되며, 개발자는쉽고안정적으로트랜잭션을적용할수있다. 다만, 클래스의선언부상단에 [TheOne.Transactions.FoxTransaction] 어트리뷰트를지정해주어야하며, 클래스가 TheOne.Transactions.FoxComponentBase 로부터상속을받아야만트랜잭션환경이올바로동작한다는것을기억해야한다. 하지만, 대부분의설계구조에서는클래스에이러한설정을해둔 BizBase 클래스를미리만들어두고, 모든업 무로직클래스가 BizBase 클래스로부터상속을받도록강제하는방식이사용된다. 다음은 BizBase 클래스의 예이다 (NeoDEEX 에는 BizBase 를위한베이스클래스도제공되기에그로부터상속을받으면된다 ). [Transaction] public class BizBase : TheOne.Transactions.FoxBizBase 리스트 26. BizBase 클래스의예 상기 BizBase 클래스를사용하도록 [ 리스트 25] 의코드를바꾸면 [ 리스트 27] 과같다. public class Product : BizBase public void Product() DbAccess = (FoxDbAccess)FoxDatabaseFactory.CreateDatabase("Product"); [FoxAutoComplete] public void UpdateProduct() string sql = string.empty; sql dbo.tb_products SET ProductName = ' 우산 ' WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); sql dbo.tb_products_log SET UpdateDate = getdate() WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); // 다른메서드들 리스트 27. BizBase 클래스를사용하도록변경한예 만일, 분산트랜잭션환경을고려하여 DSL-BSL 로설계한구조라면 [ 리스트 27] 의코드에서쿼리를수행하는부분은 DSL 계층의 DAC(Data Access Component) 클래스로분리하는것이나을것이다. 분산트랜잭션에대해서는이문서뒤쪽에서자세하게설명하고있지만, 여기서코딩패턴을간략하게보여주면다음과같다. [ 리스트 28] 은데이터베이스쿼리수행부분을 DAC 으로분리한예를보여준다. [FoxTransaction] NeoDEEX Developer Guide 26

29 데이터액세스기능 public class ProductDac : TheOne.Transactions.FoxDacBase public ProductDac() DbAccess = (FoxSqlDbAccess)FoxDatabaseFactory.CreateDatabase("Default"); [FoxAutoComplete] public void UpdateProduct() string sql = string.empty; sql dbo.tb_products SET ProductName = ' 우산 ' WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); [AutoComplete] public void UpdateProductLog() string sql dbo.tb_products_log SET UpdateDate = getdate() WHERE ProductID = (SELECT MAX(ProductID) FROM dbo.tb_products) "; DbAccess.ExecuteSqlNonQuery(sql); 리스트 28. 쿼리수행부분을 Dac 클래스로분리한예 DAC 클래스의메서드들도트랜잭션에합류하게되기에, 각메서드의상단에는 [AutoComplete] 어트리뷰트를지정해주어야하며, 클래스의상단에도 [TheOne.Transactions.Transaction] 어트리뷰트를지정해주어야함에주의하자. 이렇게 DAC 클래스를구성하였다면, 이제 Biz 클래스는 [ 리스트 29] 와같이간단해질수있다. public class Product : BizBase [FoxAutoComplete] public void UpdateProduct() ProductDac dac = new ProductDac(); dac.updateproduct(); //throw new Exception(" 트랜잭션테스트용에러 "); dac.updateproductlog(); // 다른메서드들 리스트 29. DAC 클래스를호출하는 Product 업무로직클래스 2-Teir 구조의애플리케이션이라면 [ 리스트 27] 의코드와같은방식이권장되며, N-tier 구조의애플리케이션 이라면 [ 리스트 29] 과같은코드구조가권장된다. N-Tier 구조의애플리케이션에서의분산트랜잭션방안에 대해서는하단의 트랜잭션및컴포넌트서비스 섹션을참고하도록하자. 이식성 VS 성능 이식성 (Portability) 이란 대대적인개정없이도, 하나이상의운영체계에서사용될수있는지의여부를나타내 는컴퓨터프로그램의특성 이라말할수있다. 그렇다면, 이식성의측면에서코드를작성하는방법에대해서 알아보도록하자. NeoDEEX Developer Guide 27

30 데이터액세스기능 먼저, 일반적인 ADO.NET 을이용하여데이터소스에접근하는코드가작성되어있다고생각해보자. 접근하고있는데이터소스가 Microsoft SQL Server 인경우에는 SqlConnection 클래스와 SqlCommand 클래스를기본적으로사용하며, 필요에의해서는 SqlDataAdapter 클래스및 SqlDataReader 클래스를추가하여코드를작성하게된다. 하지만, Microsoft SQL Server 대신에 Oracle 을데이터소스로서사용해야하는특수한상황이발생되었다고가정해보자. 그렇다면, 기존에작성된연결및명령에관련된클래스들 (SqlConnection 및 SqlCommand) 은사용하지못할것이며, 데이터소스인 Oracle 에적합한다른클래스들 (OracleConnection 및 OracleCommand) 로코드를대체해야할것이다. 이러한경우, 이식성이좋지않다라고말할수있다. 이에반해, 단일 API 를통해다양한.NET 데이터소스에접근할수있는 FoxDbAccess 클래스를사용하는 코드의경우에는이식성이좋다라고말할수있다. 이식성이좋은코드를만들기위해서는 [ 리스트 30] 와같이코드를작성해야한다. // FoxDbAccess 객체를생성한다. FoxDbAccess access = FoxDatabaseFactory.CreateDatabase(); // 일반쿼리문을정의한다. string selectstatement = "SELECT EmployeeID, LastName FROM Employees"; try // ExecuteSqlDataSet 메서드를사용한다. DataSet ds = access.executesqldataset(selectstatement); catch (FoxBException ex) MessageBox.Show(ex.ToString()); 리스트 30. 이식성의측면을고려한코드작성방법 [ 리스트 30] 와같이작성한코드는접근하려는데이터소스가변경되는경우라도쿼리문을제외하고는거의모든코드를변경할필요가없다 ( 이후설명한 Fox Query 를사용하면심지어코드재컴파일을하지않고도쿼리변경이가능하다 ). 하지만, 접근하려는데이터소스에대한정의가명시적이지않으며, 매개변수가사용되는경우에는내부적으로형변환이발생하기때문에몇몇경우에서는성능이떨어지게된다. 이식성과성능사이에는트레이드오프가존재한다. 즉, 이식성을높이고자한다면성능이약간떨어지게되고, 성능을극대화하는코드는이식성을떨어뜨리게된다는것이다. 그렇기에, 둘사이에서우선적으로고려해야할사항이어떤것인지상황에맞게파악하여적용하는것이바람직하다. 일반적으로데이터소스가변경되는경우는흔치않기에, 성능에최적화된코드를작성하는쪽이우선시되곤한다. 이제, 성능적인측면을고려한코드작성방법에대해알아보도록하자. 성능적인측면을고려하는경우에는접근하려는데이터소스에특화된 FoxDbAccess 의파생클래스를사용하는것이최선이다. 또한, 매개변수를사용하는경우에는매개변수형식을접근하려는데이터소스에맞게끔구성해야한다. 데이터소스가 Microsoft SQL Server 인경우, 성능적인측면을고려한코드작성방법은 [ 리스트 31] 와같다. 이와같은경우, 코드를작성하는양이증가하기때문에개발생산성은약간낮아질수있지만크게우려할수준은아니다. // FoxSqlDbAccess 객체를생성한다. FoxSqlDbAccess access = (FoxSqlDbAccess)DatabaseFactory.CreateDatabase(); NeoDEEX Developer Guide 28

31 데이터액세스기능 // 일반쿼리문을정의한다. string selectstatement = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees WHERE TitleOfCourtesy AND Country // FoxSqlParamCollection 클래스를정의한다. FoxSqlParamCollection parameters = new FoxSqlParamCollection(); // 매개변수의데이터형식도명시적으로 SqlDbType 을사용하여정의한다. parameters.add("@titleofcourtesy", SqlDbType.NVarChar, 25, "Mr."); parameters.add("@country", SqlDbType.NVarChar, 15, "UK"); try // FoxSqlParamCollection 클래스를인자로허용하는 ExecuteSqlDataSet 메서드를사용한다. DataSet ds = access.executesqldataset(selectstatement, parameters); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); 리스트 31. 성능적인측면을고려한코드작성방법 NEODEEX 에서권장되는데이터액세스코드작성방법 NeoDEEX 를사용하여데이터액세스에관련한코드를작성하는경우에권장되는사항은다음과같다. 데이터액세스에관련된추상클래스인 FoxDbAccess 클래스를사용하도록한다. 하지만, 접근하려는데이터 소스가특정저장소로지정된경우에는 FoxDbAccess 클래스의파생클래스 ( 예, FoxSqlDbAccess) 를사용하 도록한다. 매개변수를사용해야하는경우에는, FoxDbParamCollection 클래스를사용하여매개변수를정의하도록한다. 하지만, 접근하려는데이터소스가특정저장소로지정된경우에는 FoxDbParamCollection 클래스의파생클 래스 ( 예, FoxSqlParamCollection) 를사용하도록한다. 다건의쿼리를사용하는경우에는 Open 메서드와 Close 메서드를사용하도록한다. 예를들어, 매개변수를사용하는단건쿼리를작성하는경우에권장되는코드는 [ 리스트 32] 과같다. // FoxSqlDbAccess 객체를생성한다. FoxSqlDbAccess access = (FoxSqlDbAccess)DatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees WHERE Country // FoxSqlParamCollection 클래스를생성한다. FoxSqlParamCollection parameters = new FoxSqlParamCollection(); parameters.add("@country", SqlDbType.VarChar, 15, "UK"); try // FoxSqlParamCollection 클래스를인자로허용하는 ExecuteSqlDataSet 메서드를사용한다. DataSet ds = access.executesqldataset(selectstatement, parameters); catch (FoxDbException ex) NeoDEEX Developer Guide 29

32 Fox Query 기능 MessageBox.Show(ex.ToString()); 리스트 32. 단건쿼리인경우에권장되는코드 [ 리스트 33] 은매개변수를사용하는다건쿼리를작성하는경우에권장되는코드를보여주고있다. // FoxSqlDbAccess 객체를생성한다. FoxSqlDbAccess access = (FoxSqlDbAccess)DatabaseFactory.CreateDatabase(); // 일반쿼리문정의 string selectstatement1 = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees WHERE TitleOfCourtesy string selectstatement2 = "SELECT EmployeeID, LastName, FirstName, Title, City, Region FROM Employees WHERE Country // FoxSqlParamCollection 클래스를생성한다. FoxSqlParamCollection parameters1 = new FoxSqlParamCollection(); parameters1.add("@titleofcourtesy", SqlDbType.VarChar, 25, "Mr."); FoxSqlParamCollection parameters2 = new FoxSqlParamCollection(); parameters2.add("@country", SqlDbType.VarChar, 15, "UK"); // Open 메서드를이용하여명시적으로 Connection 을연다. access.open(); try // FoxSqlParamCollection 클래스를인자로허용하는 ExecuteSqlDataSet 메서드를사용한다. DataSet ds1 = access.executesqldataset(selectstatement1, parameters1); DataSet ds2 = access.executesqldataset(selectstatement2, parameters2); catch (FoxDbException ex) MessageBox.Show(ex.ToString()); finally // Close 메서드를이용하여명시적으로 Connection 을닫는다. access.close(); 리스트 33. 다건쿼리인경우에권장되는코드 Fox Query 기능 Fox Query 는 SQL 쿼리문장및매개변수정보를 XML 파일 (foxml) 에저장해두고런타임이사용할수있도 록하는기능이다. 대중적인오픈소스프레임워크인 ibatis 의데이터처리기법과유사하기에, 기존에 ibatis 를경험해본개발자라면별도의학습비용없이 Fox Query 에익숙해질수있다. Foxml 및 QueryMapper Fox Query 는 ibatis 와유사한스키마를가지며, 수작업편집이가능한 XML 스키마를사용한다. 또한, Visual Studio 의인텔리센스기능을지원하기에보다효율적으로쿼리를작성하고관리할수있다는이점도 갖는다. Fox Query 에서사용하는쿼리용 xml 파일을 foxml 이라고부르는데, 개발자는 foxml 파일안에규 NeoDEEX Developer Guide 30

33 Fox Query 기능 칙에맞게쿼리를작성하면 Fox Query 엔진을통해서, 개발시에이를쉽게사용할수가있게된다. [ 리스트 54] 은 foxml 파일의예를보여주고있다. <?xml version="1.0" encoding="utf-8"?> <querymap xmlns=" <alias /> <statements> <statement id="select_01"> <text> SELECT * FROM UnitTest_Products </text> </statement> <statement id="select_02"> <text> SELECT * FROM UnitTest_Products WHERE ProductName = #ProductName# OR ProductID = #ProductID# </text> <parameters> <parameter name="productname" property="name" dbtype="varchar" size="40" direction="input" /> <parameter name="productid" property="id" dbtype="int" direction="input"/> </parameters> </statement> </statements> </querymap> 리스트 34. Foxml 의예 쿼리를 XML 로작성하는규칙은매우간단하다. 최상위노드는 <querymap> 으로시작해야하며, 각쿼리는 <statement> 노드안에 <text> 안쪽에작성하면된다. 매개변수를지정해야하는경우, 쿼리구문에서는 # 매개변수명 # 의형태로매개변수에대한위치지정자를작성한다. 그리고, 그매개변수에대한구체적인설정을각각 <parameter> 로지정해야하는데, name 은쿼리에사용된위치지정자의이름 ( 즉, # 매개변수명 #) 을의미하며, property 는코드에서사용되는매개변수개체의속성명이나컬럼명을지정하면된다. 만일, property 의값과 name 의값이동일하다면 property 속성은설정하지않아도무방하다. [ 그림 4] 은 foxml 에서 statement 의구성을영역별로설명하고있다. NeoDEEX Developer Guide 31

34 Fox Query 기능 그림 4. foxml 의구성 각쿼리를의미하는 statement 에서가장중요한것은 statement 의 id 인데, 이값은 foxml 파일안에서고유한값을지정해야한다. 실제개발코드에서는 id 값을이용하여쿼리를식별하기때문이다. [ 리스트 34] 은 SELECT_01 과 SELECT_02 라는 2 개의쿼리를갖는 foxml 파일을보여주고있다. SELECT_01 은매개변수가없는단순셀렉트쿼리임, SELECT_02 는 2 개의매개변수를갖는셀렉트쿼리이다. 만일, 이러한 foxml 파일을 Product.foxml 이라고명명하였다고가정해보자. 이러한 foxml 파일을프로젝트 에서사용하려면우선구성파일에이러한 foxml 파일을사용하겠다고설정해주어야한다. [ 리스트 35] 는구 성설정파일에현재프로젝트에서 Product.foxml 을사용한다는것을설정하는예이다. <?xml version="1.0" encoding="utf-8"?> <theone.configuration xmlns=" <database> <connectionstrings> <add name="sql" connectionstring="server=foxtest;database=foxtest;uid=foxuser;pwd=*****;" type="theone.data.sqlclient.foxsqldbaccess, TheOne.Data.4.0, Version= , Culture=neutral, PublicKeyToken= a3cc10e00" querymapper="sqlmap"/> </connectionstrings> <querymappers> <querymapper name="sqlmap"> <querymaps> <files> <file path="query/sql/product.foxml" /> <file path="query/sql/sales.foxml" /> </files> </querymaps> </querymapper> </querymappers> </database> </theone.configuration> 리스트 35. 구성파일에 querymapper 를설정하는예 NeoDEEX Developer Guide 32

35 Fox Query 기능 NeoDEEX 에서는각각의 querymapper 의설정을통해서다양한 foxml 파일을그룹지어사용할수있다. [ 리 스트 35] 는 SqlMap 이라는이름의 querymapper 를설정하고있으며, 이쿼리매퍼는 Product.foxml 과 Sales.foxml 파일을사용하도록설정하고있다. Foxml 관련 API 의사용 사용할 foxml 파일을준비했고, 구성설정파일에 foxml 파일을연결시켜두었다면소스코드에서는 [ 리스트 36] 과같은식으로쿼리를호출하여결과집합을얻어올수있다. FoxSqlDbAccess DbAccess = new FoxSqlDbAccess(ConnectionString, "SqlMap"); DataSet ds = DbAccess.ExecuteQueryDataSet("Product.SELECT_01"); datagridview1.datasource = ds.tables[0]; 리스트 36. ExecuteQueryDataSet 메서드의사용 FoxSqlDbAccess 클래스생성자의 2 번째인자로 querymapper 의이름을지정하면, 코드에서 foxml 의쿼 리를사용할준비가된것이다. 이미앞서구성파일에서 SqlMap 이라는쿼리매퍼를설정해두었기에 [ 리스 트 36 ] 에서도 SqlMap 이란매퍼명을지정하고있다. foxml 파일안에들어있는쿼리를실제로호출하려면 FoxDbAccess 의 ExecuteQueryDataSet 메서드 (DataSet 을반환하는경우 ) 를호출하면서인자로 foxml 파일명과쿼리의 id 를조합한문자열을지정하면된다. [ 리스트 36] 은 Product.foxml 파일의 SELECT_01 쿼리를호출하는것이기에 Product.SELECT_01 이라는문자열을지정하였다. 매개변수를지정해야하는경우에는 [ 리스트 56] 과같이 Dictionary 형식으로매개변수를지정한다음, ExecuteQueryDataSet 메서드에두번째인자로그를설정하면된다. FoxSqlDbAccess DbAccess = new FoxSqlDbAccess(ConnectionString, "SqlMap"); //datarow, poco, dictionary Dictionary<string, object> dictionary = new Dictionary<string, object>(); dictionary.add("id", 1); dictionary.add("name", "Tofu"); DataSet ds = DbAccess.ExecuteQueryDataSet("Product.SELECT_02", dictionary); datagridview1.datasource = ds.tables[0]; 리스트 37. 매개변수설정 매개변수의이름은 foxml 파일에서 <parameter> 의 property 에정의한명칭과동일한명칭을사용해야함 에주의하자. 매개변수로사용할수있는형식으로는 Dictionary 뿐만아니라 POCO(Plain Old CLR Object) 및 DataRow 형식을사용할수있다. [ 리스트 58] 는 POCO 형식을사용하는예를보여주고있다. FoxSqlDbAccess DbAccess = new FoxSqlDbAccess(ConnectionString, "SqlMap"); Querydata p = new Querydata(); p.id = 1; p.name = "Tofu"; NeoDEEX Developer Guide 33

36 Fox Query 기능 DataSet ds = DbAccess.ExecuteQueryDataSet("Product.SELECT_02", p); datagridview1.datasource = ds.tables[0]; 리스트 38. 매개변수로 POCO 형식사용하기 Foxml 을지원하는 API 메서드로는 ExecuteQueryDataSet 메서드외에도다양한메서드가존재한다. FoxDbAccess 가데이터베이스관련처리를수행하기위해서제공하는 ExecuteSql* 및 ExecuteSp* 메서드와마찬가지로 foxml 을지원하기위해서도동일역할의메서드집합인 ExecuteQuery* 시리즈를제공한다. 예를들면, 그목록은다음과같다. DbAccess.ExecuteQueryDataSet DbAccess.ExecuteQueryList<T> DbAccess.ExecuteQueryNonQuery DbAccess.ExecuteQueryReader DbAccess.ExecuteQueryScalar ExecuteSql* 시리즈및 ExecuteSp* 시리즈와는달리 foxml 를사용하는경우에는 ExecuteQueryList<T> 메서드가추가적으로제공되는데, 이는쿼리의결과를엔터티클래스의목록즉, List<T> 형식으로반환해주는메서드이다. [ 리스트 39] 은 ExecuteQueryList<T> 메서드의사용예를보여주고있다. 단, 이코드가올바로동작하려면관련테이블스키마와동일한구성을갖는 Product 라는엔터티클래스가존재하고있어야한다. FoxSqlDbAccess DbAccess = new FoxSqlDbAccess(ConnectionString, "SqlMap"); List<Product> results = DbAccess.ExecuteQueryList<Product>("Product.SELECT_01"); datagridview1.datasource = results; 리스트 39. ExecuteQueryList<T> 메서드의사용예 Foxml 은인라인쿼리뿐만아니라저장프로시저도지원을한다. 만일, 저장프로시저를사용하고싶다면 <statement> 노드대신 <procedure> 노드를사용하면된다. 저장프로시저이름은 <text> 영역에지정 하면되고, 매개변수는기존과동일하게 <parameters> 에지정하면된다. <statement> 노드대신 <procedure> 를사용한다는부분을제외하면그외의사항은인라인쿼리를사용 하는경우와동일하다. [ 리스트 40] 는프로시저를사용하는에를보여준다. <?xml version="1.0" encoding="utf-8"?> <querymap xmlns=" <alias /> <statements> <statement id="select_01"> <text> SELECT * FROM UnitTest_Products </text> </statement> <statement id="select_02"> <text> NeoDEEX Developer Guide 34

37 Fox Query 기능 SELECT * FROM UnitTest_Products WHERE ProductName = #ProductName# OR ProductID = #ProductID# </text> <parameters> <parameter name="productname" property="name" dbtype="varchar" size="40" direction="input" /> <parameter name="productid" property="id" dbtype="int" direction="input"/> </parameters> </statement> <procedure id="up_getproductdata"> <text> [UTP_GetProductsWithParameter] </text> <parameters> <parameter name="productid" dbtype="int" direction="input"/> </parameters> </procedure> </querymap> 리스트 40. Foxml 에저장프로시저사용하기 프로시저를코드에서호출하는방법은기존과동일하다. 인자로 foxml 파일명과쿼리의 id 를조합한문자열을지정하면된다. Product.foxml 파일의 UP_GetProductData 프로시저를호출하는것이기에 Product. UP_GetProductData 이라는문자열을지정하면된다. [ 리스트 41] 은저장프로시저를호출하는코드예를보여준다 ( 그러면내부적으로는 UTP_GetProductsWithParameter 라는프로시저를실행하게된다 ). FoxSqlDbAccess DbAccess = new FoxSqlDbAccess(ConnectionString, "SqlMap"); Dictionary<string, object> dictionary = new Dictionary<string, object>(); dictionary.add("productid", 1); DataSet ds = DbAccess.ExecuteQueryDataSet("Product.UP_GetProductData", dictionary); datagridview1.datasource = ds.tables[0]; 리스트 41. ExecuteQueryDataSet 메서드에저장프로시저사용하기 Fox Query 편집기 NeoDEEX 는 Foxml 전용편집 UI 를통해서보다쉽게쿼리및데이터클래스를작성할수있도록돕는 Fox Query 편집기도지원하고있다. 개발자가데이터처리코드작성에는신경을쓰지않고, 오직쿼리를작성하고검증하는업무에만집중할수있도록, 쿼리작성및편집그리고관련데이터처리클래스작성을자동으로구성해주는 Fox Query 편집기가제공되기에, XML 을직접편집하는것에어려움을느끼는개발자들은 UI 도구를통해서쿼리작업을수행할수있다. Fox Query 편집기는 Visual Studio 에통합된 Foxml 전용디자이너로서 ( 독립실행애플리케이션으로서구동할수도있다 ), 직관적인 UI 를제공하며개발자의쿼리작성능력을향상시킬수있게한다. 그뿐만아니라, UI 에서작업한쿼리를 Fox Query 용 xml 즉, foxml 파일로바꾸어주며, 데이터처리용 C# 소스코드까지생성해주는역할도하기에, 개발자가쿼리만잘작성해놓으면데이터처리와관련된모든코드를손쉽게만들어낼수있다는큰장점을갖는다. [ 그림 5] 는 Fox Query 편집기의 UI 를보여준다. NeoDEEX Developer Guide 35

38 Fox Query 기능 그림 5. Fox Query 편집기 Fox Query 편집기는매우직관적인 UI 를제공하고있는데, 좌측은쿼리들의목록을나열해서보여주며, 우측 상단에는실제작성된쿼리를확인하고편집할수있는 UI, 우측하단은쿼리에서매개변수를사용할경우, 매개변수를추출및변경할수있도록하는 UI 이다. 또한, 상단의툴바를통해서목표데이터베이스로의접속, 쿼리실행, 매개변수자동추출, 데이터액세스클 래스자동생성등의기능을수행할수있다. [ 리스트 40] 에서작성된 Product.foxml 을비주얼스튜디오에서열어보도록하자 ( 편집기가자동으로연결및 수행되려면 NeoDEEX 도구가이미설치되어있어야한다 ). 그러면, [ 그림 6] 과같이기존의 foxml 쿼리들이 편집기의쿼리목록영역에출력되는것을확인할수있다. 그림 6. Product.foxml 의편집 UI NeoDEEX Developer Guide 36

39 Fox Query 기능 도구를사용하여새로운쿼리를추가하거나, 쿼리를수행할수있으며, 이러한쿼리를사용하는데이터처리 클래스도동적으로생성할수있다. 쿼리실행및매개변수설정 쿼리를수행하는방법은도구상단의녹색플레이버튼을클릭하면되며, 만일매개변수가포함된쿼리 ( 예, SELECT_02) 를실행할경우에는매개변수대화상자가나타나서, 매개변수의값을직접입력하여쿼리를수행 할수있게한다. [ 그림 7] 은매개변수대화상자에값을입력하여쿼리를수행하는모습을보여준다. 그림 7. Fox Query 편집기를통한쿼리수행테스트 NeoDEEX Developer Guide 37

40 Fox Query 기능 쿼리자동생성 또한, Fox Query 편집기는복잡한테이블에대한 CRUD 쿼리생성을돕기위해서, DB 테이블및저장프로시저로부터쿼리및매개변수자동으로추출, 생성해주는기능도지원한다. 비주얼스튜디오의서버탐색기를통해연결된데이터베이스창에서특정테이블을 Fox Query 편집기로드래그앤드롭을하면 [ 그림 8] 과같이 CRUD 쿼리중하나를자동으로생성해주는기능을사용할수있다. 그림 8. 테이블에서드래그앤드롭으로 CRUD 쿼리자동생성 이기능은컬럼이많은테이블이나매개변수가많은프로시저를사용하는경우, 대단히유용하다. 매개변수자동추출 또한, Fox Query 편집기는외부쿼리편집기에서작성및테스트한쿼리에서쉽게매개변수를추출할수있는쿼리추출도구도제공한다. 일반적으로쿼리를테스트하는경우에는조건에해당하는테스트값을직접입력하여올바른결과가나오는지를확인하곤한다. 쿼리추출도구는이러한테스트값을매개변수로바꾸어주는기능을제공하기에, 개발시에많은시간을소요하는매개변수추출작업을쉽게처리할수있게한다. [ 그림 9] 는테스트쿼리 ( 상단 ) 에서매개변수를추출하여작성된쿼리 ( 중간 ) 및추출매개변수목록 ( 하단 ) 으로구성해주는쿼리추출도구의예이다. NeoDEEX Developer Guide 38

41 Fox Query 기능 그림 9. 쿼리추출도구 그리고, [ 그림 10] 은외부편집기에서쿼리를작성및테스트하고, 그쿼리를 Fox Query 의쿼리추출도구로 가져와서매개변수추출및 foxml 로구성하는과정을도식화하여보여주고있다. NeoDEEX Developer Guide 39

42 Fox Query 기능 그림 10. 외부쿼리에서매개변수추출및쿼리구성 탭을통한다양한뷰를지원 편집기의하단에는총 4 종류의뷰가제공된다. 첫번째뷰는쿼리를편집하고매개변수를지정할수있는디자인뷰이고, 두번째뷰는현재의 foxml 을보여주는 XML 뷰이고, 세번째는쿼리를실행할경우결과를보여주는 Result 뷰이다. 4 번째뷰는단독실행애플리케이션인경우에만보여지는소스코드뷰이며, 데이터처리클래스의 C# 코드를보여준다. 이하의그림들은각각의뷰의모습을보여준다. NeoDEEX Developer Guide 40

43 Fox Query 기능 그림 11. Fox Query 편집기의디자인뷰 그림 12. Fox Query 편집기의 XML 뷰 NeoDEEX Developer Guide 41

44 Fox Query 기능 그림 13. Fox Query 편집기의쿼리결과 그림 14. Fox Query 편집기의코드뷰 소스코드자동생성 쿼리작업이완료된뒤, 저장버튼을클릭하면데이터처리클래스가자동생성되는데, 상단의콤보박스에서 [Use Plain NeoDEEX Class] 를선택하느냐, [Use FoxQuery] 를선택하느냐에따라생성되는클래스의코드가 달라진다. NeoDEEX Developer Guide 42

45 Fox Query 기능 [Use Plain NeoDEEX Class] 을선택하는경우에는 foxml 을전혀사용하지않고모든쿼리를인라인쿼리로적용하며 ExecuteSql* 혹은 ExecuteSp* 과같은 Fox Data Access 의 API 를호출하는 Dac 클래스가생성되며, [Use FoxQuery] 를선택하는경우에는 foxml 파일을사용하여 ExecuteQuery* 시리즈의메서드를호출하는 Dac 클래스가생성된다. [ 그림 15] 은 [Use Plain NeoDEEX Class] 을선택한경우에자동생성된 Dac 클래스이고, [ 그림 16] 은 [Use FoxQuery] 를선택한경우에자동생성된 Dac 클래스이다. 그림 15. [Use Plain NeoDEEX Class] 을선택한경우에자동생성된 Dac 클래스 NeoDEEX Developer Guide 43

46 Fox Query 기능 그림 16. [Use FoxQuery] 을선택한경우에자동생성된 Dac 클래스 [ 그림 17] 은좀더직관적으로두옵션의차이를비교한그림이다. 그림 17. 코드생성옵션의차이 NeoDEEX Developer Guide 44

47 트랜잭션및컴포넌트서비스기능 트랜잭션및컴포넌트서비스기능 NeoDEEX 는어플리케이션의트랜잭션처리를위한트랜잭션프레임워크와이트랜잭션프레임워크를바탕으로서버측비즈니스로직컴포넌트및데이터액세스컴포넌트를위한베이스클래스를제공한다. NeoDEEX 의트랜잭션프레임워크와컴포넌트베이스클래스는 TheOne.Transactions 네임스페이스를통해제공하기때문에트랜잭션및컴포넌트베이스클래스를통틀어 Fox Transactions 혹은 TheOne.Transactions 라고부른다 (2.X 버전에서는 TheOne.Transactions 라고불리웠으나 4.0 에서는코드네임에의한명명법변경으로 Fox Transactions 라고재명명되었다 ). 이섹션에서는 Fox Transaction 에서제공하는트랜잭션및컴포넌트서비스의장점과사용방법을구체적으로설명할것이다. 트랜잭션개요 트랜잭션이라함은 ACID(Atomicity, Consistency, Isolation, Durability) 규칙을만족하는논리적인작업을 말한다. 트랜잭션처리를위해닷넷프레임워크에서사용가능한트랜잭션프레임워크는 ADO.NET 로컬트랜 잭션, COM+, System.Transactions 를생각해볼수있다. 로컬트랜잭션 vs. 분산트랜잭션 ADO.NET 로컬트랜잭션은단일데이터베이스에대해단일연결 (connection) 상에서트랜잭션을처리하는것을말한다. 로컬트랜잭션은분산트랜잭션 (distributed transaction) 에비해성능이우수하다는장점이있지만, 단일트랜잭션자원 ( 데이터베이스 ) 에대해서만트랜잭션을사용할수있으며 2 개이상의컴포넌트상에서로컬트랜잭션을사용하기위해서는연결객체 (connection object) 와트랜잭션객체를이들컴포넌트상에서공유해야한다는단점이있다 ( 이렇게할경우, 코드의복잡성이크게증가한다 ). 또한로컬트랜잭션은다계층분산어플리케이션의컴포넌트아키텍처와는궁합이잘맞지않는다. 데이터액세스컴포넌트는다른컴포넌트로부터독립적이어야하며트랜잭션을새로시작하거나기존트랜잭션에참여 (enlist) 할수있어야하는데, 로컬트랜잭션으로이러한컴포넌트를구현하기위해서는항상매개변수나다른방법을통해호출자컴포넌트에의해이미시작된트랜잭션객체에접근할수있어야하거나새로운트랜잭션을시작해야만하기때문이다. [ 리스트 42] 는로컬트랜잭션을사용하는전통적인데이터액세스컴포넌트의메서드구현을보여주고있다. 이메서드는매개변수로트랜잭션객체를받고있으며호출자가이미트랜잭션을시작한경우와그렇지않은경우를구별하여기존트랜잭션내에서데이터액세스를수행하거나새로운연결로서트랜잭션을시작하기도한다. 이처럼로컬트랜잭션을사용하여컴포넌트기반의데이터액세스모듈을만들기위해서는많은주의를기울여야하며, 복잡한코드가필요하게된다. public void Change(SqlTransaction tx, int productid, int amount) string query = "UPDATE StockTable SET Units = Units WHERE ProductId SqlCommand cmd; SqlConnection conn = null; SqlTransaction newtx = null; // transaction-sensitive execution if (tx == null) // 호출자가트랜잭션을시작하지않은경우 conn = DatabaseUtil.GetConnection(); cmd = new SqlCommand(query, conn); conn.open(); NeoDEEX Developer Guide 45

48 트랜잭션및컴포넌트서비스기능 newtx = conn.begintransaction(); cmd.transaction = newtx; else // 호출자가이미트랜잭션을시작한경우 cmd = new SqlCommand(query, tx.connection, tx); cmd.parameters.add("@pid", SqlDbType.Int, 4).Value = productid; cmd.parameters.add("@amount", SqlDbType.Int, 4).Value = amount; try cmd.executenonquery(); if (newtx!= null) newtx.commit(); catch if (newtx!= null) newtx.rollback(); throw; finally if (conn!= null) conn.close(); 리스트 42. 로컬트랜잭션을사용하는데이터액세스컴포넌트의메서드예제 반면, 분산트랜잭션은다수의트랜잭션자원에대해서, 혹은단일트랜잭션자원에대해서 2 개이상의연결을사용하더라도단일트랜잭션으로묶을수있기때문에컴포넌트기반아키텍처에잘맞는트랜잭션모델이라할수있다. [ 리스트 43] 은 Fox Transactions 를사용하여트랜잭션을사용하는데이터액세스컴포넌트의메서드구현을보여주고있다. 이메서드는 Transaction 특성과 AutoComplete 특성을추가하여자동으로분산트랜잭션을처리하게되며, 트랜잭션개체를전달받지않을뿐만아니라별도로트랜잭션의시작여부를체크하지도않기때문에트랜잭션의제어가쉬우며작성해야할코드의양또한확연히줄어들게된다. [FoxTransaction(FoxTransactionOption.Required)] public class StockDAC : TheOne.Transactions.DacBase [FoxAutoComplete] public void Change(int productid, int amount) string query = "UPDATE StockTable SET Units = Units WHERE ProductId FoxSqlParamCollection paras = (FoxSqlParamCollection)DbAccess.CreateParamCollection(); paras.addwithvalue("@unit", SqlDbType.Int, amount); paras.addwithvalue("@id", SqlDbType.Int, productid); this.dbaccess.executesqlnonquery(query, paras); 리스트 43. NeoDEEX 트랜잭션프레임워크를이용한데이터액세스예제 다수의트랜잭션주체와트랜잭션자원이참여하는트랜잭션을분산트랜잭션이라말한다. [ 그림 18] 은하나의트랜잭션루트가서로다른트랜잭션컴포넌트를호출하며각컴포넌트는자신의 Connection 을통하여하나의데이터베이스를액세스한다. 하나의데이터베이스에액세스하더라도서로다른컴포넌트가서로다른데이터베이스을통해데이터베이스에액세스하므로분산트랜잭션으로처리된다. NeoDEEX Developer Guide 46

49 트랜잭션및컴포넌트서비스기능 Transaction Boundary Transaction Component DB access with own connection Client Transaction Initiator (Tx Root) Database Transaction Component DB access with own connection 그림 18. 다수의컴포넌트가하나의 DB 를액세스 [ 그림 19] 는하나의컴포넌트가다수의데이터베이스를액세스하는경우로서데이터베이스가서로다르므로 ( 데이터베이스가다르기때문에당연히서로다른데이터베이스연결을사용한다 ) 이또한분산트랜잭션으로 처리된다. Transaction Boundary Client Transaction Component DB access with own connection DB access with own connection Database #1 Database #2 그림 19. 하나의컴포넌트가다수의 DB 를액세스 [ 그림 20] 는단일컴포넌트가여러개의커넥션을사용하여단일데이터베이스를액세스하는경우이다. 이는 로컬트랜잭션으로생각할수도있지만서로다른데이터베이스연결을통해하나의데이터베이스를액세스 하기때문에분산트랜잭션으로처리된다. NeoDEEX Developer Guide 47

50 트랜잭션및컴포넌트서비스기능 Transaction Boundary Client Transaction Component DB access with own connection DB access with own connection Database #1 그림 20. 하나의컴포넌트가서로다른 Connection 으로하나의 DB 를액세스 앞에서설명한것처럼분산트랜잭션은네트워크상에서서로분리된서버들을하나의트랜잭션으로구성이 가능하며또한독립적인컴포넌트구성이용이하기때문에다계층어플리케이션아키텍처에대단히적합하며, 분산웹애플리케이션에서는필히사용되어야하는기술이다. 분산트랜잭션프레임워크비교 닷넷에서사용가능한분산트랜잭션프레임워크로는 COM+, System.Transactions 가있으며, NeoDEEX 는내부적으로 System.Transaction 과 COM+ 의장점을복합적용하여개발편의성을극대화시킨분산트랜잭션프레임워크이다. 우선, 각분산트랜잭션프레임워크의장단점에대해알아보고다음으로 NeoDEEX 의편의성을이어서알아보도록하자. COM+ COM+ 는컴포넌트기반의분산트랜잭션프레임워크로 MSDTC(Microsoft Distribute Transaction Coordinator) 기반의분산트랜잭션을사용한다. COM+ 는선언적인프로그래밍모델을지원하기에개발자가트랜잭션에관련된코드를메서드내부에직접작성하지않고특성 (attribute) 을통해트랜잭션의시작, 종료, 롤백, 커밋등을제어할수있다. 트랜잭션을위해별도로작성해야하는코드가없으므로개발생산성이높아지는장점이있다. [ 리스트 44] 에서보는바와같이 COM+ 컴포넌트는 Transaction 특성을통해트랜잭션을제어하고 AutoComplete 특성을통해트랜젝션의커밋 / 롤백을제어할수있다. [FoxTransaction(FoxTransactionOption.Required, Isolation = FoxTransactionIsolationLevel.ReadCommitted)] [EventTrackingEnabled(true)] [ComVisible(true)] public class OrderDAC : System.EnterpriseServices.ServicedComponent [AutoComplete] public int CreateOrderEntry(int customerid, int productid, int amount) string query = "INSERT INTO OrderTable(CustomerId, ProductId, " + SqlConnection conn = DatabaseUtil.GetConnection(); SqlCommand cmd = new SqlCommand(query, conn); cmd.parameters.add("@cid", SqlDbType.Int, 4).Value = customerid; cmd.parameters.add("@pid", SqlDbType.Int, 4).Value = productid; cmd.parameters.add("@amount", SqlDbType.Int, 4).Value = amount; NeoDEEX Developer Guide 48

51 트랜잭션및컴포넌트서비스기능 conn.open(); try decimal orderid = (decimal)cmd.executescalar(); return (int)orderid; finally conn.close(); 리스트 44. COM+ 컴포넌트예제코드 하지만 Unmanaged 기술인 COM 에기반하고 COM+ 카탈로그를자주참조하여이로인한오버헤드가많이발생한다는단점이있다. 또한, 개발된컴포넌트는별도의등록작업을거쳐야한다. 이는컴포넌트에아주사소한변경이일어난경우에라도다시빌드후등록작업을거쳐야하기때문에유지관리비용이많아지게된다. 이러한장단점외에 COM+ 는추가적으로 JIT Activation, Object Pooling, Queued Component 와같은기능을제공하기때문에, 성능이나비용적인부담에도불구하고많은어플리케이션에서 COM+ 를트랜잭션프레임워크로채용하곤했다. 실제로 NeoDEEX 를제외한 Spring.NET 등의오픈소스개발프레임워크나국내타개발프레임워크제품은 COM+ 에의존하고있다. System.Transactions System.Transactions 는.Net Framework 2.0 에서처음등장하였다. System.Transactions 는항상분산트랜잭션으로동작하는것이아니라최초커넥션은로컬트랜잭션으로동작하며필요에따라 MSDTC 기반의분산트랜잭션으로프로모션되기때문에 COM+ 에비해상대적으로우수한성능을낸다. 또한관리되는코드로개발되어있어닷넷에서우수한성능을내며 COM+ 와같은별도의컴포넌트등록작업이필요치않다는장점이있다. 하지만, 비선언적인프로그래밍모델로서개발자가트랜잭션에관련된코드를직접삽입해야만하는번거로움이존재한다. 이는작성해야할코드의양이많아지고코드를통해트랜잭션을개발자가직접제어해야하므로오류의가능성이높아지게된다. [ 리스트 45] 의코드는 System.Transactions 를사용하여작성된컴포넌트의예를보여준다. 어트리뷰트를사용하는대신프로그램적으로 TransactionScope 객체를생성하고 Complete 메서드호출을통해트랜잭션의커밋 / 롤백여부를결정한다는점에서 COM+ 에비해보다주의깊은코딩이요구되며작성해야할코드의양역시늘어난다는것을알수있을것이다. public class OrderBLC : IDisposable public int PlaceOrder(int customerid, int productid, int amount, bool forcetransactionfail) int orderid = -1; // 트랜잭션옵션설정. TransactionScopeOption txopt = TransactionScopeOption.Required; TransactionOptions opt = new TransactionOptions(); opt.isolationlevel = IsolationLevel.ReadCommitted; opt.timeout = TimeSpan.FromSeconds(60); using (TransactionScope scope = new TransactionScope(txOpt, opt)) NeoDEEX Developer Guide 49

52 트랜잭션및컴포넌트서비스기능 //DataAccessComponent 호출 scope.complete(); return orderid; 리스트 45. System.Transactions 코드예제 FoxTransaction NeoDEEX 의 FoxTransaction 은 COM+ 와 System.Transactions 의장점만을수용하여개발된분산트랜잭션프레임워크로써 COM+ 의장점인선언적프로그래밍모델을적용하여개발생산성을높였으며, 내부적으로는 System.Transactions 를사용함으로써별도의등록과정이필요없고, COM+ 비해우수한성능을낼수있도록되어있다. [ 리스트 46] 은 FoxTransaction 을이용한컴포넌트코드예를보여준다. COM+ 와유사하게 FoxTransaction 특성과 FoxAutoComplete 특성을사용하여트랜잭션을제어하고있으며 TheOne.Transactions 네임스페이스가제공하는데이터액세스컴포넌트베이스클래스인 FoxDacBase 클래스와 [ 데이터액세스기능 ] 에서설명한데이터액세스기능을사용함으로써보다간편하게컴포넌트를작성할수있다는것을알수있을것이다. [FoxTransaction(FoxTransactionOption.Supported)] public class StockDAC : TheOne.Transactions.FoxDacBase [FoxAutoComplete] public void Change(int productid, int amount) string query = "UPDATE StockTable SET Units = Units WHERE ProductId this.dbaccess.executesqlnonquery(query, productid, amount); 리스트 46. FoxTransaction 을이용한데이터액세스예제 TheOne.Transactions 는트랜잭션기능이외에별도의코딩없이공통으로예외를처리할수있는예외처리기능, 메서드호출시전처리 / 후처리기능, 클라이언트에서서버 ( 서비스, BLC, DAC) 까지사용자정보자동전달, BLC/DAC 를위한베이스클래스, 데이터액세스의간편함등을제공한다. 자세한내용은 [ 컴포넌트베이스클래스 ] 부분에서설명할것이다. FoxTransaction 은 COM+ 와 System.Transactions 의장점만을수용하여개발되었기때문에성능면에서 System.Transactions 과약간느리지만 COM+ 보다는우수한성능을낸다. [ 그림 21] 은트랜잭션프레임 워크별처리량을보여주고있다. NeoDEEX Developer Guide 50

53 트랜잭션및컴포넌트서비스기능 1 그림 21. 트랜잭션프레임워크별초당트랜잭션처리량 지금까지닷넷에서사용가능한분산트랜잭션프레임워크의장단점을알아보았으며 [ 표 6] 은각프레임워크 별로지원하는기능에대해보여준다. ADO.NET Local Transaction COM+ System.Transactions Fox Transactions Local Transaction O ( 특정조건하에 ) ( 특정조건하에 ) O Distributed Transaction Automatic Transaction X O O O X O X O (programmati c transaction) Component Registration Productivity Scalability Performance N/A Required N/A N/A Low High Medium Very High Medium High High High Very High Low High High 테스트후에재구성해야함 NeoDEEX Developer Guide 51

54 트랜잭션및컴포넌트서비스기능 Functionality Required Skill Set Initial Cost Maintenance Cost Low High Low Medium High Low Medium Low Low Low Low High Very High High Medium Low 표 6. 트랜잭션프레임워크별기능비교 트랜잭션사용 FoxTransaction 을사용하여트랜잭션을제어하기위해서는반드시 TheOne.Transactions.FoxComponetBase 클래스에서파생되어야하며, 제공되는 FoxTransaction 특성, FoxAutoComplete 특성을이용하여트랜잭션을구현할수있다. FoxAutoComplete 특성을사용할경우자동으로트랜잭션이커밋혹은롤백되며, 이특성을사용하지않을경우에는 SetComplete/SetAbort 메서드를이용하여수동으로수동을트랜잭션을제어해야한다. FoxTransaction 특성 FoxTransaction 특성은 TheOne.Transactions.FoxComponentBase 에서파생된클래스또는이클래스의메서드, 속성에적용되는트랜잭션속성을명시한다. FoxTransaction 특성은트랜잭션의수행옵션을결정하는 FoxTransactionOption, 트랜잭션이완료되기이전의데이터에대한액세스수준을결정하는 FoxIsolationLevel, 트랜잭션의타임아웃을결정하는 TimeOut 속성을명시할수있다. [ 리스트 47] 는 FoxTransaction 특성을사용하는컴포넌트의예를보여준다. StockBLC 클래스가 FoxCompoenteBase 클래스에서파생되었음에주목할필요가있다. FoxTransaction 특성에대한구체적인옵션설정방법은이어지는섹션에서구체적으로다루게될것이다. [FoxTransaction(FoxTransactionOption.Required, IsolationLevel = FoxTransactionIsolationLevel.ReadCommitted, Timeout = 60)] public class StockBLC : FoxComponentBase 리스트 47. FoxTransaction 특성사용예 트랜잭션시작과종료 TheOne.Transactions.FoxComponentBase 클래스에서파생된클래스의메서드는기본적으로수동으로트랜 잭션을제어해야한다. 트랜잭션을자동으로제어하기위해서는 FoxAutoComplete 특성을클래스또는메 서드수준에명시해야한다. 자동트랜잭션은 FoxAutoComplete 특성을클래스또는메서드수준에명시한후, 메서드가예외없이종료 되면트랜잭션을커밋하고예외가발생하면트랜잭션을롤백하게된다. FoxAutoComplete 특성을사용할경 우에는추가로트랜잭션에관련된코드를작성할필요가없다. NeoDEEX Developer Guide 52

55 트랜잭션및컴포넌트서비스기능 수동트랜잭션은 TheOne.Transactions 컴포넌트의수행문맥에관련된다양한유틸리티메서드를제공하는 FoxContextUtil 클래스를사용하여수동으로트랜잭션을관리할수있다. 비즈니스로직이예외없이정상적으로처리되었을경우 FoxContextUtil.SetComplete() 를호출하여트랜잭션을완료하며, 예외가발생할경우에는 FoxContextUtil.SetAbort() 를호출하여트랜잭션을롤백한다. [ 리스트 48] 는이러한코드의예를보여준다. [FoxTransaction] public class MyComponent : TheOne.Transactions.FoxComponentBase public void ManualTransactionControl() try // 현재메서드가트랜잭션내에서수행되고있는지확인 Debug.Assert(FoxContextUtil.IsInTransaction == true); // 트랜잭션내에서처리될비즈니스로직 // 트랜잭션커밋 FoxContextUtil.SetComplete(); catch (Exception) // 트랜잭션롤백 FoxContextUtil.SetAbort(); throw; [AutoComplete] public void AutoTransactionControl() // 트랜잭션내에서처리될비즈니스로직 // 예외없이정상적으로처리되었을경우커밋 // 예외가발생할경우롤백 리스트 48. 자동트랜잭션및수동트랜잭션처리 트랜잭션범위및전파 FoxTransaction 특성의생성자를통해트랜잭션의수행옵션을결정하는 TransactionOption 을설정할수있다. FoxTransactionOption 을명시적으로설정하지않은경우 FoxTransactionOption 값은 Required 로설정된다. FoxTransactionOption 은 TheOne.Transactions.FoxTransactionOption 열거형을통해지정할수있으며열거형의내용은 [ 표 7] 과같다. 멤버 설명 None Supported None 옵션을사용하면 FoxTransaction 은컴포넌트의트랜잭션을전혀제어하지않는다. 기존에트랜잭션이존재한다면, 트랜잭션에포함될수도있다. 이옵션은컴포넌트가스스로트랜잭션을제어하기위한고급옵션으로대부분사용하지않는것이좋다. 기존트랜잭션이있는경우, 이트랜잭션에포함되어코드가수행되고그렇지않다면트랜잭션과무관하게코드가수행된다. ServicedComponent 에서파생된 NeoDEEX Developer Guide 53

56 트랜잭션및컴포넌트서비스기능 클래스의 Migration 을위해서제공하는특성이다. Suppress 코드는항상현재트랜잭션과무관하게수행된다. Reuqired RequiresNew 트랜잭션이이미시작되었다면코드는이트랜잭션에포함되어수행되고, 그렇지않다면새로운트랜잭션을시작하고코드가수행된다. 항상새로운트랜잭션을생성하고코드는새로이생성된트랜잭션하에서수행된다. 표 7. TransactionOption 열거형설명 FoxTransactionOption 에따라루트트랜잭션이결정되고트랜잭션이전파되며트랜잭션의범위가결정된다. FoxTransactionOption 이 RequiresNew 일경우에는항상새로운트랜잭션을생성하기때문에항상트랜잭션루트로서실행되고, Required 일경우에는트랜잭션이아직시작하지않았다면트랜잭션루트로동작하게된다. [ 그림 22] 을보면붉은색의 Transaction 루트는 Required 또는 Requires New 인것을확인할수있다. Supported Transaction T1 Required Tx Root Required Suppress Base Client Supported Requires New Tx Root Transaction T2 Transaction T3 Suppress Requires New Tx Root Supported Required 그림 22. 트랜잭션범위및전파 TransactionOption 을설정하기위해서는클래스또는메서드수준에 FoxTransaction 특성을통해이를지정 할수있다. [FoxTransaction(FoxTransactionOption.Required)] public class StockBLC : FoxComponentBase 리스트 49. TransactionOption 설정 NeoDEEX Developer Guide 54

57 트랜잭션및컴포넌트서비스기능 FoxTransactionOption 열거자는 System.EnterpriseServices 네임스페이스의 TransactionOption 열거자나 System.Transactions 네임스페이스의 TransactionOption 열거자와는다르다. System.EnterpriseServices 네임스페이스의 TransactionOption 열거자는 COM+ 가명시하는 Disabled, NotSupported, Supported, Required, RequiesNew 다섯가지의옵션을명시할수있으나 System.Transactions 네임스페이스의 TransactionOption 열거자는 Suppress, Required, RequiresNew 세가지만을사용할수있다. Suppress 는기존의 NotSupported 와동일하며 Required, RequiresNew 는 COM+ 의그것과같다. TheOne.Transactions 네임스페이스의 FoxTransactionOption 은이전 TransactionOption 들을통합하여명 시하는것으로써 [ 표 8] 과같은호환성을갖는다. System.EnterpriseServices System.Transactions TheOne.Transactions Disabled N/A (Transaction 사용안함 ) None NotSupported Supress Supress Supported N/A (Transaction 사용안함 ) Supported Required Required Required RequiesNew RequiresNew RequiresNew 표 8. 프레임워크별 TransactionOption 비교 트랜잭션격리수준및타임아웃설정 격리수준은 IsolationLevel 속성을통해지정할수있다. IsolationLevel 은트랜잭션의격리수준에따라트 랜잭션이완료되기이전의데이터에대해액세스할수있는레벨을결정할수있다. FoxTransaction 의기 본격리수준은 ReadCommitted 이며, 전체목록은 [ 표 9] 와같다. 맴버 설명 Unspecified 지정된격리수준과다른수준이사용되지만수준을결정할수는없다. Chaos 격리수준이높은트랜잭션에서보류중인변경은덮어쓸수없다. ReadUncommitted ReadCommitted RepeatableRead Serializable SnapShot 공유잠금이발행되지않았고단독잠금이부여되지않았음을의미하는더티 (dirty) 읽기가가능하다. 공유잠금은커밋되지않은읽기를방지하기위해데이터를읽는동안유지되지만트랜잭션이끝나기전에데이터가변경되어반복되지않은읽기나팬텀데이터가생성될수있다. 잠금은쿼리에서사용되는모든데이터에적용되어데이터를다른사용자가업데이트할수없게합니다. 반복되지않은읽기를금지하지만팬텀행의경우는가능하다. 범위잠금을 DataSet 에적용하여트랜잭션이완료될때까지다른사용자가데이터집합에행을삽입하거나업데이트할수없다. 동일한데이터에대해한응용프로그램에서데이터를수정하고있을때또다른응용프로그램에서읽을수있는데이터버전을저장하여차단을줄입니다. 다시 NeoDEEX Developer Guide 55

58 트랜잭션및컴포넌트서비스기능 표 9. 격리수준열거형설명 쿼리해도한트랜잭션에서다른트랜잭션의변경내용을볼수없음을나타낸다. 또한, 트랜잭션의제한시간을 TimeOut 속성을통해지정할수있으며트랜잭션의제한시간을초단위로 설정가능하다. 기본값은 60 초 (COM+ 의기본값과동일 ) 이다. [FoxTransaction(FoxTransactionOption.Required, IsolationLevel = FoxTransactionIsolationLevel.ReadCommitted, Timeout = 60)] public class StockBLC : FoxComponentBase 리스트 50. 격리수준및타임아웃설정 컴포넌트베이스클래스 (FoxComponentBase) FoxComponentBase 클래스는 System.Transactions 를이용하여선언적인분산트랜잭션문맥하에서.NET 코드가수행되도록해준다. 이는 System.Transactions 네임스페이스의 TransactionScope 클래스가제공하는트랜잭션과매우비슷하다. 하지만 FoxComponentBase 클래스는 ServicedComponent 클래스와는달리 COM+ 카탈로그에등록하는과정을요구하지않는다. 이때문에레지스트리를액세스하는등록과정에서문제를유발하지않는다. 또한가지 ComponentBase 클래스의장점은클래스수준뿐만아니라메서드수준의트랜잭션속성을지정할수있다. ServicedComponent 클래스의경우, 클래스수준에서만트랜잭션속성 (Required, Supported 등 ) 을지정할수있었다. 이때문에트랜잭션메서드와비트랜잭션메서드는각기다른클래스에존재해야만했다. 이러한제약은논리적클래스설계와물리적클래스구현이매우달라지는현상을초래하곤한다. 하지만 FoxComponentBase 클래스로부터파생하여설계한다면이렇게분리하여작성할필요가없다. Activate/Deactivate ComponentBase 클래스에서파생된클래스가 Activate/Deactivate 메서드를오버라이드할경우자동으로 전처리 / 후처리작업을수행할수있다. 전처리작업은메서드가활성화되고호출되기직전에호출되는 Activate 에구현하며후처리작업은메서드가비활성화된직후호출되는 Deactivate 메서드에구현하면된다. 이때 Activate/Deactivate 메서드에서는 FoxComponentBase 에서제공하는 TheOne.Transactions.Common.ExcutionContext 타입의 Context 속성을통해현재호출되고있는메서드의각종정보를가져올수있으며이러한정보를기반으로적절한전처리 / 후처리작업을수행할수있다. [ 리스트 51] 는이를위한코드의예이다. public class Component1 : TheOne.Transactions.FoxComponentBase protected override void Activate() // invoke base implementation base.activate(); // 전처리작업을수행한다. NeoDEEX Developer Guide 56

59 트랜잭션및컴포넌트서비스기능 protected override void Deactivate() // 후처리작업을수행한다 // invoke base implementation base.deactivate(); 리스트 51. Activate/Deactivate Exception Handling 컴포넌트의메서드를수행하면서예외가발생하면이예외는수행엔진에의해감지된다. 수행엔진은 OnError 메서드를호출하여컴포넌트의예외처리를중앙집중적으로수행할수있도록해준다. OnError 메서드가호출되는시점은 Deactivate 가호출되고트랜잭션문맥이완료된이후이다. OnError 메서드에서발생된예외가컴포넌트를호출한호출자에게전파되지않도록할수있는방법은없다. 굳이예외가전파되지않도록하고자한다면, 컴포넌트의메서드내에서 try~catch 를사용해야만한다. public class Component1 : ComponentBase // OnError 처리 protected override void OnError(Exception ex) // ComponentBase.ExceptionHandler this.exceptionhandler(ex); public void ErrorMethod() throw new Exception("); 리스트 52. 공통이벤트처리 기본적으로 OnError 메서드는아무런구현도포함하고있지않다. 예외처리를원하는컴포넌트는이메서드를오버라이드 (override) 하여예외로깅등의작업을수행할수있다 ( 단, Fox WebService 를사용한경우에는예외로깅이자동으로수행된다 ). 권장되는방법은어플리케이션수준의컴포넌트베이스클래스에서이메서드를오버라이드 (override) 하여예외로깅등의작업을수행하도록하고, 각비즈니스컴포넌트에서는특별한예외처리를하지않도록하는것이다. FoxComponentBase 클래스에서기본으로제공하는 ExceptionHandler 메쏘드는로깅기능을통해로그파 일에예외정보를기록해주는코드를담고있으므로단순히예외정보를기록하는수준의예외처리를수행 한다면 [ 리스트 52] 와같이 ExceptionHandler 메쏘드를호출해주어도무방하다. 컴포넌트메서드에서예외를 try~catch 문에의해처리하고예외를다시 throw 하지않으면수행엔진이예 외를감지할수없으며 OnError 메서드를자동으로호출해주지도않는다는점을기억하도록하자. 데이터액세스컴포넌트 (DAC) 베이스클래스 FoxDacBase 클래스는 FoxDbObjectBase 클래스에서파생된클래스로서데이터베이스를액세스하는컴포넌 NeoDEEX Developer Guide 57

60 트랜잭션및컴포넌트서비스기능 트를위한추상베이스클래스이다. 이클래스는추상클래스이므로파생클래스를반드시정의해야하며파 생된클래스는 TheOne.Transactions 의데이터액세스컴포넌트로서작동한다. FoxDacBase 클래스를사용할경우권장되는패턴은 FoxDacBase 에서파생된프로젝트만의고유베이스클래스를작성하고, 실제업무클래스는그베이스클래스로부터파생하는것이다. FoxDacBase 클래스는일반적이고다양한용도를위한기본값들이설정되어있기때문에, 파생된베이스클래스에서각프로젝트에필요한기본설정 ( 연결문자열, OpenOnActivate 설정등 ) 들을설정하는것이좋다. 또한, 이렇게프로젝트레벨의추상클래스를하나더둠으로써얻을수있는장점은추후에변경될수있는사항을추가적인베이스클래스에서흡수하여모든비즈니스클래스들을수정해야하는작업을줄이는효과를꾀할수도있다. FoxDacBase 클래스역시 FoxDbObjectBase 클래스처럼컴포넌트가 Activate/Deactivate 될때데이터베이스연결을 Open/Close 할수있다. 그리고이기본동작은 OpenOnActivate 프로퍼티에의해제어할수있다. OpenOnActivate 프로퍼티의기본값은 false 이며, 이는코드내에서명시적으로 Open/Close 메서드를호출해주거나 DbAccess 클래스의 ExecuteSPxxx, ExecuteSQLxxx 메서드들의자동 Open/Close 기능에의존해야함을의미한다. 만약 OpenOnActivate 프로퍼티의값을생성자에서 true 로설정하면컴포넌트의메서드가호출되기전에 DbAccess 객체의 Open() 메서드가호출되며컴포넌트메서드가끝나면 Close() 가자동으로호출된다. [ 리스트 53] 는 OpenOnActivate 속성을설정하는방법을보여준다. [FoxTransaction(FoxTransactionOption.Supported, IsolationLevel = FoxTransactionIsolationLevel.ReadCommitted)] public class Component1 : FoxDacBase public Component1() // 자동으로 Connection Open/Close this.openonactivate = true; 리스트 53. DataBase 의자동 Open/Close 를위한 OpenOnActivate 설정 OpenOnActivate 를 false 로설정하고데이터베이스연결을수동으로관리할때는정확하게 Open/Close 시점을지정할수있다는점에서효율적인데이터베이스연결관리를할수있다는장점이있지만 Open/Close 를명시적으로호출하기위한 try ~ finally 문장을사용하는등프로그래머의추가적인노력이필요하다는단점이있다. 반면 OpenOnActivate 를 true 로설정하고데이터베이스연결을자동으로관리하면코드및로직을간편하게가져갈수있으므로코딩이보다쉬워지지만데이터베이스연결이실제요구하는시점보다조금일찍열리고조금늦게닫힌다는단점이있다. FoxDacBase 클래스의 CreateDbInstance 메서드구현은 FoxDatabaseFactory 를통해서구성설정에지정된 FoxDbAccess 의인스턴스를생성하여반환하도록되어있다. 따라서, 구성설정에지정된 FoxDbAccess 를사용하는컴포넌트는 CreateDbInstance 메서드를오버라이드할필요가없다. 기본적으로 DacBase 역할을위한클래스는 FoxDacBase 로부터파생되는것을권장하기에 CreateDbInstance 메서드를오버라이드해야하는경우는거의없다. 흔하지않은경우이겠지만, FoxDacBase 클래스에서파생하지않고직접 FoxDbObjectBase 클래스에서파생된클래스를정의해야하는경우에는각파생클래스들은 CreateDbInstance 메서드를반드시오버라이드해야한다. NeoDEEX Developer Guide 58

61 트랜잭션및컴포넌트서비스기능 비즈니스로직컴포넌트 (BLC) 베이스클래스 FoxBizBase 클래스는비즈니스로직컴포넌트에대한추상베이스클래스로서사용된다. 비록 FoxDacBase 클래스처럼데이터베이스연결을관리하는등의특별한기능을가지고있지는않지만단일추상클래스에서파생되도록함으로써일관된클래스계층구조를갖도록할수있다. FoxBizBase 클래스가독자적인기능을갖고있지않지만 FoxComponentBase 클래스에서파생되었으므로 FoxComponentBase 클래스가갖는파일로깅, 이벤트로깅, 성능측정기능등은여전히사용할수있다. FoxBizBase 클래스에선언된 TheOne.Transactions 관련어트리뷰트는이클래스의베이스클래스인 FoxComponentBase 클래스의어트리뷰트를상속받는다. 다만, Transaction 어트리뷰트는 Required 로기본설정되어있다. 대개의비즈니스로직컴포넌트가 Required 트랜잭션설정을갖기때문이다. 이클래스에서파생된클래스가명시적으로 Transaction 어트리뷰트를주지않는다면트랜잭션속성은 Required 가된다. 또한트랜잭션격리수준은기본값으로 ReadCommitted 를사용한다. 주의할사항으로 FoxBizBase 클래스에는 FoxAutoComplete 가표시되어있지않다는점이다. 이는 COM+ 와의하위호환성을위한것으로써, FoxBizBase 클래스에서직접파생된클래스에서트랜잭션을사용하고자한다면, 메서드수준혹은클래스수준에서 AutoComplete 를명시하거나메서드내에서 FoxComponentBase 클래스의 SetComplete/SetAbort 메쏘드를호출하거나 FoxContextUtil 클래스의 SetComplete/SetAbort 메서드를직접호출해주어야한다. 하위호환성이문제가되지않는경우라면 (COM+ 코드를 TheOne.Transactions 로마이그레이션하는경우가 아니라면 ), 추후공통적으로추가될기능을위해 FoxBizBase 에서파생된클래스를정의하고이클래스에 FoxAutoComplete 를명시한뒤, 이클래스로부터파생하여비즈니스로직컴포넌트를작성하는것이좋다. 비즈니스로직계층아키텍처 시스템의비즈니스로직은 SQL Server 의관련된데이터베이스에액세스하거나업무비즈니스로직을수행하 게된다. 이들비즈니스로직컴포넌트가제공하는서비스를클라이언트혹은외부시스템에제공하기위해서일반적으 로웹서비스계층이존재한다. 웹서비스계층은 ASP.NET Web Service 또는 WCF 서비스를통해비즈니스 로직컴포넌트를호출하게된다. NeoDEEX Developer Guide 59

62 트랜잭션및컴포넌트서비스기능 ASP.NET Deploy Site BSL Web Browser Response (XML) DSL WCF Service Call (XML) WCF Service Agent *.svc DB 그림 23. Web Service Agent 클라이언트는일반 WinForm, 스마트클라이언트등웹서비스호출을수행할수있는어떤클라이언트라도서비스를통해비즈니스로직에액세스할수있으며웹어플리케이션역시서비스호출또는비즈니스로직을직접호출하여액세스할수있다. 최종사용자 (end-user) 가사용하는전형적인클라이언트외에도기존레거시시스템이나, 타시스템역시플랫폼 (JAVA, VB, ASP 등 ) 에관계없이웹서비스를통해비즈니스로직에접근할수있다. [ 그림 24] 은 NeoDEEX 를사용하는일반적인애플리케이션의전체적인논리아키텍처모습 ( 서버측면과클라 이언트측면 ) 을도식화한것이다. 그림 24. 논리적애플리케이션아키텍처 비즈니스로직컴포넌트는데이터베이스를액세스하고필요한비즈니스규칙을수행하는어플리케이션의핵 NeoDEEX Developer Guide 60

63 트랜잭션및컴포넌트서비스기능 심적인부분이다. [ 그림 25] 은비즈니스컴포넌트의역할을구체적으로보여주고있다. BSL Business Logic Object Business Logic Object Tx DB Data Access Object DSL Data Access Object MS DTC DB 그림 25. 비즈니스컴포넌트의역할 BSL(Business Logic Service Layer) 은순수업무로직에관련된작업을수행하게된다. 또한 BSL 은트랜잭션을시작 / 종료 / 커밋 / 롤백하는트랜잭션컨트롤러의역할을수행하게된다. 트랜잭션이필요한경우 BSL 의특정컴포넌트에서트랜잭션을시작하고종료한다. BSL 에서트랜잭션을시작하고, BSL 이호출하는 DSL(Data Access Service Layer) 은시작된트랜잭션하에서동작하게된다. DSL(Data Access Service Layer) 은직접데이터베이스에연결하여액세스를수행하는컴포넌트로구성된다. 일반적으로직접트랜잭션을시작하지않고자신을호출하는 BSL 에서시작된트랜잭션에참여하게된다. DSL 과 BSL 을 Business 컴포넌트라하며이들은분산트랜잭션이필요한경우 MSDTC(Microsoft Distribute Transaction Coordinator) 기반으로 SQL Server 와분산트랜잭션을수행한다. 웹사이트, WCF 서비스에이전트, 비즈니스컴포넌트그리고데이터베이스의각논리적계층을그림을통해 나타내면 [ 그림 26] 와같다. NeoDEEX Developer Guide 61

64 로깅기능 그림 26. 논리적서버구성요소 로깅기능 응용프로그램을개발하는경우에, 응용프로그램에서발생하는사항에대하여로그를기록해야할경우는상 당히자주있다. 이를위해서필요한정보및로그를기록하는헬퍼클래스또는헬퍼메서드를만들어서사 용하기도하고, 오픈라이브러리로부터로깅과관련한기능을차용해서사용하기도한다. NeoDEEX 역시이러한로깅기능을지원하는 API 를제공하고있다. 더불어, 로그정보를파일, 이벤트뷰어뿐만아니라디버거, 데이터베이스등에도기록할수있도록다양화된로깅수단도제공하고있다. NeoDEEX 는단일화된 API 를통해서로깅이가능하도록설계되어있으며, 설정파일에서로깅관련설정만변경하면다양한스토리지에로그를저장할수있도록 DI(Dependency Injection) 기법을적용하여개발되어있다. 그렇기에, 원한다면오픈소스로깅시스템인 Log4Net 을적용하여로깅을수행하도록설정할수도있을뿐만아니라, 원격서버나 MSMQ 와같은시스템에로깅을하는것도가능하다. [ 그림 27] 은 NeoDEEX 의로깅아키텍처를도식화한그림이다. NeoDEEX Developer Guide 62

65 로깅기능 그림 27. NeoDEEX 의로깅아키텍처 아키텍처는다소복잡해보이지만, 개발시의사용법은대단히간단하다. 그렇다면, 가장대표적인로깅방법 으로파일에로그정보를기록하는방법에대해서알아보도록하자. 파일로그작성방법 NeoDEEX 는기본적으로아무런설정을지정하지않아도자체적인기본값에따라동작하는 Zero- Configuration 을기본으로하고있다. 그렇기에, 별도의설정을지정하지않아도로깅이되는구조를가지고있지만, 직관적인관리를위해서는개발환경에맞는설정을지정해주는것이좋다. 우선, 로깅을하기위해서는로깅을위한로거의형식을구성파일에지정할필요가있다. [ 리스트 54] 은구성 파일에로거를설정하는예이다. <?xml version="1.0" encoding="utf-8"?> <configuration> <configsections> <section name="theone.configuration" type="theone.configuration.foxsectionhandler, TheOne.4.0"/> </configsections> <theone.configuration xmlns=" <logging> <loggers> <logger name="myapp.biz" provider="foxtextfileloggerprovider"></logger> </loggers> </logging> </theone.configuration> </configuration> 리스트 54. 로깅을위한구성설정 NeoDEEX 와관련된모든설정은 theone.configuration 노드안에설정해야한다. 상기설정은 MyApp.Biz NeoDEEX Developer Guide 63

66 로깅기능 라는이름의로거를설정해두고있는데, 해당로거의프로바이더는 NeoDEEX 에서제공하는텍스트파일로 거인 FoxTextFileLoggerProvider 로지정하고있다. 이렇게지정할경우, MyApp.Biz 라는이름을사용하여코드상에서동적으로텍스트파일에로깅하는로거를 사용할수가있다. [ 리스트 55] 은로그를기록하는코드의예이다. private void button1_click(object sender, EventArgs e) IFoxLog log = FoxLogManager.GetLogger("MyApp.Biz"); log.write(foxloglevel.error, " 로그를남겨봅니다 "); 리스트 55. 동적로거를사용하여로그를기록하는코드 로거를사용하는방법은위에서보는바와같이매우간단하다. FoxLogManager 클래스의 GetLogger 메서드 에인자로서사용하려는로거의이름 ( 예제의경우, MyApp.Biz) 을지정하면해당프로바이더형식에맞는로거 가자동으로로드되며, 로거의 Write 메서드를사용하여실제로로그를기록할수가있다. 상기코드로인해로깅이수행되면, 기본적으로현재프로그램이기동되는경로에 [ 그림 28] 같이로그파일이 생성된다. 로그파일은별도의설정이없다면기본적으로 TheOne_ 날짜.log 형태로구성된다. 그림 28. 생성된로그파일 그리고, 해당파일을열어보면 [ 그림 29] 과같이로깅이되어있는것을확인할수있다. NeoDEEX Developer Guide 64

67 로깅기능 그림 29. 기록된로그 주의 파일로그를작성하기위해서는, 로그파일이생성되는디렉터리에대한권한을응용프로그램에서가지고있 어야한다. 파일로그가작성되지않는경우라면, 해당응용프로그램을실행하는계정의권한을확인하도록 하자. 로깅내용을살펴보면각줄의제일앞에 E 라는글자가들어있는것을확인할수있는데, 이는 Write 메서드 에지정된로그수준이표기된것이다. 이는차후로그를분석하는경우, 각로그의수준을파악하기위해사 용할수있는키워드이다. E 는 Error 을의미하며, I 는 Information 을의미한다. 중요 NeoDEEX 는 4 종류의로그수준을지원하고있다. 로그수준이란파일로그및이벤트로그에기록되는로그메시지의수준을의미한다. 로그수준을사용하기위해서는 FoxLogLevel 열거형을사용해야하며 FoxLogLevel 열거형에는 Error( 예외표시용도의로그수준 ), Warning( 경고표시용도의로그수준 ), Information( 정보표시용도의로그수준 ), Verbose( 단순추적혹은디버깅을위한용도의로그수준 ) 이있다. FoxLogLevel 열거형에정의된멤버들의우선순위는 Error > Warning > Information > Verbose 순이므로기억해두도록하자. 이러한로그수준을활용하는방안중하나는구성설정파일에서필터특성을지정하여로깅수준에따라로 깅여부를제어하는것이다. 예를들어, 구성설정파일의 <loggers> 노드에 [ 리스트 56] 과같이 filter 특성 을지정했다고가정해보자. <?xml version="1.0" encoding="utf-8"?> <configuration> <configsections> <section name="theone.configuration" type="theone.configuration.foxsectionhandler, TheOne.4.0"/> </configsections> NeoDEEX Developer Guide 65

68 로깅기능 <theone.configuration xmlns=" <logging> <loggers filter="information"> <logger name="myapp.biz" provider="foxtextfileloggerprovider"></logger> </loggers> </logging> </theone.configuration> </configuration> 리스트 56. loggers 에 filter 설정 [ 리스트 56] 과같이설정하면, FoxLogLevel 이 Information 이상으로설정된모든로그가기록되고, Verbose 수준의로그는기록되지않는다. filter 특성이지정되지않으면기본값은 Error 이기에, 일반적으로 는 Error 수준으로설정된로그들만이기록된다. [ 리스트 55] 의코드를 [ 리스트 57] 와같이바꾸고, filter 특성을설정하거나지우면서테스트를해보도록하 자. private void button1_click(object sender, EventArgs e) IFoxLog log = FoxLogManager.GetLogger("MyApp.Biz"); log.write(foxloglevel.error, " 에러로그를남겨봅니다 "); log.write(foxloglevel.information, " 정보로그를남겨봅니다 "); 리스트 57. 변경한로깅코드 filter 를 information 으로설정한경우에만, 두번째 Write 메서드가동작하여 정보로그를남겨봅니다 란문장이로깅될것이며, filter 특성을지정하지않으면이메서드는무시되는것을확인할수있을것이다. 기본적으로는 Error 수준의메시지들만이로깅되기때문이다. 필터는이와같이설정파일의설정에따라로깅을수행하게혹은수행하지않게하는역할을담당한다. 또한, 로그파일명을변경한다거나로그파일이특정경로에저장되길원한다면, 프로바이더에그러한설정을지정할수있다. 텍스트파일로거의경우는기본적으로현재프로그램이기동되는경로에로그파일이생성되며, 로그파일의이름은 TheOne_ 날짜.log 형식을갖게되지만, 이는설정에의해변경될수있다. [ 리스트 58] 는기본설정을재정의하여 D:\LogFolder 에로그파일을기록하게하며, 파일명의접두어는 MyLog 로설정한예이다. <?xml version="1.0" encoding="utf-8"?> <configuration> <configsections> <section name="theone.configuration" type="theone.configuration.foxsectionhandler, TheOne.4.0"/> </configsections> <theone.configuration xmlns=" <logging filter="information"> <providers> <provider name="mytextprovider" type="theone.diagnostics.loggers.foxtextfileloggerprovider, TheOne.4.0, Version= , Culture=neutral, PublicKeyToken= a3cc10e00"> <property name="fileprefix" value="mylog" /> <property name="directory" value="d:\\logfolder" /> NeoDEEX Developer Guide 66

69 로깅기능 <property name="creation" value="daily" /> <property name="maxsize" value="4mb" /> <property name="encoding" value="ks_c_ " /> </provider> </providers> <loggers> <logger name="myapp.biz" provider="mytextprovider" filter="error"></logger> </loggers> </logging> </theone.configuration> </configuration> 리스트 58. 프로바이더설정변경 프로바이더의기본설정을변경하려면 [ 리스트 58] 과같이사용자정의프로바이더를별도로구성한뒤, 프로바이더의속성들을입맛에맞게재정의하면된다. 그리고, logger 노드에서방금설정한프로바이더의이름을 provider 속성에지정해주면된다. [ 그림 30] 은이렇게설정을변경하고프로그램을실행하였을경우, 지정된위치에로그파일이생성되는결과를보여준다. 그림 30. LogFolder 에생성된로그파일 콘솔로그작성방법 NeoDEEX 가제공하는로거로는더미로거, 콘솔로거, 텍스트파일로거, 이벤트로그로거, 데이터베이스 로거등이있다. 라이선스에따라추가적인로거가제공되며, 상황에따라서는오픈소스의로거를적용할수 도있다. 이번섹션에서는콘솔로거의사용방법에대해서알아본다. 기본적으로 NeoDEEX 의로거들은설정을바꾸는것만으로모두동일하게동작하도록설계되어있기에, 코드 를수정하거나할필요가없다. 단지, 프로바이더의형식을 FoxConsoleLoggerProvider 로지정하기만하면 된다. [ 리스트 59] 는기존의텍스트파일로거설정에서 provider 의값만을변경한것이다. <?xml version="1.0" encoding="utf-8"?> <configuration> <configsections> <section name="theone.configuration" type="theone.configuration.foxsectionhandler, TheOne.4.0"/> NeoDEEX Developer Guide 67

70 로깅기능 </configsections> <theone.configuration xmlns=" <logging filter="information"> <loggers> <logger name="myapp.biz" provider="foxconsoleloggerprovider"></logger> </loggers> </logging> </theone.configuration> </configuration> 리스트 59. 콘솔로거로설정 설정을변경한뒤, 프로그램을기동하면더이상텍스트파일에는로깅이수행되지않으며, 콘솔창에로그가 출력된다 ( 여기서주의할것은콘솔응용프로그램으로실행하였을경우에만콘솔로그가표시되며, 웹어플리 케이션이나기타콘솔리디렉션상황에서는그결과가달라질수있다 ). 그림 31. 콘솔창에로그를출력한다 코드상에서 FoxLogManager 클래스의 GetLogger 메서드를사용하는것은 DI(Dependency Injection) 패턴을사용하여전체적인로깅에일관성을주기위한방식이다. 만일, 텍스트파일에로깅하는것이아니라이벤트로그에로그를남기도록변경하고싶다면, 코드는전혀손을댈필요가없이, 구성설정파일에서프로바이더를 FoxEventLogLoggerProvider 로바꿔설정해주기만하면된다 ( 다만, 이벤트로그항목을위한별도의설정이필요하다. 자세한내용은도움말파일을참고하자 ). 로그수준을이용하는방법 NeoDEEX 에서는 5 종류의로그수준을지원하고있다 (All 과 None 을제외할경우 ). 그렇다면, 왜여러종류 의로그수준이필요한것일까? 지금부터그이유및장점에대해서알아보도록하겠다. [ 리스트 60] 의코드 를보도록하자. // LogLevel.Critical 수준을통해로그를기록한다. log.write(loglevel.critical, "Critical 수준의로그기록 "); // LogLevel.Verbose 수준을통해로그를기록한다. NeoDEEX Developer Guide 68

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - CSharp-10-예외처리 10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.

More information

한국 컴퓨터그래픽스(디지털컨텐츠)의 현황과 미래 위기인가? 기회인가?

한국 컴퓨터그래픽스(디지털컨텐츠)의 현황과 미래 위기인가? 기회인가? Chapter 14 ADO.NET 학습목표 ADO.NET 은데이터베이스사용의편의를위해, MS 사가만든표준데이터베이스인터페이스이다. 프로그램을한다는것에있어서빠질수없는부분이데이터베이스부분이다. ADO.NET 의 C# 에서활용을학습하도록한다. 2 ADO.NET 의개요 ADO.NET.NET 에서데이터베이스조작에관련된.NET 클래스들의집합 다양한방법으로데이터베이스를검색,

More information

DBMS & SQL Server Installation Database Laboratory

DBMS & SQL Server Installation Database Laboratory DBMS & 조교 _ 최윤영 } 데이터베이스연구실 (1314 호 ) } 문의사항은 cyy@hallym.ac.kr } 과제제출은 dbcyy1@gmail.com } 수업공지사항및자료는모두홈페이지에서확인 } dblab.hallym.ac.kr } 홈페이지 ID: 학번 } 홈페이지 PW:s123 2 차례 } } 설치전점검사항 } 설치단계별설명 3 Hallym Univ.

More information

PowerPoint Presentation

PowerPoint Presentation Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음

More information

쉽게 풀어쓴 C 프로그래밊

쉽게 풀어쓴 C 프로그래밊 Power Java 제 27 장데이터베이스 프로그래밍 이번장에서학습할내용 자바와데이터베이스 데이터베이스의기초 SQL JDBC 를이용한프로그래밍 변경가능한결과집합 자바를통하여데이터베이스를사용하는방법을학습합니다. 자바와데이터베이스 JDBC(Java Database Connectivity) 는자바 API 의하나로서데이터베이스에연결하여서데이터베이스안의데이터에대하여검색하고데이터를변경할수있게한다.

More information

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Spring Boot/JDBC JdbcTemplate/CRUD 예제 Spring Boot/JDBC JdbcTemplate/CRUD 예제 오라클자바커뮤니티 (ojc.asia, ojcedu.com) Spring Boot, Gradle 과오픈소스인 MariaDB 를이용해서 EMP 테이블을만들고 JdbcTemplate, SimpleJdbcTemplate 을이용하여 CRUD 기능을구현해보자. 마리아 DB 설치는다음 URL 에서확인하자.

More information

Windows 8에서 BioStar 1 설치하기

Windows 8에서 BioStar 1 설치하기 / 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar

More information

슬라이드 1

슬라이드 1 Tadpole for DB 1. 도구개요 2. 설치및실행 4. 활용예제 1. 도구개요 도구명 소개 Tadpole for DB Tools (sites.google.com/site/tadpolefordb/) 웹기반의데이터베이스를관리하는도구 Database 스키마및데이터관리 라이선스 LGPL (Lesser General Public License) 특징 주요기능

More information

슬라이드 제목 없음

슬라이드 제목 없음 MS SQL Server 마이크로소프트사가윈도우운영체제를기반으로개발한관계 DBMS 모바일장치에서엔터프라이즈데이터시스템에이르는다양한플랫폼에서운영되는통합데이터관리및분석솔루션 2 MS SQL Server 개요 3.1 MS SQL Server 개요 클라이언트-서버모델을기반으로하는관계 DBMS 로서윈도우계열의운영체제에서만동작함 오라클관계 DBMS 보다가격이매우저렴한편이고,

More information

JAVA PROGRAMMING 실습 08.다형성

JAVA PROGRAMMING 실습 08.다형성 2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F32C2F7BDC32E >

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F32C2F7BDC32E > 6. ASP.NET ASP.NET 소개 ASP.NET 페이지및응용프로그램구조 Server Controls 데이터베이스와연동 8 장. 데이터베이스응용개발 (Page 20) 6.1 ASP.NET 소개 ASP.NET 동적웹응용프로그램을개발하기위한 MS 의웹기술 현재 ASP.NET 4.5까지출시.Net Framework 4.5 에포함 Visual Studio 2012

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

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

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

More information

ALTIBASE 사용자가이드 Templete

ALTIBASE 사용자가이드 Templete Real Alternative DBMS ALTIBASE, Since 1999 WINDOWS ADO.NET 환경의 ALTIBASE 개발가이드 2010. 09 Copyright c 2000~2013 ALTBASE Corporation. All Rights Reserved. Document Control Change Record Date Author Change

More information

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - e pptx Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells

More information

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드] MS SQL Server 마이크로소프트사가윈도우운영체제를기반으로개발한관계 DBMS 모바일장치에서엔터프라이즈데이터시스템에이르는다양한플랫폼에서운영되는통합데이터관리및분석솔루션 2 MS SQL Server 개요 3.1 MS SQL Server 개요 클라이언트-서버모델을기반으로하는관계 DBMS로서윈도우계열의운영체제에서만동작함 오라클관계 DBMS보다가격이매우저렴한편이고,

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

강의 개요

강의 개요 DDL TABLE 을만들자 웹데이터베이스 TABLE 자료가저장되는공간 문자자료의경우 DB 생성시지정한 Character Set 대로저장 Table 생성시 Table 의구조를결정짓는열속성지정 열 (Clumn, Attribute) 은이름과자료형을갖는다. 자료형 : http://dev.mysql.cm/dc/refman/5.1/en/data-types.html TABLE

More information

PowerPoint Template

PowerPoint Template 16-1. 보조자료템플릿 (Template) 함수템플릿 클래스템플릿 Jong Hyuk Park 함수템플릿 Jong Hyuk Park 함수템플릿소개 함수템플릿 한번의함수정의로서로다른자료형에대해적용하는함수 예 int abs(int n) return n < 0? -n : n; double abs(double n) 함수 return n < 0? -n : n; //

More information

[Brochure] KOR_TunA

[Brochure] KOR_TunA LG CNS LG CNS APM (TunA) LG CNS APM (TunA) 어플리케이션의 성능 개선을 위한 직관적이고 심플한 APM 솔루션 APM 이란? Application Performance Management 란? 사용자 관점 그리고 비즈니스 관점에서 실제 서비스되고 있는 어플리케이션의 성능 관리 체계입니다. 이를 위해서는 신속한 장애 지점 파악 /

More information

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

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id=entitymanagerfactory class=org.springframework.orm.jpa.localentitymanagerfactorybean p:persistenceunitname= JPA 와 Hibernate - 스프링의 JDBC 대신에 JPA를이용한 DB 데이터검색작업 - JPA(Java Persistence API) 는자바의 O/R 매핑에대한표준지침이며, 이지침에따라설계된소프트웨어를 O/R 매핑프레임워크 라고한다. - O/R 매핑 : 객체지향개념인자바와관계개념인 DB 테이블간에상호대응을시켜준다. 즉, 객체지향언어의인스턴스와관계데이터베이스의레코드를상호대응시킨다.

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

JAVA PROGRAMMING 실습 09. 예외처리

JAVA PROGRAMMING 실습 09. 예외처리 2015 학년도 2 학기 예외? 프로그램실행중에발생하는예기치않은사건 예외가발생하는경우 정수를 0으로나누는경우 배열의크기보다큰인덱스로배열의원소를접근하는경우 파일의마지막부분에서데이터를읽으려고하는경우 예외처리 프로그램에문제를발생시키지않고프로그램을실행할수있게적절한조치를취하는것 자바는예외처리기를이용하여예외처리를할수있는기법제공 자바는예외를객체로취급!! 나뉨수를입력하시오

More information

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins Project 1-3: Implementing DML Due: 2015/11/11 (Wed), 11:59 PM 이번프로젝트의목표는프로젝트 1-1 및프로젝트 1-2에서구현한프로그램에기능을추가하여간단한 DML을처리할수있도록하는것이다. 구현한프로그램은 3개의 DML 구문 (insert, delete, select) 을처리할수있어야한다. 테이블데이터는파일에저장되어프로그램이종료되어도사라지지않아야한다.

More information

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

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345]) 예외와예외클래스 예외처리 514760-1 2016 년가을학기 12/08/2016 박경신 오류의종류 에러 (Error) 하드웨어의잘못된동작또는고장으로인한오류 에러가발생되면 JVM실행에문제가있으므로프로그램종료 정상실행상태로돌아갈수없음 예외 (Exception) 사용자의잘못된조작또는개발자의잘못된코딩으로인한오류 예외가발생되면프로그램종료 예외처리 추가하면정상실행상태로돌아갈수있음

More information

Microsoft Word - src.doc

Microsoft Word - src.doc IPTV 서비스탐색및콘텐츠가이드 RI 시스템운용매뉴얼 목차 1. 서버설정방법... 5 1.1. 서비스탐색서버설정... 5 1.2. 컨텐츠가이드서버설정... 6 2. 서버운용방법... 7 2.1. 서비스탐색서버운용... 7 2.1.1. 서비스가이드서버실행... 7 2.1.2. 서비스가이드정보확인... 8 2.1.3. 서비스가이드정보추가... 9 2.1.4. 서비스가이드정보삭제...

More information

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc NTAS and FRAME BUILDER Install Guide NTAS and FRAME BUILDER Version 2.5 Copyright 2003 Ari System, Inc. All Rights reserved. NTAS and FRAME BUILDER are trademarks or registered trademarks of Ari System,

More information

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

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 2. 관련연구 2.1 MQTT 프로토콜 Fig. 1. Topic-based Publish/Subscribe Communication Model. Table 1. Delivery and Guarantee by MQTT QoS Level 2.1 MQTT-SN 프로토콜 Fig. 2. MQTT-SN

More information

JDBC 소개및설치 Database Laboratory

JDBC 소개및설치 Database Laboratory JDBC 소개및설치 JDBC } What is the JDBC? } JAVA Database Connectivity 의약어 } 자바프로그램안에서 SQL 을실행하기위해데이터베이스를연결해주는응용프로그램인터페이스 } 연결된데이터베이스의종류와상관없이동일한방법으로자바가데이터베이스내에서발생하는트랜잭션을제어할수있도록하는환경을제공 2 JDBC Driver Manager }

More information

윈도우시스템프로그래밍

윈도우시스템프로그래밍 데이터베이스및설계 MySQL 을위한 MFC 를사용한 ODBC 프로그래밍 2012.05.10. 오병우 컴퓨터공학과금오공과대학교 http://www.apmsetup.com 또는 http://www.mysql.com APM Setup 설치발표자료참조 Department of Computer Engineering 2 DB 에속한테이블보기 show tables; 에러발생

More information

슬라이드 1

슬라이드 1 Visual 2008 과신속한애플리케이션 개발 Smart Client 정병찬 ( 주 ) 프리엠컨설팅개발팀장 johnharu@solutionbuilder.co.kr http://www.solutionbuilder.co.kr 목차 Visual Studio 2008 소개 닷넷프레임워크 3.5 소개 Language Integrated Query (LINQ) 어플리케이션개발홖경

More information

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D> Power Java 제 8 장클래스와객체 I 이번장에서학습할내용 클래스와객체 객체의일생직접 메소드클래스를 필드작성해 UML 봅시다. QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는필드와메소드로이루어진다.

More information

문서 템플릿

문서 템플릿 HDSI 툴분석 [sql injection 기술명세서 ] Sql injection 기술명세서 Ver. 0.01 이문서는 sql injection 기술명세가범위입니다. Copyrights Copyright 2009 by CanvasTeam@SpeeDroot( 장경칩 ) All Rights Reserved. 장경칩의사전승인없이본내용의전부또는일부에대한복사, 전재,

More information

어댑터뷰

어댑터뷰 04 커스텀어댑터뷰 (Custom Adapter View) 커스텀어댑터뷰 (Custom Adapter View) 커스텀어댑터뷰 (Custom Adatper View) 란? u 어댑터뷰의항목하나는단순한문자열이나이미지뿐만아니라, 임의의뷰가될수 있음 이미지뷰 u 커스텀어댑터뷰설정절차 1 2 항목을위한 XML 레이아웃정의 어댑터정의 3 어댑터를생성하고어댑터뷰객체에연결

More information

MVVM 패턴의 이해

MVVM 패턴의 이해 Seo Hero 요약 joshua227.tistory. 2014 년 5 월 13 일 이문서는 WPF 어플리케이션개발에필요한 MVVM 패턴에대한내용을담고있다. 1. Model-View-ViewModel 1.1 기본개념 MVVM 모델은 MVC(Model-View-Contorl) 패턴에서출발했다. MVC 패턴은전체 project 를 model, view 로나누어

More information

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어서가장중요한부분이라고도할수있기때문입니다. 1. 새로운메크로생성 새메크로만들기버튺을클릭하여파일을생성합니다. 2. 메크로저장 -

More information

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터 Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터를사용자에게전송하게되며 Parsing 단계에서실행계획이생성된다. Bind 변수를사용하는 SQL

More information

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

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

03. ADO 닷넷 ADO 닷넷이란? ADO(ActiveX Data Objects) 의닷넷버전 비연결방식 (Discected Mdel) 제공 데이터베이스와연결후필요한데이터를가져온후에, 접속을바로끊고나서도데이터를계속해서처리할수있는방법이필요 자원을계속많이확보가능 자료의처리

03. ADO 닷넷 ADO 닷넷이란? ADO(ActiveX Data Objects) 의닷넷버전 비연결방식 (Discected Mdel) 제공 데이터베이스와연결후필요한데이터를가져온후에, 접속을바로끊고나서도데이터를계속해서처리할수있는방법이필요 자원을계속많이확보가능 자료의처리 03. ADO 닷넷 탄생배경 인터넷환경에가장적합한기술필요 통합적으로관리할수있는기술이필요 더많은양의데이터를더빠르게서비스할수있는인터넷응용프로그램필요성대두 ' 데이터저장소 개념의필요 어느한컴퓨터에의존하는것이아니라여러다른장소에서언제든서비스받도록되어야함 데이터가어디에있던어떻게저장되어있던동일한인터페이스로개발필요 XML 을지원 표준화된자료전달방식의필요 03. ADO 닷넷

More information

MySQL-.. 1

MySQL-.. 1 MySQL- 기초 1 Jinseog Kim Dongguk University jinseog.kim@gmail.com 2017-08-25 Jinseog Kim Dongguk University jinseog.kim@gmail.com MySQL-기초 1 2017-08-25 1 / 18 SQL의 기초 SQL은 아래의 용도로 구성됨 데이터정의 언어(Data definition

More information

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호 제이쿼리 () 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호 CSS와마찬가지로, 문서에존재하는여러엘리먼트를접근할수있다. 엘리먼트접근방법 $( 엘리먼트 ) : 일반적인접근방법

More information

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET 135-080 679-4 13 02-3430-1200 1 2 11 2 12 2 2 8 21 Connection 8 22 UniSQLConnection 8 23 8 24 / / 9 3 UniSQL 11 31 OID 11 311 11 312 14 313 16 314 17 32 SET 19 321 20 322 23 323 24 33 GLO 26 331 GLO 26

More information

슬라이드 1

슬라이드 1 UNIT 16 예외처리 로봇 SW 교육원 3 기 최상훈 학습목표 2 예외처리구문 try-catch-finally 문을사용핛수있다. 프로그램오류 3 프로그램오류의종류 컴파일에러 (compile-time error) : 컴파일실행시발생 럮타임에러 (runtime error) : 프로그램실행시발생 에러 (error) 프로그램코드에의해서해결될수없는심각핚오류 ex)

More information

Spotlight on Oracle V10.x 트라이얼프로그램설치가이드 DELL SOFTWARE KOREA

Spotlight on Oracle V10.x 트라이얼프로그램설치가이드 DELL SOFTWARE KOREA Spotlight on Oracle V10.x DELL SOFTWARE KOREA 2016-11-15 Spotlight on Oracle 목차 1. 시스템요구사항... 2 1.1 지원하는데이터베이스...2 1.2 사용자설치홖경...2 2. 프로그램설치... 3 2.1 설치프로그램실행...3 2.2 라이선스사용관련내용확인및사용동의...3 2.3 프로그램설치경로지정...4

More information

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 04-UDP Programming.ppt Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

제11장 프로세스와 쓰레드

제11장 프로세스와 쓰레드 제9장자바쓰레드 9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2 9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드

More information

PowerPoint Template

PowerPoint Template JavaScript 회원정보 입력양식만들기 HTML & JavaScript Contents 1. Form 객체 2. 일반적인입력양식 3. 선택입력양식 4. 회원정보입력양식만들기 2 Form 객체 Form 객체 입력양식의틀이되는 태그에접근할수있도록지원 Document 객체의하위에위치 속성들은모두 태그의속성들의정보에관련된것

More information

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등

More information

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

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 객체지향프로그래밍 IT CookBook, 자바로배우는쉬운자료구조 q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 q 객체지향프로그래밍의이해 v 프로그래밍기법의발달 A 군의사업발전 1 단계 구조적프로그래밍방식 3 q 객체지향프로그래밍의이해 A 군의사업발전 2 단계 객체지향프로그래밍방식 4 q 객체지향프로그래밍의이해 v 객체란무엇인가

More information

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역 WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역시쉽게해결할수있다. 이번화이트페이퍼에서는 Window Function 중순위 RANK, ROW_NUMBER,

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 오류처리 손시운 ssw5176@kangwon.ac.kr 오류메시지를분석한다. 오류메시지에서많은내용을알수있다. 2 디버깅 디버거를사용하면프로그램에서쉽게오류를감지하고진단할수있다. 디버거는중단점을설정하여서프로그램의실행을제어할수있으며문장 단위로실행하거나변수의값을살펴볼수있다. 3 이클립스에서디버깅 4 이클립스에서디버깅 5 이클립스의디버깅명령어 6 예외처리

More information

C# Programming Guide - Types

C# Programming Guide - Types C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든

More information

VS_chapter10

VS_chapter10 Part. Chapter 10 ActiveX Data Objects.NET(ADO.NET).NET, ADO.NET..NET ADO(ActiveX Data Objects). ADO. ADO,. ADO,.NET ADO.NET... ADO.NET ADO Connection DataReader Command DataAdapter DataSet DataView DataSet

More information

arcplan Enterprise 6 Charting Facelifts

arcplan Enterprise 6 Charting Facelifts SQL Server Analysis Services Tip 잘레시아 Copyright c 2010 Zalesia Co., Ltd. Agenda I II SSAS Non-Aggregatable 측정값처리 Copyright c 2010 Zalesia Co., Ltd. 2 Copyright c 2010 Zalesia Co., Ltd. 3 STEP1: Sales 큐브를위해데이터를미리준비한다.

More information

Visual Basic 반복문

Visual Basic 반복문 학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For

More information

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

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 인터페이스 배효철 th1g@nate.com 1 목차 인터페이스의역할 인터페이스선언 인터페이스구현 인터페이스사용 타입변환과다형성 인터페이스상속 디폴트메소드와인터페이스확장 2 인터페이스의역할 인터페이스란? 개발코드와객체가서로통신하는접점 개발코드는인터페이스의메소드만알고있으면 OK 인터페이스의역할 개발코드가객체에종속되지않게 -> 객체교체할수있도록하는역할 개발코드변경없이리턴값또는실행내용이다양해질수있음

More information

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074> SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......

More information

서현수

서현수 Introduction to TIZEN SDK UI Builder S-Core 서현수 2015.10.28 CONTENTS TIZEN APP 이란? TIZEN SDK UI Builder 소개 TIZEN APP 개발방법 UI Builder 기능 UI Builder 사용방법 실전, TIZEN APP 개발시작하기 마침 TIZEN APP? TIZEN APP 이란? Mobile,

More information

Microsoft PowerPoint - 10Àå.ppt

Microsoft PowerPoint - 10Àå.ppt 10 장. DB 서버구축및운영 DBMS 의개념과용어를익힌다. 간단한 SQL 문법을학습한다. MySQL 서버를설치 / 운영한다. 관련용어 데이터 : 자료 테이블 : 데이터를표형식으로표현 레코드 : 테이블의행 필드또는컬럼 : 테이블의열 필드명 : 각필드의이름 데이터타입 : 각필드에입력할값의형식 학번이름주소연락처 관련용어 DB : 테이블의집합 DBMS : DB 들을관리하는소프트웨어

More information

슬라이드 1

슬라이드 1 SW 개발도구연계 Jenkins - Redmine - Mylyn 목차 Intro Mylyn - Redmine 연계 Mylyn - Jenkins 연계및빌드실행 Mylyn에서 Redmine 일감처리 Intro 연계도구 웹기반의프로젝트관리도구 한글화가잘되어있어사용저변이넓음 플러그인을통해다양한도구와연계가능 Eclipse 용 ALM(Application Lifecycle

More information

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

gnu-lee-oop-kor-lec06-3-chap7 어서와 Java 는처음이지! 제 7 장상속 Super 키워드 상속과생성자 상속과다형성 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Base{ public Base(String msg) { System.out.println("Base() 생성자 "); ; class Derived extends Base

More information

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자 SQL Developer Connect to TimesTen 유니원아이앤씨 DB 팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 2010-07-28 작성자 김학준 최종수정일 2010-07-28 문서번호 20100728_01_khj 재개정이력 일자내용수정인버전

More information

JVM 메모리구조

JVM 메모리구조 조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.

More information

4S 1차년도 평가 발표자료

4S 1차년도 평가 발표자료 모바일 S/W 프로그래밍 안드로이드개발환경설치 2012.09.05. 오병우 모바일공학과 JDK (Java Development Kit) SE (Standard Edition) 설치순서 Eclipse ADT (Android Development Tool) Plug-in Android SDK (Software Development Kit) SDK Components

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information

윈도우시스템프로그래밍

윈도우시스템프로그래밍 데이타베이스 MySQL 을위한 MFC 를사용한 ODBC 프로그래밍 2013.05.15. 오병우 컴퓨터공학과금오공과대학교 http://www.apmsetup.com 또는 http://www.mysql.com APM Setup 설치발표자료참조 Department of Computer Engineering 2 DB 에속한테이블보기 show tables; 에러발생

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 예외처리 배효철 th1g@nate.com 1 목차 예외와예외클래스 실행예외 예외처리코드 예외종류에따른처리코드 자동리소스닫기 예외처리떠넘기기 사용자정의예외와예외발생 예외와예외클래스 구문오류 예외와예외클래스 구문오류가없는데실행시오류가발생하는경우 예외와예외클래스 import java.util.scanner; public class ExceptionExample1

More information

슬라이드 1

슬라이드 1 전자정부개발프레임워크 1 일차실습 LAB 개발환경 - 1 - 실습목차 LAB 1-1 프로젝트생성실습 LAB 1-2 Code Generation 실습 LAB 1-3 DBIO 실습 ( 별첨 ) LAB 1-4 공통컴포넌트생성및조립도구실습 LAB 1-5 템플릿프로젝트생성실습 - 2 - LAB 1-1 프로젝트생성실습 (1/2) Step 1-1-01. 구현도구에서 egovframe>start>new

More information

WCF를 이용한 엔터프라이즈 커뮤니케이션에 있어서의 ‘MUST HAVE’ 아이템

WCF를 이용한 엔터프라이즈 커뮤니케이션에 있어서의 ‘MUST HAVE’ 아이템 WCF 를이용한엔터프라이즈커뮤니케이션에있어서의 MUST HAVE 아이템 기업내통신을위한 WCF 의다양한기능들 드원테크놀로지 수석컨설턴트 유경상 Agenda WCF As Enterprise Communication Infra Requirement of Enterprise Communication Flexibility of WCF in Enterprise Environment

More information

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요 . 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요소로써안드로이드시스템에서는 Activities, Services, Content Providers,

More information

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f JPA 에서 QueryDSL 사용하기위해 JPAQuery 인스턴스생성방법 http://ojc.asia, http://ojcedu.com 1. JPAQuery 를직접생성하기 JPAQuery 인스턴스생성하기 QueryDSL의 JPAQuery API를사용하려면 JPAQuery 인스턴스를생성하면된다. // entitymanager는 JPA의 EntityManage

More information

vRealize Automation용 VMware Remote Console - VMware

vRealize Automation용 VMware Remote Console - VMware vrealize Automation 용 VMware Remote Console VMware Remote Console 9.0 이문서는새버전으로교체되기전까지나열된각제품버전및모든이후버전을지원합니다. 이문서에대한최신버전을확인하려면 http://www.vmware.com/kr/support/pubs 를참조하십시오. KO-002230-00 vrealize Automation

More information

Visual Studio online Limited preview 간략하게살펴보기

Visual Studio online Limited preview 간략하게살펴보기 11월의주제 Visual Studio 2013 제대로파헤쳐보기! Visual Studio online Limited preview 간략하게살펴보기 ALM, 언제어디서나 연결된 IDE Theme와 Visual Design 편집기의강화된생산성기능들성능최적화및디버깅개선 Microsoft 계정으로 IDE에서로그인가능다양한머신사이에서개발환경유지다양한디바이스에걸쳐설정을동기화개선된

More information

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

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

게시판 스팸 실시간 차단 시스템

게시판 스팸 실시간 차단 시스템 오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP

More information

10.ppt

10.ppt : SQL. SQL Plus. JDBC. SQL >> SQL create table : CREATE TABLE ( ( ), ( ),.. ) SQL >> SQL create table : id username dept birth email id username dept birth email CREATE TABLE member ( id NUMBER NOT NULL

More information

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 ALTIBASE HDB 6.5.1.5.10 Patch Notes 목차 BUG-46183 DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG-46249 [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4 BUG-46266 [sm]

More information

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

@OneToOne(cascade = = addr_id) private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a 1 대 1 단방향, 주테이블에외래키실습 http://ojcedu.com, http://ojc.asia STS -> Spring Stater Project name : onetoone-1 SQL : JPA, MySQL 선택 http://ojc.asia/bbs/board.php?bo_table=lecspring&wr_id=524 ( 마리아 DB 설치는위 URL

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 7 장클래스와객체 이번장에서학습할내용 객체지향이란? 객체 메시지 클래스 객체지향의장점 String 클래스 객체지향개념을완벽하게이해해야만객체지향설계의이점을활용할수있다. 실제세계는객체로이루어진다. 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 절차지향과객체지향 절차지향프로그래밍 (procedural programming): 문제를해결하는절차를중요하게생각하는방법

More information

Network Programming

Network Programming Part 5 확장된 Network Programming 기술 1. Remote Procedure Call 2. Remote Method Invocation 3. Object Request Broker 2. Java RMI

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 데이터베이스및설계 Chap 1. 데이터베이스환경 (#2/2) 2013.03.04. 오병우 컴퓨터공학과 Database 용어 " 데이타베이스 용어의기원 1963.6 제 1 차 SDC 심포지움 컴퓨터중심의데이타베이스개발과관리 Development and Management of a Computer-centered Data Base 자기테이프장치에저장된데이터파일을의미

More information

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

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가 혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가웹페이지내에뒤섞여있어서웹페이지의화면설계가점점어려워진다. - 서블릿이먼저등장하였으나, 자바내에

More information

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과 1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과 학습내용 1. Java Development Kit(JDK) 2. Java API 3. 자바프로그래밍개발도구 (Eclipse) 4. 자바프로그래밍기초 2 자바를사용하려면무엇이필요한가? 자바프로그래밍개발도구 JDK (Java Development Kit) 다운로드위치 : http://www.oracle.com/technetwork/java/javas

More information

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate ALTIBASE HDB 6.1.1.5.6 Patch Notes 목차 BUG-39240 offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG-41443 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate 한뒤, hash partition

More information

Endpoint Protector - Active Directory Deployment Guide

Endpoint Protector - Active Directory Deployment Guide Version 1.0.0.1 Active Directory 배포가이드 I Endpoint Protector Active Directory Deployment Guide 목차 1. 소개...1 2. WMI 필터생성... 2 3. EPP 배포 GPO 생성... 9 4. 각각의 GPO 에해당하는 WMI 연결... 12 5.OU 에 GPO 연결... 14 6. 중요공지사항

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 1 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

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

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O Orange for ORACLE V4.0 Installation Guide ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE...1 1....2 1.1...2 1.2...2 1.2.1...2 1.2.2 (Online Upgrade)...11 1.3 ORANGE CONFIGURATION ADMIN...12 1.3.1 Orange Configuration

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 유니티와아두이노를활용한 VR 컨트롤러개발 Part 06 헬로앱스코딩교육 김영준 공학박사, 목원대학교겸임교수前 Microsoft 수석연구원 splduino@gmail.com http://www.helloapps.co.kr 키보드로물체생성하기 키보드로물체생성하기 public GameObject CubeObject; public GameObject MyCamera;

More information

쉽게

쉽게 Power Java 제 4 장자바프로그래밍기초 이번장에서학습할내용 자바프로그램에대한기초사항을학습 자세한내용들은추후에. Hello.java 프로그램 주석 주석 (comment): 프로그램에대한설명을적어넣은것 3 가지타입의주석 클래스 클래스 (class): 객체를만드는설계도 ( 추후에학습 ) 자바프로그램은클래스들로구성된다. 그림 4-1. 자바프로그램의구조 클래스정의

More information

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

Spring Data JPA Many To Many 양방향 관계 예제 Spring Data JPA Many To Many 양방향관계예제 오라클자바커뮤니티 (ojc.asia, ojcedu.com) 엔티티매핑 (Entity Mapping) M : N 연관관계 사원 (Sawon), 취미 (Hobby) 는다 : 다관계이다. 사원은여러취미를가질수있고, 하나의취미역시여러사원에할당될수있기때문이다. 보통관계형 DB 에서는다 : 다관계는 1

More information

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - C++ 5 .pptx C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수 연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 3 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

Cluster management software

Cluster management software 자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민 기본예제 예외클래스를정의하고사용하는예제 class NewException extends Exception { public class ExceptionTest { static void methoda() throws NewException { System.out.println("NewException

More information

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상 Android 용 Brother Image Viewer 설명서 버전 0 KOR 아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상표입니다. Android는

More information

오버라이딩 (Overriding)

오버라이딩 (Overriding) WindowEvent WindowEvent 윈도우가열리거나 (opened) 닫힐때 (closed) 활성화되거나 (activated) 비활성화될때 (deactivated) 최소화되거나 (iconified) 복귀될때 (deiconified) 윈도우닫힘버튼을누를때 (closing) WindowEvent 수신자 abstract class WindowListener

More information

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드] Google Map View 구현 학습목표 교육목표 Google Map View 구현 Google Map 지원 Emulator 생성 Google Map API Key 위도 / 경도구하기 위도 / 경도에따른 Google Map View 구현 Zoom Controller 구현 Google Map View (1) () Google g Map View 기능 Google

More information