iBATIS-SqlMaps-2

Size: px
Start display at page:

Download "iBATIS-SqlMaps-2"

Transcription

1 ibatis SQL Maps 개발자가이드 Version 2.0 June 17, 2004 번역 : 이동국 (fromm0@gmail.com) 오타및오역은위메일주소로보내주시기바랍니다. 1

2 소개 SQL Maps 프레임워크는당신이관계형데이터베이스에접근할때필요한자바코드를현저하게줄일수있도록도와줄것이다. SQL Maps는간단한 XML서술자를사용해서간단하게자바빈즈를 SQL statement에맵핑시킨다. 간단함이란다른프레임워크와객체관계맵핑툴에비해 SQL Maps의가장큰장점이다. SQL Maps를사용하기위해서당신은자바빈즈와 XML 그리고 SQL에친숙할필요가있다. 여기엔배워야할것도거의없고테이블을조인하거나복잡한쿼리문을수행하기위해필요한복잡한스키마도없다. SQL Maps를사용하면당신은실제 SQL문의모든기능을가질수있다. SQL Maps (com.ibatis.sqlmap.*) 개념 SQL Map API 는프로그래머에게자바빈즈를 PreparedStatement 파라미터와 ResultSets 으로쉽게맵핑할수있도록한다. SQL Maps 의기본적인생각은간단함 (simple) 이다. 이는자바코드의 20% 를사용하여 JDBC 기능의 80% 를제공하는간단한프레 임워크라는뜻이다. 이것은어떻게작동하는가.? SQL Maps 는자바빈즈, Map 구현, 원시래퍼타입 (String, Integer ) 그리고 SQL 문을위한 XML 문서를맵핑하기위한 XML 서술자를사용하는매우간단한프레임워크를제공한다. 다음은생명주기에대한높은레벨의서술이다. 1) 파라미터 ( 자바빈즈, Map 또는원시래퍼 ) 로써객체를제공한다. 파라미터객체는 update 문내에입력값을셋팅하 기위해사용되거나쿼리문의 where 절을셋팅하기위해서사용된다. 2) 맵핑된 statement 을실행한다. 이단계는마법이일어나는곳이다. SQL Maps 프레임워크는 PreparedStatement 인스턴스를생성할것이고제공된파라미터객체를사용해서파라미터를셋팅한다. 그리고 statement 를실행하고 ResultSet 으로부터결과객체를생성한다. 3) update 의경우에영향을미친 rows 의숫자를반환한다. 조회문일경우에한개 (single) 의객체또는컬렉션객 체를반환한다. 파라미터처럼결과객체는자바빈즈, Map 원시타입래퍼또는 XML 이될수있다. 밑의다이어그램은서술된것을설명한다. 2

3 설치 SQL Maps 프레임워크설치는간단하게클래스패스에필요한 JAR 파일을두면된다. 이것은 JVM 시작시정의된클래스패스에 두거나웹애플리케이션의 /WEB-INF/lib 에둘수도있다. 자바클래스패스에대해서는다음의자원을참조하라 ibatis 는다음의 JAR 파일을클래스패스에두면된다. File Name Description Required ibatis-common.jar ibatis Common Utilities YES ibatis-sqlmap.jar ibatis SQL Maps Framework YES ibatis-dao.jar ibatis Data Access Objects Framework. NO JAR 파일과의존성 프레임워크가너무많은의존성을가진다면이것은애플리케이션이나다른프레임워크에통합되기힘들게만든다. 2.0의중요한키포인트는의존성관리와제거의중점을두었다. 그러므로만약당신이 jdk1.4를사용한다면실제의존적인것은 Jakarta Commons Logging 프레임워크뿐이다. 이추가적인 JAR파일은배포판의 /lib/optional디렉토리에서찾을수있다. 그들은기능에의해분류된다. 다음은추가적인패키지를사용할때필요한것들의목록이다. Description When to Use Directories 3

4 Legacy JDK Support ibatis Backward Compatibility Runtime Bytecode Enhancement DataSource Implementation Distributed Caching Logging Solution 만약에당신이 JDK1.4보다하위버전을사용하고당신의애플리케이션서버가이런 JAR파일을제공하지않는다면당신은이런옵션패키지가필요할것이다. 당신이 ibatis의예전버전 DAO(1.x) 프레임워크를사용하고있거나 SQL Maps(1.x) 의예전버전을사용하고있다면이디렉토리의 JAR파일을간단하포함시킴으로써계속작업을할수있다. 만약당신이늦은 (lazy) 로딩과성능에대해고려하기위한 CGLIB2.0 bytecode 개선을사용하길원한다면당신이 Jakarta DBCP Connection pool을사용하길원한다면중앙집중적이거나분산캐슁지원을위한 OSCache를사용하길원한다면 Log4J 로깅을사용하길원한다면 /lib/optional/jdbc /lib/optional/jta /lib/optional/xml /lib/optional/compatibility /lib/optional/enhancement /lib/optional/dbcp /lib/optional/caching /lib/optional/logging 1.x 에서업그레이드하기 당신은업그레이드할것인가.? 만약당신이업그레이드를시도한다면결정할수있는가장좋은방법이다. 여기에몇가지업그레이드절차가있다. 1. 버전 2.0은 1.x릴리즈와거의완벽한호완성을가지도록유지되었다. 그래서몇몇사람들에게는단순히 JAR파일만교체하는것으로충분할것이다. 이것은최소한의이득을발생시키지만가장간단하다. 당신은당신의 XML파일이나자바코드를변경할필요가없다. 몇몇모순되는것들이발견될지도모른다. 2. 두번째는당신의 XML파일을 2.0스펙에적합하도록변경하는것이다. 하지만이는 1.x 자바 API를그대로사용한다. 적은호환성이슈내안전한해결법은맵핑파일사이에발생한다. Ant작업은당신을위해 XML파일을변환하기위해서프레임워크에포함된다. 3. 세번째옵션은당신의 XML파일과자바코드를변환하는것이다. 자바코드를변환하기위한툴은없다. 그래서이것은손으로직접해야한다. 4. 마지막옵션은전체를업그레이드하지않는것이다. 만약에당신이어렵다고느낀다면 1.x릴리즈에서시스템이작동하는것을두려워하지마라. 당신의오래된애플리케이션을그대로놔두는것은나쁜생각이아니다. 만약에오래된애플리케이션이인식적인면에서제대로리팩토링되어있다면당신은 SQL Maps를업그레이드잘할수있을것이다. 1.x 에서 2.x 으로 XML 설정파일변환하기 2.0프레임워크는 Ant빌드시스템을통해수행되는 XML문서변환기를포함한다. 당신의 XML문서를변환하는것은 1.x코드가작동중에자동으로오래된 XML파일을변환하는것처럼옵션적이다. 여전히당신이업그레이드를함으로써편안하게당신의파일을변환하는것이좋은생각이다. 당신은다소적은호환적인이슈를경험할것이고새로운기능중몇개의장점을얻을수있을것이다 ( 비록당신이 1.x자바 API을사용하더라도.). 4

5 Ant 작업은당신의 build.xml 파일내에다음과비슷하게보일것이다. <taskdef name="convertsqlmaps" classname="com.ibatis.db.sqlmap.upgrade.converttask" classpathref="classpath"/> <target name="convert"> <convertsqlmaps todir="d:/targetdirectory/" overwrite="true"> <fileset dir="d/sourcedirectory/"> <include name="**/maps/*.xml"/> </fileset> </convertsqlmaps> </target> 당신이보는것처럼이것은 Ant 복사작업과거의같고사실이것은 Ant 복사작업을확장한것이다. 그래서당신은복사하는작 업을하는어떤것도할수있다. JAR 파일들 : 예전것을빼내고새것을넣자. 업그레이드를할때존재하는 ( 예전의 ) ibatis 파일과의존적인것들을모두지우고새파일을대체하는것이좋은생각이다. 여전히필요한당신의다른컴포넌트또는프레임워크를모두지우지않도록주의해라. JAR 파일의대부분은당신환경에의 존적이다. JAR 파일과의존적인것에대해서는위에서서술된것을보아라. 다음의테이블은예전파일과새파일을목록화한다. Old Files ibatis-db.jar 1.2.9b 버전에서부터이파일은다음의 3 개의파일로 분리되었다. ibatis-common.jar ibatis-dao.jar ibatis-sqlmap.jar commons-logging.jar commons-logging-api.jar commons-collections.jar commons-dbcp.jar commons-pool.jar oscache.jar jta.jar jdbc2_0-stdext.jar xercesimpl.jar xmlparserapis.jar jdom.jar New Files ibatis-common.jar ( 필수 ) ibatis-sqlmap.jar ( 필수 ) ibatis-dao.jar (DAO프레임워크를사용하는것에따라옵션 ) commons-logging jar ( 필수 ) commons-collections-2-1.jar ( 옵션 ) commons-dbcp-1-1.jar ( 옵션 ) commons-pool-1-1.jar ( 옵션 ) oscache jar ( 옵션 ) jta-1-0-1a.jar ( 옵션 ) jdbc2_0-stdext.jar ( 옵션 ) xercesimpl jar ( 옵션 ) xmlparserapis jar ( 옵션 ) xalan jar ( 옵션 ) log4j jar ( 옵션 ) cglib-full-2-0-rc2.jar ( 옵션 ) 이가이드의나머지는당신이 SQL Maps 를사용하는것에대해소개할것이다. 5

6 SQL Map XML 설정파일 ( SQL Maps 는데이터소스에대한설정, 쓰레드관리와같은 SQL Maps 와다른옵션에대한설정을제공하는중앙집중적인 XML 설정파일을사용해서설정된다. 다음은 SQL Maps 설정파일의예이다. SqlMapConfig.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE sqlmapconfig PUBLIC "-//ibatis.com//dtd SQL Map Config 2.0//EN" " <!--Always ensure to use the correct XML header as above! --> <sqlmapconfig> <!--The properties (name=value) in the file specified here can be used placeholders in this config file (e.g. ${driver}. The file is relative to the classpath and is completely optional. --> <properties resource=" examples/sqlmap/maps/sqlmapconfigexample.properties " /> <!--These settings control SqlMapClient configuration details, primarily to do with transaction management. They are all optional (more detail later in this document). --> <settings cachemodelsenabled="true" enhancementenabled="true" lazyloadingenabled="true" maxrequests="32" maxsessions="10" maxtransactions="5" usestatementnamespaces="false" /> <!--Type aliases allow you to use a shorter name for long fully qualified class names. --> <typealias alias="order" type="testdomain.order"/> <!--Configure a datasource to use with this SQL Map using SimpleDataSource. Notice the use of the properties from the above resource --> <transactionmanager type="jdbc" > <datasource type="simple"> <property name="jdbc.driver" value="${driver}"/> <property name="jdbc.connectionurl" value="${url}"/> <property name="jdbc.username" value="${username}"/> <property name="jdbc.password" value="${password}"/> <property name="jdbc.defaultautocommit" value="true" /> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/> <property name="pool.maximumcheckouttime" value="120000"/> <property name="pool.timetowait" value="500"/> <property name="pool.pingquery" value="select 1 from ACCOUNT"/> <property name="pool.pingenabled" value="false"/> <property name="pool.pingconnectionsolderthan" value="1"/> <property name="pool.pingconnectionsnotusedfor" value="1"/> 6

7 </datasource> </transactionmanager> <!--Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths are relative to the classpath. For now, we only have one --> <sqlmap resource="examples/sqlmap/maps/person.xml" /> </sqlmapconfig> 이문서의다음부분은 SQL Maps 설정파일의다양한부분을논의한다. <properties> 요소 SQL Maps은 SQL Maps XML설정파일과함께속하는표준적인자바속성파일 (name=value) 을지정하는하나의 <properties> 요소를가질수있다. 그렇게함으로써속성파일내에각각의이름지어진값들은 SQL Maps설정파일내에참조될수있는변수가될수있고모든 SQL Maps는내부에서참조된다. 예를들면속성파일이다음을포함한다면 driver=org.hsqldb.jdbcdriver SQL Maps 설정파일또는설정문서에의해참조되는각각의 SQL Maps 는 ${driver} 형태로사용가능하고 org.hsqldb.jdbcdriver 라는값이참조된다. 예를들면 <property name="jdbc.driver" value="${driver}"/> 이것은빌드되거나테스트그리고배치되는동안편리하게된다. 이것은다중환경이나설정파일을위해자동화툴을사용하는당신의애플리케이션을쉽게인식하도록한다. 속성은클래스패스나어떤유효한 URL로부터로드될수있다. 예를들면고정된파일경로를위해다음처럼사용한다. <properties url= file:///c:/config/my.properties /> <settings> 요소 <settings> 요소는 XML 파일을빌드하는 SqlMapClient 인스턴스를위해다양한옵션과최적화를설정하도록한다. setting 요 소와그것의모든속성값은모두옵션적이다. 제공되는속성값과그것들의다양한행위는다음의테이블에서서술된다. maxrequests 이것은한꺼번에 SQL문을수행할수있는쓰레드의수이다. 셋팅값보다많은쓰레드는다른쓰레드가수행을완료할때까지블록된다. 다른 DBMS는다른제한을가진다. 이것은최소한 10개의 maxtransactions이고언제나 maxsessions과 maxtransactions보다크다. 종종동시요청값의최대치를줄이면성능향상을보여준다. maxsessions 예 : maxrequests= 256 Default: 512 이것은주어진시간동안활성될수있는세션의수이다. 세션은명시적으로주어질수도있고프로그램적으로요청될수도있고쓰레드가 SqlMapClient 인스턴스를사용할때마다자동적으로생성될수도있다. 이것은언제나 7

8 maxtransaction 보다같거나커야하고 maxrequests 보다작아야한다. 동 시세션값의최대치를줄이면전체적인메모리사용량을줄일수있다. 예 : maxsessions= 64 Default: 128 maxtransactions 이것은한꺼번에 SqlMapClient.startTransaction() 에들어갈수있는쓰레드의최대갯수이다. 셋팅값보다많은쓰레드는다른쓰레드가나올때까지블록된다. 다른 DBMS는다른제한을가진다. 이값은언제나 maxsessions보다작거나같아야하고 maxrequests보다작아야한다. 종종동시트랜잭션의최대치를줄이면성능향상을보여준다. 예 : maxtransactions= 16 Default: 32 cachemodelsenabled 이셋팅은 SqlMapClient 를위한모든캐쉬모델을가능하게하거나가능하 지않게한다. 이것은디버깅시도움이된다. 예 : cachemodelsenabled= true Default: true (enabled) lazyloadingenabled 이셋팅은 SqlMapClient 를위한모든늦은 (lazy) 로딩을가능하게하거나가 능하지않게한다. 이것은디버깅시도움이된다. 예 : lazyloadingenabled= true Default: true (enabled) enhancementenabled 이셋팅은향상된늦은 (lazy) 로딩처럼최적화된자바빈즈속성접근을위해 런타임시바이트코드향상을가능하게한다. 예 : enhancementenabled= true Default: false (disabled) <typealias> 요소 typealias 요소는길고전체적인클래스명을참조하기위한짧은이름을명시하도록한다. 예를들면 <typealias alias="shortname" type="com.long.class.path.class"/> SQL Maps 설정파일에서사용되는미리정의된몇몇 alias 가있다. 그것들은 Transaction Manager Aliases 8

9 JDBC JTA EXTERNAL Data Source Factory Aliases SIMPLE DBCP <transactionmanager> 요소 com.ibatis.sqlmap.engine.transaction.jdbc.jdbctransactionconfig com.ibatis.sqlmap.engine.transaction.jta.jtatransactionconfig com.ibatis.sqlmap.engine.transaction.external.externaltransactionconfig com.ibatis.sqlmap.engine.datasource.simpledatasourcefactory com.ibatis.sqlmap.engine.datasource.dbcpdatasourcefactory 1.0 변환노트 : SQL Maps 1.0 은다중의데이터소스설정을허락했다. 이것은다루기어렵고몇가지나쁜예제를소개했다. 그 러므로 2.0 에서는오직하나의데이터소스만을허락한다. 다중의배치 / 설정을위해서는시스템에의해다르게설정되거나 SQL Maps 를빌드할때파라미터처럼전달되는다중속성파일이추천된다. <transactionmanager> 요소는당신이 SQL Maps 를위한트랜잭션관리를설정하도록한다. type 속성값은사용하기위한 트랜잭션관리자는표시한다. 그값은클래스명이거나타입 alias 일수있다. 3 개의트랜잭션관리자는 JDBC, JTA 그리고 EXTERNAL 중에하나로표시할수있다. JDBC Connection commit() 과 rollback() 메소드를통해트랜잭션를제어하기위한 JDBC 를사용하게된다. JTA 이트랜잭션관리자는 SQL Maps 가다른데이터베이스나트랜잭션자원을포함하는더욱더넓은범위의트랜잭 션을포함하도록하는 JTA 전역트랜잭션를사용한다. 이설정은 JNDI 자원으로부터사용자트랜잭션을위치시키기위 한 UserTransaction 속성값을요구한다. JNDI 데이터소스예제는다음의설정예제에서보라. EXTERNAL 이것은당신자신이트랜잭션을관리하도록한다. 당신은여전히데이터소스를설정할수있지만프레임워크생명주기의부분처럼트랜잭션이커밋되거나롤백되지않는다. 이것은당신애플리케이션의부분이외부적으로 SQL Maps 트랜잭션을관리해야한다는것이다. 이셋팅은비-트랜잭션 ( 예를들면읽기전용 ) 데이터베이스에유용하다. <datasource> 요소 트랜잭션관리자설정의포함된부분은 datasource 요소이고 SQL Maps 를사용하기위한데이터소스를설정하기위한속성값 의집합이다. 여기엔프레임워크에서제공되는 3 가지데이터소스타입이있지만당신은당신만의데이터소스를사용할수도 있다. 포함된 DataSourceFactory 구현은다음에상세하게논의가될것이고각각을위해제공되는설정은아래예제를보라. SimpleDataSourceFactory SimpleDataSource 는데이터소스를제공하는컨테이너가없는경우에 connection 을제공하기위해기본적으로풀 링 (pooling) 데이터소스구현을제공한다. 이것은 ibatis SimpleDataSource connection 풀링을기초로한다. <transactionmanager type="jdbc"> <datasource type="simple"> <property name="jdbc.driver" value="org.postgresql.driver"/> <property name="jdbc.connectionurl" value="jdbc:postgresql://server:5432/dbname"/> <property name="jdbc.username" value="user"/> <property name="jdbc.password" value="password"/> <!--OPTIONAL PROPERTIES BELOW --> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/> <property name="pool.maximumcheckouttime" value="120000"/> 9

10 <property name="pool.timetowait" value="10000"/> <property name="pool.pingquery" value="select * from dual"/> <property name="pool.pingenabled" value="false"/> <property name="pool.pingconnectionsolderthan" value="0"/> <property name="pool.pingconnectionsnotusedfor" value="0"/> </datasource> </transactionmanager> DbcpDataSourceFactory 이구현물은 DataSource API 를통해 connection 풀링서비스를제공하기위해 Jakarta DBCP (Database Connection Pool) 을사용한다. 이 DataSource 는애플리케이션 / 웹컨테이너가 DataSource 구현물을제공하지못 하거나당신이 standalone 애플리케이션을구동할때이상적이다. DbcpDataSourceFactory 를위해명시해야하 는설정파라미터의예제는다음과같다. <transactionmanager type="jdbc"> <datasource type="dbcp"> <property name="jdbc.driver" value="${driver}"/> <property name="jdbc.connectionurl" value="${url}"/> <property name="jdbc.username" value="${username}"/> <property name="jdbc.password" value="${password}"/> <!--OPTIONAL PROPERTIES BELOW --> <property name="pool.maximumactiveconnections" value="10"/> <property name="pool.maximumidleconnections" value="5"/> <property name="pool.maximumwait" value="60000"/> <!--Use of the validation query can be problematic. If you have difficulty, try without it. --> <property name="pool.validationquery" value="select * from ACCOUNT"/> <property name="pool.logabandoned" value="false"/> <property name="pool.removeabandoned" value="false"/> <property name="pool.removeabandonedtimeout" value="50000"/> </datasource> </transactionmanager> JndiDataSourceFactory 이구현물은애플리케이션컨테이너내 JNDI 컨텍스트로부터 DataSource 구현물을가져와야할것이다. 이것은전형적 으로애플리케이션서버를사용중이고컨테이너관리 connection 풀그리고제공되는 DataSource 구현물이있을때사 용한다. JDBC DataSource 구현물에접근하기위한표준적인방법은 JNDI 컨텍스트를통하는것이다. JndiDataSourceFactory 는 JNDI 를통해 DataSource 에접근하는기능을제공한다. 데이터소스내에명시되어야하는 설정파라미터는다음과같다. <transactionmanager type="jdbc" > <datasource type="jndi"> <property name="datasource" value="java:comp/env/jdbc/jpetstore"/> </datasource> </transactionmanager> 위설정은일반적인 JDBC 트랜잭션관리지만컨테이너가자원을관리한다. 당신은다음처럼전역 (global) 트랜잭 션을설정하길원할수도있다. <transactionmanager type="jta" > <property name="usertransaction" value="java:/ctx/con/usertransaction"/> 10

11 <datasource type="jndi"> <property name="datasource" value="java:comp/env/jdbc/jpetstore"/> </datasource> </transactionmanager> UserTransaction 인스턴스가발견될수있는 JNDI 위치를가지키는 UserTransaction 값에주의하라. 좀더넓은범위 의트랜잭션을가지는 SQL Maps 가다른데이터베이스와트랜잭션자원을포함하기위해서는 JTA 트랜잭션관리가 요구된다. <sqlmap> 요소 sqlmap 요소는명시적으로 SQL Map 이나다른 SQL Map 설정파일을포함할때사용한다. SqlMapClient 인스턴스에의해사 용되는각각의 SQL Map XML 파일은반드시선언되어야한다. SQL Map XML 파일은클래스패스나 URL 로부터스트림 (stream) 자원처럼로드될것이다. 당신은 SQL Maps 를명시해야한다. 다음은그에대한예이다. <!--CLASSPATH RESOURCES --> <sqlmap resource="com/ibatis/examples/sql/customer.xml" /> <sqlmap resource="com/ibatis/examples/sql/account.xml" /> <sqlmap resource="com/ibatis/examples/sql/product.xml" /> <!--URL RESOURCES --> <sqlmap url="file:///c:/config/customer.xml " /> <sqlmap url="file:///c:/config/account.xml " /> <sqlmap url="file:///c:/config/product.xml" /> 다음의다양한섹견은 SQL Map XML 파일들의구조에대해서서술한다. SQL Map XML 파일 ( 위예제에서우리는 SQL Maps 의가장간단한형태를보았다. SQL Map 문서구조내에사용가능한다른옵션이있다. 좀더 많은기능을가지는 mapped statement 의예제이다. <sqlmap id= Product > <cachemodel id= productcache type= LRU > <flushinterval hours= 24 /> <property name= size value= 1000 /> </cachemodel> <typealias alias= product type= com.ibatis.example.product /> <parametermap id= productparam class= product > <parameter property= id /> </parametermap> <resultmap id= productresult class= product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> </resultmap> 11

12 </sqlmap> <select id= getproduct parametermap= productparam resultmap= productresult cachemodel= product-cache > select * from PRODUCT where PRD_ID =? </select> 너무많은가.? 비록프레임워크가당신을위해많은것을하더라도간단한 select statement 를위해너무많은추가적인작 업을하는것처럼보인다. 걱정하지마라다음은위의것의축소버전이다. <sqlmap id= Product > <select id= getproduct parameterclass= com.ibatis.example.product resultclass= com.ibatis.example.product > select PRD_ID as id, PRD_DESCRIPTION as description from PRODUCT where PRD_ID = #id# </select> </sqlmap> 지금 SQL Map을행위적인측면에서보면이 statement는정확하게같지는않다. 즉몇가지다른점을가진다. 먼저후자의 statement는캐쉬를명시하지않아서매번의요청시데이터베이스에직접요청한다. 두번째후자의 statement는약간의부하를야기할수있는프레임워크의자동맵핑기능을사용한다. 어쨌든두가지 statement 모두자바코드로부터정확하게같은방법으로작동하지않을것이다그리고당신은첫번째좀더간단한솔루션으로시작할것이고나중에는필요하면좀더향상된맵핑으로옮겨갈것이다. 가장간단한솔루션이많은경우에가장좋은연습이다. 하나의 SQL Map XML 파일은많은캐쉬모델, 파라미터맵핑, result 맵핑그리고 statement 를포함할수없다. 당신의 애플리케이션을위해 statement 와 maps 를신중하게구성하라. 맵핑된 (Mapped) Statements SQL Maps 개념은맵핑된 statement 에집중한다. 맵핑된 statement 는어떠한 SQL 문을사용할수도있고파라미터 maps(input) 과 result maps(output) 를가질수있다. 만약간단한경우라면맵핑된 statement 는파라미터와 result 를위한클래스로직접설 정할수있다. 맵핑된 statement 는메모리내에생산된 results 를캐슁하기위해캐쉬모델을사용하도록설정할수도있다. <statement id= statementname [parameterclass= some.class.name ] [resultclass= some.class.name ] [parametermap= nameofparametermap ] [resultmap= nameofresultmap ] [cachemodel= nameofcache ] > select * from PRODUCT where PRD_ID = [? #propertyname#] order by [$simpledynamic$] 위 statement 에서 [ 괄호 ] 부분은옵션이고몇몇의경우에만혼합할필요가있다. <statement id= inserttestproduct > 12

13 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, Shih Tzu ) 위예제는명백하게발생할꺼같지는않다. 어쨌든이것은당신이임의의 SQL 문을실행하기위해 SQL Map 프레임워크를사 용한다면유용할수있다. 어쨌든이것은파라미터 Maps 와 Result Maps 을사용하는자바빈즈맵핑기능을공통적으로사용할 것이다. 다음의다양한섹션은구조와속성, 그들이어떻게맵핑된 statement 에영향을끼치는지서술한다. Statement 타입 <statement> 요소는어떤타입의 SQL 문을사용할수있는일반적인 catch all statement이다. 일반적으로이것은좀더다양한특성의 statement요소중하나를사용하기위한좋은생각이다. 좀더다양한특성의요소는좀더직관적인 XML DTD를제공하고때때로일반적인 <statement> 요소가제공하지않는추가적인기능을제공한다. 다음의테이블은 statement요소와그들이지원하는속성과기능을목록화한다. Statement Element Attributes Child Elements Methods <statement> id parameterclass resultclass parametermap resultmap cachemodel xmlresultname All dynamic elements insert update delete All query methods <insert> <update> <delete> <select> <procedure> id parameterclass parametermap id parameterclass parametermap id parameterclass parametermap id parameterclass resultclass parametermap resultmap cachemodel id parameterclass resultclass parametermap resultmap xmlresultname All dynamic elements <selectkey> All dynamic elements All dynamic elements All dynamic elements All dynamic elements insert update delete insert update delete insert update delete All query methods insert update delete All query methods The SQL SQL 은 map의가장중요한부분을차지한다. 이것은당신의데이터베이스와 JDBC드라이버에적합한어떤 SQL이될수있다. 당신은가능한어떤기능을사용할수있고당신의드라이버가지원하는한다중 statement에전달할수도있다. 당신이하나의문서에서 SQL과 XML을혼합하기때문에특수문자의충돌이잠재적으로존재한다. 대부분의공통적인것은 greater-than 과 less-than 문자들이다.(<>). 이것들은 SQL문에서공통적으로요구되고 XML에서는예약어이다. 당신의 SQL문에들어갈필요가있는특수 XML문자를처리하기위한간단한해결법이있다. 표준적인 XML CDATA 섹션을사용함으로써특수문자의어떤것 13

14 도파싱되지않고문제는해결된다. 예를들면 <statement id="getpersonsbyage" parameterclass= int resultclass="examples.domain.person"> <![CDATA[ SELECT * FROM PERSON WHERE AGE > #value# ]]> 자동생성키 많은관계형데이터베이스시스템은기본키 (primay key) 필드의자동생성을지원한다. 이 RDBMS 의기능은종종특정업체에 종속된다. SQL Map 은 <insert> 요소의 <selectkey> 를통해자동생성키를지원한다. 선생성키 (pre-generated - 이를테면오라 클 ) 과후생성키 (post-generated - 이를테면 MS-SQL 서버 ) 모두지원한다. 여기에그예제가있다. <! Oracle SEQUENCE Example --> <insert id="insertproduct-oracle" parameterclass="com.domain.product"> <selectkey resultclass="int" keyproperty="id" > SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectkey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) </insert> <! Microsoft SQL Server IDENTITY Column Example --> <insert id="insertproduct-ms-sql" parameterclass="com.domain.product"> insert into PRODUCT (PRD_DESCRIPTION) values (#description#) <selectkey resultclass="int" keyproperty="id" > AS ID </selectkey> </insert> 저장프로시저 저장프로시저는 <procedure> statement 요소를통해지원된다. 저장프로시저를출력물파라미터와함께어떻게사용하 는지다음예제에서보여준다. <parametermap id="swapparameters" class="map" > <parameter property=" 1" jdbctype="varchar" javatype="java.lang.string" mode="inout"/> <parameter property=" 2" jdbctype="varchar" javatype="java.lang.string" mode="inout"/> </parametermap> <procedure id="swap addresses" parametermap="swapparameters" > {call swap_ _address (?,?)} </procedure> 위처럼프로시저를호출하는것은파라미터객체 (map) 내에서두개의칼럼사이에두개의이메일주소를교체하는것이다. 파라 14

15 미터객체는파라미터맵핑의 mode 속성값이 INOUT 또는 OUT 일경우에만변경된다. 다른경우라면변경되지않고남는다. 명백한불변의파라미터객체 ( 이를테면 String) 는변경할수없다. 주의! 언제나표준적인 JDBC 저장프로시저를사용하도록하라. 좀더다양한정보를보기위해서는 JDBC CallableStatement 문 서를보라. parameterclass parameterclass 속성값은자바클래스의전체경로를포함 ( 예를들면패키지를포함한 ) 한이름이다. parameterclass 속성은옵 션이지만사용이굉장히추천되는것이다. 이것은프레임워크성능을향상시키는만큼 statement 에전달하는파라미터를제한 하는데사용된다. 만약당신이 parametermap 을사용한다면 parameterclass 속성을사용할필요가없다. 예를들면당신이파 라미터로전달하기위한 examples.domain.product 타입의객체를허락하길원한다면당신은다음처럼할수있을것이다. <statement id= statementname parameterclass= examples.domain.product > insert into PRODUCT values (#id#, #description#, #price#) 중요 : 비록이전버전과의호환성을위한옵션이지만이것은언제나파라미터클래스를제공하는것은매우추천되는사항 이다 ( 물론요구되는파라미터가없더라도 ). 프레임워크가먼저타입을안다면스스로최적화능력을가지기때문에당신은 클래스를제공함으로써좀더나은성능을달성할수있다. 명시된 parameterclass 없이선호하는속성 (get/set 메소드 ) 을가지는자바빈즈는파라미터를받을것이고어느위치에서 매우유용하다. parametermap parametermap 속성값은명시된 ( 밑의경우처럼 ) parametermap 요소의이름이다. parametermap 속성은 parameterclass 속성 과인라인파라미터의이익이되도록사용된다. XML 의깔끔함과일관성이당신의걱정이거나당신이좀더상세한 parametermap( 이를테면저장프로시저 ) 이필요하다면이것은좋은접근법이다. 주의! 동적으로맵핑된 statement 는단지인라인파라미터만지원하고파라미터 map 과는작동하지않는다. parametermap 의생각은 JDBC PreparedStatement 의값토큰과매치되는정렬된파라미터목록을명시한다. 예를들면 : <parametermap id= insert-product-param class= com.domain.product > <parameter property= id /> <parameter property= description /> </parametermap> <statement id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); 위의예제에서, 파라미터 map 은 SQL 문에서값토큰 (? ) 에매치되고정렬되는두개의파라미터를서술한다. 그래서첫번째? 는 id 속성값에대체되고두번째는 description 속성값에대체된다. 파라미터 map 과그들의옵션은이문서나중에좀더 다양하게서술될것이다. 15

16 인라인파라미터의빠른언급 이문서에나중에제공되는좀더상세화된설명에도불구하고인라인파라미터에대한빠른언급을한다. 인라인파라미터는 맵핑된 statement 내부에서사용될수있다. 예를들면 : <statement id= insertproduct > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#); 위예제에서인라인파라미터는 #id# 와 #description# 이다. 각각은 statement 파라미터를대체하는자바빈즈속성을표현한 다. Product 클래스는포함된프라퍼티토큰이위치해있는 statement 내에위치하는값을위해읽게되는 id 와 description 프라 퍼티을가진다. id=5 와 description= dog 를가지는 Product 를넘겨받은 statement 는다음처럼수행된다. insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (5, dog ); resultclass resultclass 속성값은자바클래스의전체경로를포함 ( 예를들면패키지를포함한 ) 한이름이다. resultclass 속성은우리에게 ResultSetMetaData 에기반한 JDBC ResultSet 에자동맵핑되는클래스를명시하도록한다. 자바빈즈의프라퍼티와 ResultSet 의 칼럼이매치될때마다프라퍼티는칼럼값과함께생성된다. 이것은매우짧고달콤하게맵핑된 statement 를쿼리한다. 예를들 면 : <statement id="getperson" parameterclass= int resultclass="examples.domain.person"> SELECT PER_ID as id, PER_FIRST_NAME as firstname, PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# 위의예제에서 Person클래스는 id, firstname, lastname, birthdate, weightinkilograms, heightinmeters를포함하는프라퍼티를가진다. 칼럼별칭과함께대응되는각각은 SQL select문에의해서술된다. 칼럼별칭은데이터베이스칼럼이름이매치되지않을때만요구된다. 일반적으로는요구되지않는다. 실행되었을때 Person객체는프라퍼티이름과칼럼명에기반해서초기화되기위해맵핑되는 result set으로부터초기화되고결과를반환한다. resultclass 으로자동맵핑하는데는몇가지제한점이있다. 출력칼럼의타입을명시하는방법은없다. 관련된데이터를자동적 으로로드하는방법이없고 ResultSetMetaData 에접근하는데필요한접근법내에서하찮은성능결과가있다. 이제한점모드는 명시적인 resultmap 를사용함으로써극복할수있다. Result maps 는이문서나중에좀더상세하게다루어질것이다. resultmap resultmap 프라퍼티는좀더공통적으로사용되고이해하기위해가장중요한속성중에하나이다. 이 resultmap 속성값은명 16

17 시된 resultmap요소의이름이다. resultmap속성을사용하는것은당신에게 result set으로부터데이터와칼럼에맵핑되는프라퍼티를어떻게꺼내는지제어하도록한다. resultclass속성을사용하는자동맵핑접근법과는달리 resultmap는당신에게칼럼타입을명시하고 null값을대체그리고복합프라퍼티맵핑 ( 다른자바빈즈, Collections 그리고원시타입래퍼 ) 을허락한다. resultmap 구조의모든상세정보는이문서나중에설명된다. 하지만다음의예제는 resultmap 가어떻게 statement 에관련 되었는지보여준다. <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> </resultmap> <statement id= getproduct resultmap= get-product-result > select * from PRODUCT 위예제에서 SQL 쿼리로부터 ResultSet 은 resultmap 정의를사용해서 Product 인스턴스에맵핑할것이다. resultmap 은 id 프라 퍼티가 PRD_ID 칼럼과 PRD_DESCRIPTION 칼럼에의해생성되는 description 프라퍼티에의해생성될것이다. select * 를사용하는것은지원된다는것에주의하라. ResultSet 내반환칼럼모두에맵핑할필요는없다. cachemodel cachemodel 속성값은정의된 cachemodel 요소의이름이다. cachemodel 은쿼리가맵핑된 statement 를사용하기위한캐쉬를서 술하는데사용된다. 각각의쿼리맵핑 statement 는다른 cachemodel 이나같은것을사용할수있다. cachemodel 요소와그것의 속성에대한모든상세설명은나중에언급된다. 다음예제는어떻게 statement 와관련되는지보여준다. <cachemodel id="product-cache" imlementation="lru"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= size value= 1000 /> </cachemodel> <statement id= getproductlist parameterclass= int cachemodel= product-cache > select * from PRODUCT where PRD_CAT_ID = #value# 위예제에서캐쉬는 WEAK 참조타입을사용하는 products 를위해정의되고 24 시간마다또는관련된 update 문이수행될때마 다지워진다 (flush). xmlresultname mapping result 를 XML 문서로직접적으로만들때 xmlresultname 의값은 XML 문서의가장상위요소의이름이될것이다. 예를 들면 : <select id="getperson" parameterclass= int resultclass="xml" xmlresultname= person > SELECT PER_ID as id, PER_FIRST_NAME as firstname, 17

18 PER_LAST_NAME as lastname, PER_BIRTH_DATE as birthdate, PER_WEIGHT_KG as weightinkilograms, PER_HEIGHT_M as heightinmeters FROM PERSON WHERE PER_ID = #value# </select> 위 select statement 는다음구조의 XML 객체를생성할것이다. <person> <id>1</id> <firstname>clinton</firstname> <lastname>begin</lastname> <birthdate> </birthdate> <weightinkilograms>89</weightinkilograms> <heightinmeters>1.77</heightinmeters> </person> 파라미터 Maps 와인라인파라미터 당신이위에서본것처럼 parametermap 는자바빈즈프라퍼티를 statement 의프라퍼티에맵핑시키는작업을수행한다. 비 록 parametermaps 가외부형태내에드물게발생하더라도그것들이당신에게인라인파라미터를이해하도록도와준다는 것을이해하라. <parametermap id= parametermapname [class= com.domain.product ]> <parameter property = propertyname [jdbctype= VARCHAR ] [javatype= string ] [nullvalue= NUMERIC ] [null= ]/> <parameter /> <parameter /> </parametermap> [ 괄호 ] 내의부분은옵션이다. parametermap 는스스로는 statement 가그것을참조할때사용하는구분자로써단지 id 속성만 필요하다. Class 속성은옵션이지만크게사용이추천되는것이다. Statement 의 parameterclass 속성과유사하게 class 속성은 프레임워크가성능을위해엔진을최적화하는것만큼들어오는파라미터를체크하도록한다. <parameter> 요소 parametermap 은 statement 의파라미터에직접맵핑하는파라미터맵핑의어떤숫자를포함한다. 다음의일부섹션은 property 요소의속성을서술한다. property 파라미터 map 의 property 속성은맵핑된 statement 에전달되는파라미터객체의자바빈즈프라퍼티 (get 메소드 ) 의이름이다. 그이름은 statement 내에필요한횟수에의존하는것보다좀더사용될수있다. jdbctype jdbctype 속성은이프라퍼티에의해셋팅되는파라미터의칼럼타입을명시적으로정의하는데사용된다. 몇몇 JDBC 드라이 버는명시적인드라이버칼럼타입을부르는것없이어떤작동을위해칼럼의타입을확인할수없다. 이것의완벽한예제는 18

19 PreparedStatement.setNull(int parameterindex, int sqltype) 메소드이다. 이메소드는정의하기위한타입을요구한다. 몇몇드라이버는간단하게 Types.OTHER 또는 Types.NULL을보냄으로써함축되는타입을허락한다. 어쨌든행위는비일관적이고몇몇드라이버는정의되기위한정확한타입을필요로한다. 그런경우를위해서 SQL Maps API는 parametermap프라퍼티요소의 jdbctype 속성을사용하여정의되기위한타입을허락한다. 이속성은칼럼이 null 이가능할때 (nullable) 만요구된다. Type 속성을사용하는다른이유는명시적으로 date 타입을정의하는 것이다. 자바는단지하나의 Date 값타입 (java.util.date) 을가지는데반해대개의 SQL 데이터베이스는많은, 대개최소 3 가지 이상의타입을가진다. 당신의칼럼타입이 DATE 나 DATETIME 중에하나로명시적으로정의하길바랄지도모르기때문이다. jdbctype 속성은 JDBC 타입클래스내변수와매치되는어떤문자열값에셋팅될수있다. 비록이것은그것들중에어떤것 에셋팅될수있지만몇몇타입은지원되지않는다 ( 이를테면 blobs). 이문서의나중섹션에서프레임워크에의해지원되 는타입에대해서서술한다. 주의! 대부분의드라이버는단지 null 이가능한칼럼을위해정의되는타입을필요로한다. 그러므로그런드라이버를위해당 신은 null 이가능한칼럼을위해타입을정의할필요가있다. 주의! 오라클드라이버를사용할때당신은이것의타입을정의하지않고서는칼럼에 null 값을넣을때 Invalid column type 에러를보게될것이다. javatype javatype 속성은셋팅되기위한파라미터의자바프라퍼티를명시적으로정의하기위해사용된다. 대게이것은리플렉션 (reflection) 을통해자바빈즈프라퍼티로부터파생된다. 하지만 Map과 XML맵핑같은특정맵핑은프레임워크를위한타입을제공하지않는다. 만약 javatype가셋팅되지않고프레임워크도어떤타입인지구별할수없다면타입은객체로간주될것이다. nullvalue nullvalue 속성은어떤유효한값 ( 프라퍼티타입에기초로해서 ) 에셋팅할수있다. null 속성은 null값대체를정의하기위해사용된다. 이것이의미하는것은자바빈즈프라퍼티내에서검색되는값인 NULL이데이터베이스에쓰여질것이라는것이다 ( 들어오는 null값대체의상반된행위 ). 이것은당신에게 null값을지원하지않는타입 ( 이를테면 int, double, float등등 ) 을위해당신의애플리케이션내에 magic null 숫자를사용하도록허락한다. 프라퍼티의그런타입은적합한 null값을포함할때 NULL은값대신에데이터베이스에쓰여질것이다. <parametermap> 예제 모든구조를사용하는 parametermap 의예제가다음과같다. <parametermap id= insert-product-param class= com.domain.product > <parameter property= id jdbctype= NUMERIC javatype= int nullvalue= /> <parameter property= description jdbctype= VARCHAR nullvalue= NO_ENTRY /> </parametermap> <statement id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); 19

20 위예제에서자바빈즈프라퍼티인 id 와 description 는목록화되는순서대로맵핑된 Statement 인 insertproduct 의파라미터 에적용될것이다. 그래서 id 는첫번째파라미터 (?) 에적용되고 description 는두번째파라미터에적용된다. 만약에순서가반 대라면 XML 은다음처럼보일것이다. <parametermap id= insert-product-param class= com.domain.product > <parameter property= description /> <parameter property= id /> </parametermap> <statement id= insertproduct parametermap= insert-product-param > insert into PRODUCT (PRD_DESCRIPTION, PRD_ID) values (?,?); 주의! Parameter Map 이름은정의된 SQL Map XML 파일에위치한다. 당신은 SQL Map(<sqlMap> root 태그에셋팅된 ) 의 id 와 함께파라미터 Map 의 id 를앞에붙임으로써다른 SQL Map XML 파일내에파라미터 Map 을참조할수있다. 예를들면다른파 일로부터위의파라미터 map 를참조하기위해참조하기위한전체이름은 Product.insert-product-param 이될것이다. 인라인파라미터 Maps 매우상세한설명에도불구하고 parametermaps 을선언하기위한위의문법은매우장황하다. 파라미터 Maps 을위한정의 (definition) 을간단하게하고코드를줄일수있는좀더다양한문법이있다. 그대안적인문법은자바빈즈프라퍼티이름을맵 핑된 statement 에인라인시키는것이다. 초기설정에의해명시적으로정의된 parametermap 이없는어떤맵핑된 statement 는인라인파라미터를위해파싱될것이다. 이전의인라인파라미터를구현한예제 ( 이를테면 Product) 는다음처럼보일것이 다. <statement id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#); 타입을선언하는것은다음의문법을사용함으로써인라인파라미터로할수있다. <statement id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:numeric#, #description:varchar#); 타입을선언하는것과 null 값대체는다음문법을사용함으로써인라인파라미터로할수있다. <statement id= insertproduct parameterclass= com.domain.product > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:numeric: #, #description:varchar:no_entry#); 주의! 인라인파라미터를사용할때당신은타입정의없이 null 값대체를명시할수없다. 당신은순서대로파싱하기위해둘다 명시해야한다. 주의! Null 값의완전한투명성을원한다면당신은이문서의나중에설명되는것처럼당신의 result maps 내에 null 값대체를 반드시명시해야한다. 20

21 주의! 당신이많은수의타입서술자와 null 값대체가필요하다면당신은외부적인것을사용해서코드를정리할수있어야 할것이다. 원시타입파라미터 파라미터처럼사용하기위해자바빈을쓰는것은언제나필요하고편리한것은아니다. 이런경우에당신은직접적으로파 라미터를사용하는것처럼원시타입래퍼객체 (String, Integer, Date 등등 ) 를사용하는것을환영할것이다. 예를들면 : <statement id= insertproduct parameter= java.lang.integer > select * from PRODUCT where PRD_ID = #value# PRD_ID가숫자타입이라고가정하자. 호출이되었을때 java.lang.integer객체를전달할수있는맵핑된 statement를만들것이다. #value# 파라미터는 Integer인스턴스의값으로대체될것이다. value 라는이름은간단한문법 ( 이를테면괄호 ) 안의요소이고별명이될수있다. Result Map는 result처럼원시타입을잘지원한다. 파라미터로원시타입을사용하는방법에대해서좀더다양한정보를위해서는 Result Map섹션과프로그래밍 SQL Maps(API) 를보라. 원시타입은좀더간결한코드를위해서별칭된다. 예를들면 int 는 java.lang.integer 대신에사용될수있다. 별칭은아 래의 파라미터 Map 과 result Map 을위해지원되는타입 이라는제목의테이블에서이야기된다. Map 타입파라미터 당신이자바빈즈클래스를쓰는것이필요하지않거나편리하지않은위치에있고하나의원시타입파라미터을쓰지는않는 다면파라미터객체로 Map( 이를테면 HashMap, TreeMap) 을사용할수있다. 예를들면 : <statement id= insertproduct parameterclass= java.util.map > select * from PRODUCT where PRD_CAT_ID = #catid# and PRD_CODE = #code# 맵핑된 statement구현내에서는차이점이없다는것을알라. 위의예제에서만약 Map인스턴스가 statement를위한호출로전달되었다면 Map은 catid 과 code 라는이름의키를포함해야만한다. 이값은 Integer과 String과같은선호되는타입이되는그런키에의해참조된다. Result Map은 result처럼 Map타입을아주잘지원한다. 파라미터처럼 Map타입을사용하는것에대한좀더상세한정보를위해서는 result Map섹션과프로그래밍 SQL Map(API) 를보라. Map 타입역시좀더간결한코드를위해별칭된다. 예를들면 map 는 java.util.map 을대신할수있다. 별칭은아래의 파라 미터 Map 과 result Map 을위해지원되는타입 이라는제목의테이블에서이야기된다. Result Maps Result maps 는 SQL Maps 의가장중요한컴포넌트이다. resultmap 는자바빈즈프라퍼티를맵핑된쿼리 statement 를실 행함으로써생산된 ResultSet 의칼럼에맵핑시키는책임을진다. resultmap 의구조는다음과같이보인다. <resultmap id= resultmapname class= some.domain.class [extends= parent-resultmap ]> <result property= propertyname column= COLUMN_NAME [columnindex= 1 ] [javatype= int ] [jdbctype= NUMERIC ] [nullvalue= ] [select= someotherstatement ] 21

22 </resultmap> /> <result /> <result /> <result /> [ 괄호 ] 부분은옵션이다. resultmap는스스로 statement가그것을참조하기위해사용할 id속성을가진다. resultmap는클래스나타입별칭의전체경로를포함한이름인 class속성을가진다. 이클래스는이것을포함하는 result맵핑에기반하여초기화되고생성될것이다. Extends속성은 resultmap에기초한다른 resultmap의이름을옵션적으로셋팅할수있다. 이것은상위 resultmap의모든프라퍼티가하위 resultmap의부분을포함하는것처럼자바내에서클래스를확장하는것과유사하다. 상위 resultmap의프라퍼티는하위 resultmap프라퍼티와부모 resultmap가자식앞에서정의되기전에언제나추가된다. 상위 / 하위 resultmap를위한클래스는같은것을필요로하지않을뿐아니라모든것이관련될필요도없다. resultmap 은자바빈즈를 ResultSet 의칼럼에맵핑시키는어느정도의프라퍼티맵핑을포함할수있다. 그런프라퍼티맵핑은 문서내에서정의하기위해적용될것이다. 관련클래스는각각의프라퍼티, Map 또는 XML 을위한 get/set 메소드를가진자바 빈즈와호환되는클래스여야만한다. 주의! 칼럼은 Result Map 내에서정의되기위해서명시적으로읽을것이다. 다음의섹션은 property 요소의속성들을서술한다. property result map 의 property 속성은맵핑 statement 에의해반환되는 result 객체의자바빈즈프라퍼티 (get 메소드 ) 이름이다. 이름 은 results 를생성할때필요한횟수에의존적인값보다더크게사용될수있다. column column 속성값은프라퍼티를생성하기위해사용될값들로부터의 ResultSet 내의칼럼의이름이다. columnindex 옵션적인 ( 최소한의 ) 성능향상을위해서 columnindex 속성값은자바빈즈프라퍼티를생성하기위해사용될값으로부터의 ResultSet내의칼럼의인덱스이다. 이것은애플리케이션의 99% 정도엔필요하지않을것이고유지를위한노력과속도를위해가독성을희생한다. 몇몇 JDBC드라이버는다른것들이동적으로속도를올려주는동안어떤성능이득도구체화하지않을것이다. jdbctype jdbctype 속성은자바빈즈프라퍼티를생성하는데사용되는 ResultSet 칼럼의데이터베이스칼럼타입을명시적으로정의하는데사용된다. 비록 result maps이 null값과함께같은어려움을가지지않는다고하더라도 Date프라퍼티처럼어떤맵핑타입을위해유용할수있는타입을정의한다. 자바는오직하나의 Date값타입을가지고 SQL 데이터베이스는여러가지를가지기때문에 dates( 또는다른타입 ) 타입을정확하게셋팅하는것을확신하는몇몇경우에필요하게될것이다. 유사하게도 String타입은 VARCHAR, CHAR 또는 CLOB에의해생성될것이다. 그래서그런경우에필요한타입을정의하라. 22

23 javatype javatype 속성은셋팅되는프라퍼티의자바프라퍼티타입을명시적으로정의하기위해사용된다. 대개이것은리플렉션 (reflection) 을통해자바빈즈프라퍼티로부터끌어낼수있다. 하지만 Map와 XML맵핑과같은맵핑은프레임워크를위한타입을제공할수없다. 만약 javatype가셋팅되지않고프레임워크가그타입을구분할수없다면타입은객체로가정되어처리될것이다. nullvalue nullvalue 속성은데이터베이스내에서 NULL 값을대신해서사용되기위한값을정의한다. 그래서만약 ResultSet 으로부터 NULL 이읽었다면자바빈프라퍼티는 NULL 대신에 nullvalue 속성에의해정의된값을셋팅할것이다. null 속성값은어떠한값 을될수있지만프라퍼티타입을위해서는적절해야만한다. 만약당신의데이터베이스가 NULL 이가능한칼럼을가진다면당신은당신의애플리케이션이다음처럼 result map 내에 서그것을정의할수있는변수값과함께 NULL 을표시하기를원한다. <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> <result property= subcode column= PRD_SUB_CODE nullvalue= -999 /> </resultmap> 위예제에서만약 PRD_SUB_CODE이 NULL로읽혀진다면 subcode 프라퍼티는 -999라는값으로셋팅될것이다. 이것은당신에게데이터베이스내에서 NULL이가능한칼럼을표현하기위해당신의자바클래스내에원시타입을사용하도록허락할것이다. 만약당신이 updates/inserts같은쿼리를위한작업을수행하기를원할때당신은파라미터 map내에 nullvalue를정의해야만한다는것을기억해라. select select 속성은객체사이의관계를서술하고자동적으로복합프라퍼티타입을로드하는데사용된다. statement프라퍼티값은다른맵핑된 statement의이름이되어야만한다. 데이터베이스칼럼값은 statement속성이파라미터처럼관계된맵핑 statement로전달하는것처럼같은 property요소내에정의된다. 그러므로칼럼은원시타입으로지원이되어야한다. 지원되는원시타입과복합프라퍼티맵핑 / 관계에대한상세정보는이문서나중에이야기된다. 내포하는 Result Maps 만약당신이명시적으로정의된 resultmap 의재사용을요구하지않는다는매우간단한요구사항을가진다면맵핑된 statement 의 resultclass 속성을셋팅함으로써 result map 을함축적으로정의하는빠른방법이있다. 이묘기는당신이반환되는 result set 이당신의자바빈의쓰기가능한프라퍼티이름에매치되는칼럼이름 ( 또는라벨 / 별칭 ) 을가지는것을확실해야만한다는것 이다. 예를들면만약우리가위에서서술된 Product 클래스를생각할때우리는다음처럼내포하는 result map 으로맵핑된 statement 를생성할수있다. <statement id= getproduct resultclass= com.ibatis.example.product > select PRD_ID as id, PRD_DESCRIPTION as description 23

24 from PRODUCT where PRD_ID = #value# 위의맵핑된 statement는 resultclass를표기하고 Product클래스의자바빈즈프라퍼티에매치되는각각의칼럼를위한별칭을명시한다. 이것은모두필수 (required) 이다. Result map은필요하지않다. 여기서교환 (tradeoff) 은당신이칼럼타입 ( 대개필수가아닌 ) 과 null값 ( 또는다른어떤프라퍼티속성 ) 을정의하는기회를가지지않는것이다. 많은데이터베이스가대소문자를가리지않기때문에내포된 result map는또한가리지않는다. 만약당신의자바빈이두개의프라퍼티를가진다면하나의이름은 firstname이고다른것은 firstname이다 ( 두개의값은대소문자의차이이다 ). 그것들은동일하고당신은내포된 result map를사용할수없을것이다 ( 이것은자바빈클래스의디자인에서잠재적인문제점을파악하게될것이다.). 게다가 resultclass 를통해자동맵핑을하면몇몇성능에관련된부하가발생할것이다. ResultSetMetaData에접근하는것은몇몇쓰여진 JDBC드라이버로는느리게만들수있다. 원시타입의 Results ( 이를테면 String, Integer, Boolean) 자바빈호환클래스를지원하기위해추가적으로 result Map 은 String, Integer, Boolean 등등과같은간단한자바타입래퍼를 편리하게생성할수있다. 원시타입객체의 collection 은밑에서이야기되는 API(executeQueryForList() 를보라 ) 들을사용해서 가져올수있다. 원시타입은자바빈처럼같은방법으로정확하게맵핑된다. 원시타입은당신이선호하는 ( 대개 value 또는 val ) 이름형식의어떤것처럼될수있는하나의프라퍼티만을가질수있다. 예를들면우리가전체 Product 클래스대신에모든 product 서술자 (description) 의목록만을로드하길원한다면 map 은다음처럼보여질것이다. <resultmap id= get-product-result class= java.lang.string > <result property= value column= PRD_DESCRIPTION /> </resultmap> 좀더간단한접근법은맵핑된 statement 안에서간단하게 result class 를사용하는것이다.( as 키워드를사용해서 value 라 는칼럼별칭을사용하는것을주의깊게보라.) <statement id= getproductcount resultclass= java.lang.integer > select count(1) as value from PRODUCT Map Results Result Maps 은 HashMap 또는 TreeMap 처럼 Map 인스턴스를편리하게생성할수있다. 그런객체 (Map 의 List) 의 collection 은아 래에서이야기되는 API(executeQueryForList() 를보라 ) 들을사용해서가져올수있다. Map 타입은자바빈과같은방법으로정 확하게맵핑된다. 하지만자바빈프라퍼티셋팅대신에 Map 의 key 들은대응되는맵핑칼럼을위한값을참조하도록셋팅한다. 예를들면만약우리가 product 의값을 Map 으로빨리로드시키길원한다면우리는다음처럼할것이다. <resultmap id= get-product-result class= java.util.hashmap > <result property= id column= PRD_ID /> <result property= code column= PRD_CODE /> <result property= description column= PRD_DESCRIPTION /> <result property= suggestedprice column= PRD_SUGGESTED_PRICE /> </resultmap> 위예제에서 HashMap 인스턴스는 Product 데이터를생성할것이다. 프라퍼티이름속성 ( 이를테면 id ) 은 HashMap 의키가될 것이다. 맵핑칼럼의값은 HashMap 의값이될것이다. 물론당신은 Map 타입을가지고내포된 result map 을사용할수도있다. 24

25 예를들면 : <statement id= getproductcount resultclass= java.util.hashmap > select * from PRODUCT 위의것은반환된 ResultSet 의 Map 표현을당신에게줄것이다. 복합 (Complex) Properties ( 이를테면사용자에의해정의된클래스의프라퍼티 ) 이것은선호하는데이터와클래스를로드하는방법을알고있는맵핑된 statement 와함께관련된 resultmap 프라퍼티에의해 복합타입의프라퍼티 ( 사용자에의해생성된클래스 ) 를자동적으로생성하는것은가능하다. 데이터베이스내데이터는언제 나복합프라퍼티는관계의 many side 로부터이고프라퍼티자신은관계의 one side 로부터이다라는것을고정하는클래스 에서 1:1 관계또는 1:M 관계를통해표현된다. 예를들면 : <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> <result property= category column= PRD_CAT_ID select= getcategory /> </resultmap> <resultmap id= get-category-result class= com.ibatis.example.category > <result property= id column= CAT_ID /> <result property= description column= CAT_DESCRIPTION /> </resultmap> <statement id= getproduct parameterclass= int resultmap= get-product-result > select * from PRODUCT where PRD_ID = #value# <statement id= getcategory parameterclass= int resultmap= get-category-result > select * from CATEGORY where CAT_ID = #value# 위예제에서 Product의인스턴스는 Category타입의 category를호출하는프라퍼티를가진다. Category는복합사용자타입이기때문에 JDBC는그것을생성하는방법을가지지않는다. 프라퍼티맵핑과함께다른맵핑된 statement를관련시킴으로써우리는그것을생성하기위한 SQL Map엔진을위해충분한정보를제공한다. getproduct를수행하면 get-product-result result map 이 PRD_CAT_ID칼럼내반환되는값을사용해서 getcategory을호출할것이다. get-category-result result map은 Category를초기화할것이고그것을생성한다. 전체 Category인스턴스는 Product의 category프라퍼티로셋팅한다. N+1 Selects (1:1) 피하기 위솔루션을사용할때문제점은당신이 Product를로드할때마다두개 (Product를위해하나그리고 Category를위해서하나. 총 2개 ) 의 SQL문이실제적으로구동된다는것이다. 이문제는하나의 Product를로드할때는큰문제가아닌것처럼보이지만만약 10개의 Product를로드하는쿼리를한다면각각의쿼리는관련된 category를로드하기위한 Product를위해서도실행될것이다. 결과적으로 11번의쿼리를하게된다. Product의목록을위해하나, 관련된 Category를로드하기위해반환되는 Product 를위해하나씩 (N+1 또는이경우엔 10+1=11) 해결법은분리된 select 문대신에조인과내포된 (nested) 프라퍼티맵핑을사용하는것이다. 여기에그와같은상황을사용한 25

26 예제가있다. <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> <result property= category.id column= CAT_ID /> <result property= category.description column= CAT_DESCRIPTION /> </resultmap> <statement id= getproduct parameterclass= int resultmap= get-product-result > select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID = #value# 늦은 (Lazy) 로딩대조인 (1:1) 조인을사용하는것이언제나더좋은결과를내지는않는다는것에주의하는것은중요하다. 만약당신이관계객체에접근하는것이거의없는상황이라면조인을피하는것이더빠르고모든 category프라퍼티의로딩이불필요하다. 이것은 outer조인을포함하는데이터베이스디자인이나 null값이가능하거나인덱스가없는칼럼에는사실이다. 이런상황에서늦은로딩과 bytecode향상옵션으로 sub-select솔류선을사용하는것은좀더향상된결과를보여준다. 일반적인규칙은연관된프라퍼티에접근하는것을좀더하고자할때만조인을사용하라. 반면에늦은로딩이옵션이아닐때에만그것을사용하라. 만약당신이사용할방법을결정하는데문제가있다면걱정하지마라. 그것은문제도아니다. 당신은자바코드충돌없이이것을항상변경할수있다. 위의두예제는같은객체형태의결과를보이고정확하게같은메소드호출을사용해서로드된다. 만약당신이캐쉬를가능하게하면단지하나의고려사항은 separate select( 조인이아닌 ) 솔루션을사용하는것이반환되는캐쉬된인스턴스내에결과를보이게된다. 복합 Collection 프라퍼티 복합객체의목록을표현하는프라퍼티를로드하는것은가능하다. 데이터베이스내의데이터는 M:M 관계나 1:M 관계에의해 표현될것이다. 객체목록을로드하는것은 statement 에어떤변경사항도주지않는다. SQL Map 프레임워크가비즈니스객체 내에서리스트처럼프라퍼티를로드하기위해요구되는단하나의차이점은 java.util.list 또는 java.util.collection 타입이되 어야한다는것이다. 예를들면 Category 가 Product 인스턴스목록을가진다면맵핑은다음처럼보일것이다.(Category 가 java.util.list 타입의 productlist 라고불리는프라퍼티를가진다고가정하자.) <resultmap id= get-category-result class= com.ibatis.example.category > <result property= id column= CAT_ID /> <result property= description column= CAT_DESCRIPTION /> <result property= productlist column= CAT_ID select= getproductsbycatid /> </resultmap> <resultmap id= get-product-result class= com.ibatis.example.product > <result property= id column= PRD_ID /> <result property= description column= PRD_DESCRIPTION /> </resultmap> <statement id= getcategory parameterclass= int resultmap= get-category-result > select * from CATEGORY where CAT_ID = #value# <statement id= getproductsbycatid parameterclass= int resultmap= get-product-result > select * from PRODUCT where PRD_CAT_ID = #value# 26

27 N+1 Selects (1:M 과 M:N) 피하기 이것은위의 1:1 상황과유사하다. 하지만굉장히많은데이터를포함할때좀더큰걱정거리가될것이다. 위해결법과함께문제는당신이 Category를로드할때마다두개의 SQL문 ( 하나는 Category를위한하나이고하나는 Products에대한목록을위한것 ) 은실질적으로수행된다. 이문제는하나의 Category를로드할때평범한것처럼보이지만 10개의 Category를로드하는쿼리문을실행할때는각각의쿼리가 Product의목록을로드하기위한각각의 Category를위해서수행될것이다. 결과적으로 11개의쿼리가수행된다. 하나는 Category 목록을위한것이고각각의 Product 관련목록을반환하는각각의 Category를위한것이다 (N+1 또는이경우엔 10+1=11). 이상환을더욱나쁘게만들려면우리는굉장히많은데이터를다루면된다. 1:N 과 M:N 해결법? 이이슈를해결하는기능은구현되지않았다. 이것은조만간새로운릴리즈에포함될것이다. ( 역자주 : 이문제는 SQL Maps 에서해결이된것으로알고있다.) 늦은 (Lazy) 로딩대조인 (1:M and M:N) 먼저이야기된 1:1상황처럼조인을사용하는것이언제나더좋다는것이아니라는것을아는것은중요하다. 이것은대량의데이터로인하여개별적인값프라퍼티를위한것보다 collection프라퍼티에서좀더사실적이다. 만약당신이관련된객체에접근하는것이드문상황 ( 이를테면 Category클래스의 productlist 프라퍼티 ) 이라면이것은조인과 product목록의필요없는로딩을피한다면정말빠르게될것이다. 이것은 outer조인과 null이가능하고아니면또는인덱스가없는칼럼을포함한데이터베이스디자인에는특별히사실이다. 이런상황에서늦은 (lazy) 로딩과 bytecode향상옵션으로 sub-select솔루션을사용하는것은좀더향상시켜준다. 일반적인규칙은연관된프라퍼티에접근하는것을좀더하고자할때만조인을사용하라. 반면에늦은로딩이옵션이아닐때에만그것을사용하라. 먼저언급했던것처럼만약당신이어떤방법을사용해야하는지결정하는데문제가있다면걱정하지마라. 어떤방법을사용할지에대해서걱정하는것은필요없는일이다. 당신은당신의자바코드에충돌없이그것을변화시킬수있다. 위의두예제는같은객체형태의결과를보이고정확하게같은메소드호출을사용해서로드된다. 만약당신이캐쉬를가능하게하면단지하나의고려사항은 separate select( 조인이아닌 ) 솔루션을사용하는것이반환되는캐쉬된인스턴스내에결과를보이게된다. 복합키또는다중복합파라미터프라퍼티 당신은위예제에서 column 속성에의해 resultmap 내에정의된것처럼사용되어지는것은하나의키라는것이언급되었다. 이것은단지하나의키만이관계된맵핑 statement 에관련될수있다는것을제안했다. 어쨌든관계된맵핑 statement 에전달 할다중칼럼을허락하는대안적인문법이있다. 이것은복합키관계가존재하는상황이나당신이간단하게 #value# 와다른 이름의파라미터를사용하고자할때편리하다. Column 속성이간단 {param1=column1, param2=column2,, paramn=columnn} 할때대안적인문법이다. PAYMENT 테이블이 Customer ID 와 Order ID 를둘다키로할때다음의예제를 보고생각해보라. <resultmap id= get-order-result class= com.ibatis.example.order > <result property= id column= ORD_ID /> <result property= customerid column= ORD_CST_ID /> <result property= payments column= {itemid=ord_id, custid=ord_cst_id} select= getorderpayments /> </resultmap> <statement id= getorderpayments 27

28 resultmap= get-payment-result > select * from PAYMENT where PAY_ORD_ID = #itemid# and PAY_CST_ID = #custid# 옵션적으로당신은그것들이파라미터처럼같은순서로정렬되는것처럼칼럼이름을정의할수있다. 예를들면 {ORD_ID, ORD_CST_ID} 언제나처럼이것은읽기와유지라는것의영향과함께미세한성능획득이있다. 중요! 현재의 SQL Map 프레임워크는순환하는관계를자동으로해석하지않는다. 부모 / 자식관계 ( 트리 ) 를구현할때이것을 알고있어라. 쉬운대안은간단하게부모객체를로드하기않는경우를위한하나또는 N+1 avoidance 해결법에서서술된 조인을사용하는경우를위한두번째 result map 를정의하는것이다. 주의! 몇몇 JDBC 드라이버 ( 이를테면내장된 PointBase) 는동시에다중 ResultSet(connection 마다 ) 을지원하지않는다. 그런 드라이버는 SQL Map 엔진이다중 ResultSet connection 을요구하기않기때문에복잡한객체맵핑과는작동하지않을것이다. 다시말해조인을사용하는거대신에이것을해석할수있다. 주의! Result Map 이름은언제나그것들이정의된 SQL Map XML 파일에위치한다. 당신은 SQL Map 의이름을 Result map 의이름앞에위치시킴으로써다른 SQL Map XML 파일내의 Result Map 를참조할수있다. 만약당신이 JDBC 를위해 MS 의 SQL Server2000 드라이버를사용한다면당신은수동트랜잭션모드인동안다중 statement 를 수행하기위해 connection url 에 SelectMethod=Cursor 을추가할필요가있을지도모른다.(MS 의지식기반기사 을보 라. 파라미터 Maps 와 Result Maps 를위해지원되는타입들 파라미터와 result 를위해 ibatis 프레임워크에의해지원되는자바타입은다음과같다. Java Type JavaBean/Map Property Mapping Result Class / Parameter Class*** Type Alias** boolean YES NO boolean java.lang.boolean YES YES boolean byte YES NO byte java.lang.byte YES YES byte short YES NO short java.lang.short YES YES short int YES NO int/integer java.lang.integer YES YES int/integer long YES NO long java.lang.long YES YES long float YES NO float java.lang.float YES YES float double YES NO double java.lang.double YES YES double java.lang.string YES YES string 28

29 java.util.date YES YES date java.math.bigdecimal YES YES decimal * java.sql.date YES YES N/A * java.sql.time YES YES N/A * java.sql.timestamp YES YES N/A * java.sql. date 타입사용은좋지않다 (discouraged). 대신에 java.util.date 를사용하는것이제일좋다. **. 파라미터나 result 클래스를정의할때타입별칭은전체경로의클래스명에두는것이좋다. *** int, boolean and float 와같은원시타입은 ibatis 데이터베이스레이어가완전한객체지향접근법을사용하는것처럼직 접적으로원시타입을지원하지는않는다. 그러므로모든파라미터와 result 는그들의상위레벨에서객체가되어야한다. 부수 적으로 JDK1.5 의 autoboxing 기능은잘사용되기위해원시타입을허락한다. 캐쉬상태의맵핑된 Statement Results 맵핑된 statement 쿼리로부터의 result 는 statement 태크내에 cachemodel 파라미터를정의함으로써간단하게캐쉬될수있다. 캐쉬모델은당신의 SQL Map 내에서정의된설정된캐쉬다. 캐쉬모델은다음처럼 cachemodel 요소를사용해서설정된다. <cachemodel id="product-cache" type ="LRU" readonly= true serialize= false > <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= cache-size value= 1000 /> </cachemodel> 위의캐쉬모델은 LRU(Least Recently Used) 방식을사용해서 product-cache 라는이름의캐쉬인스턴스를생성할것이다. type 속성값은전체경로의클래스명이거나아래처럼구현을포함하는것의별칭이다. flush 요소에기초로하여캐쉬모델내에 서정의된다. 이캐쉬는 24 시간마다삭제된다. interval 요소내에서 hours, minutes, seconds 또는 milliseconds 단위로설정이 되어서삭제된다. 캐쉬는추가적으로 insertproduct, updateproduct, 또는 deleteproduct 맵핑 statement 가수행될때마다삭제 된다. 캐쉬를위해 flush on execute 요소의숫자값이정의될수있다. 몇몇캐쉬구현물은위에서보여지는 cache-size 같은 추가적인프라퍼티를필요로한다. LRU 캐쉬의경우에크기는캐쉬내저장되기위한항목의갯수로결정된다. 캐쉬모델이설 정되었을때당신은맵핑된 statement 에의해사용되기위한캐쉬모델을정의할수있다. 예를들면 <statement id= getproductlist cachemodel= product-cache > select * from PRODUCT where PRD_CAT_ID = #value# 읽기전용대읽기 / 쓰기 프레임워크는읽기전용과읽기 / 쓰기캐쉬를모두지원한다. 읽기전용캐쉬는모든유저에의해공유되어서좀더큰성능향상을보여준다. 어쨌든읽기전용캐쉬로부터읽어들인객체는변경할수없다. 대신에새로운객체는업데이트를위해데이터베이스 ( 또는읽기 / 쓰기캐쉬 ) 로부터읽어야만한다. 반면에정정 (retrieval) 및변경을위한객체를사용할경우에는읽기 / 쓰기캐쉬가추천된다 ( 이를테면필수이다 ). 읽기전용캐쉬를사용하기위해서는캐쉬모델요소에 readonly= true 를셋팅하라. 기초설정값은읽기전용 (true) 이다. 직렬화가능한읽기 / 쓰기캐쉬 29

30 당신이동의한다면서술된것처럼세션당캐쉬는전역애플리케이션성능에자그마한이익을준다. 읽기 / 쓰기캐쉬의다른타입은전체애플리케이션이직렬화가능한읽기 / 쓰기캐쉬라면성능향상을보여준다. 이캐쉬는각각의세션에캐쉬된객체의다른인스턴스를반환할것이다. 그러므로각각의세션은안전하게반환된인스턴스를변경할수있다. 여기서의미론적인차이점을알아보자면당신은언제나캐쉬로부터반환된같은인스턴스를기대하겠지만캐쉬내에서당신은다른것을얻게될것이다. 또한직렬화가능한캐쉬로부터저장된모든객체는직렬화가능해야만한다. 이것은직렬화가능한캐쉬로조합된늦은 (lazy) 로딩기능을사용하기에는어려울것이라는것을의미한다. 왜냐하면늦은 (lazy) 프록시는직렬화가능하지않기때문이다. 캐쉬의조합을해결하는가장좋은방법은늦은 (lazy) 로딩과테이블조인을간단히시도하는것이다. 직렬화가능한캐쉬를사용하기위해서는기초설정캐쉬모델이읽기전용이고직렬화가능하지않기때문에 readonly= false 와 serialize= true 로셋팅하라. 읽기전용캐쉬는직렬화되지않을것이다. 캐쉬타입들 캐쉬모델은다른타입의캐쉬를지원하기위해서플러그인형태의프레임워크를사용한다. 그구현은 cachemodel요소의 type 속성값내에정의된다. 이정의된클래스이름은 CacheController인터페이스의구현이나아래에서논의되는 4가지별칭중에하나가되어야만한다. 게다가설정파라미터는 cachemodel내에포함된 property요소를통해구현체로전달될수있다. 현재배포판에는 4가지구현물을포함하고있다. 그들은다음과같다. MEMORY (com.ibatis.db.sqlmap.cache.memory.memorycachecontroller) MEMORY 캐쉬는캐쉬행위를관리하기위해서참조타입을사용한다. 그것은가비지컬렉터 (garbage collector) 가캐쉬내에 머물러있는지아닌지효과적으로결정한다. MEMORY 캐쉬는객체재사용의일정한패턴이없는애플리케이션또는메모리 가충분하지않은애플리케이션을위한좋은선택이다. MEMORY 구현은다음처럼설정된다. <cachemodel id="product-cache" type="memory"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= reference-type value= WEAK /> </cachemodel> 단지하나의프라퍼티가 MEMORY 캐쉬구현에의해인식된다. reference-type 라는이름의프라퍼티는 STRONG, SOFT 또는 WEAK 의값으로셋팅되어야만한다. 그값들은 JVM 내에유효한여러가지메모리참조타입에대응된다. 다음의테이블은 MEMORY 캐쉬를위해사용될수있는다른참조타입을서술한다. 참조타입을핵심을좀더이해하기위해서 는 reachability 에대한정보를위한 java.lang.ref 부분의 JDK 문서를보기를바란다. WEAK (default) SOFT 이참조타입은대부분의경우에가장좋은선택이고참조타입을정의하지않는다면디폴트로설정되는값이다. 이것은대개의결과에성능을향상시킬것이다. 하지만할당된다른객체내에서사용되는메모리를완전히제거할것이다. 그결과는현재사용중이지않다는것을가정한다. 이참조타입은결과물이현재사용중이지않고메모리가다른객체를위해필요한경우에메모리가바닥나는가능성을제거할것이다. 어쨌든이것은할당되고좀더중요한객체에유효하지않는메모리에대해대부분공격적인참조타입이아니다. 30

31 STRONG 이참조타입은명시적을캐쉬가삭제될때까지메모리내에저장된결과물을보증한다. 이것은 1) 매우작음, 2) 절대적으로정적, and 3) 매우종종사용되는결과에좋다. 장점은특수한쿼리를위해매우좋은성능을보인다. 단점은결과물에의해사용되는메모리가필요할때다른객체를위해메모리를반환하지않는다. LRU (com.ibatis.db.sqlmap.cache.lru.lrucachecontroller) LRU 캐쉬는객체가자동으로캐시로부터어떻게삭제되는지결정하기위해 Least Recently Used( 가장최근에사용된 ) 알고리즘을사용한다. 캐쉬가가득찼을때가장최근에접근된객체는캐쉬로부터삭제된다. 이방법은종종참조되는특수한객체가있을때이것은가장최근에삭제된변경과함께캐쉬내에남을것이다. LRU캐쉬는오랜시간동안하나이상의사용자에게특별한객체가사용되는패턴을가지는애플리케이션을위해서좋은선택이다 ( 이를테면페이지처리된목록사이에앞페이지뒷페이지를탐색하는, 특수한검색키.. 등등 ). LRU 구현은다음처럼설정된다. <cachemodel id="product-cache" type="lru"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= size value= 1000 /> </cachemodel> 단지하나의프라퍼티만이 LRU캐쉬에의해인식된다. size 라는이름의프라퍼티는한번에캐쉬내에고정되는객체의최대갯수를표현하는숫자값으로설정해야한다. 여기서기억해야할중요한것은하나의문자열인스턴스로부터자바빈즈의 ArrayList 해당되는어떠한객체로도될수있다는것이다. 그래서메모리포화의위험이있다면당신의캐쉬내너무많이저장하지마라. FIFO (com.ibatis.db.sqlmap.cache.fifo.fifocachecontroller) FIFO 캐쉬는객체가캐쉬로부터자동적으로어떻게삭제될지결정하기위해 First In First Out( 먼저들어온것을먼저보 낸다.) 알로리즘을사용한다. 캐쉬가가득찼을때가장오래된객체는캐쉬로부터삭제될것이다. FIFO 캐쉬는특수한쿼 리가빠른성공내에서적은수로참조되는패턴을사용할때좋다. 하지만나중에몇몇시점에서는가능하지않다. FIFO 구현은다음처럼설정된다. <cachemodel id="product-cache" type="fifo"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> <property name= size value= 1000 /> </cachemodel> 단지하나의프라퍼티가 FIFO캐쉬에의해인식된다.. size 라는이름의프라퍼티는한번에캐쉬내에고정되는객체의최대갯수를표현하는숫자값으로설정해야한다. 여기서기억해야할중요한것은하나의문자열인스턴스로부터자바빈즈의 ArrayList 해당되는어떠한객체로도될수있다는것이다. 그래서메모리포화의위험이있다면당신의캐쉬내너무많이저장하지마라. 31

32 OSCACHE (com.ibatis.db.sqlmap.cache.oscache.oscachecontroller) OSCACHE 캐쉬는 OSCache 2.0 캐쉬엔진을위한플러그인이다. 이것은설정가능하고구분가능하고유연성이있다. OSCACHE 구현은다음처럼설정된다. <cachemodel id="product-cache" type="oscache"> <flushinterval hours="24"/> <flushonexecute statement="insertproduct"/> <flushonexecute statement="updateproduct"/> <flushonexecute statement="deleteproduct"/> </cachemodel> OSCACHE 구현은설정을위해어떠한프라퍼티요소도사용하지않는다. 대신에 OSCache 인스턴스는클래스패스가장상위 에위치시켜야하는표준적인 oscache.properties 을사용해서설정된다. 당신은알고리즘, 캐쉬크기, 영속성접근법 ( 메모리, 파일등등 ) 그리고클러스터링을설정할수있다. 좀더많은정보를위해서는 OSCache 문서를참조하라. OSCache 와그문서는다음의 Open Symphony 웹사이트에서찾을수 있다. 동적으로맵핑되는 Statements JDBC 를사용해서직접적으로작동할때매우공통적인문제는동적 SQL 이다. 파라미터값뿐만아니라파라미터와칼럼이모 두포함된변경을하는 SQL 문에서작업을하는것은매우어렵다. 전형적인해결법은조건적인 if-else 문과지겨운문자열연결 덩어리를사용하는것이다. 요구되는결과는종종쿼리가예제객체와유사한객체를찾기위해빌드될수있는예제에의해쿼 리된다. SQL Map API 는어떤맵핑된 statement 요소에적용될수있는상대적으로훌륭한해결법을제공한다. 이것은간단한 에제이다. <select id="dynamicgetaccountlist" cachemodel="account-cache" resultmap="account-result" > select * from ACCOUNT <isgreaterthan prepend="and" property="id" comparevalue="0"> where ACC_ID = #id# </isgreaterthan> order by ACC_LAST_NAME </select> 위에제에서파라미터빈의 id 프라퍼티의상태에의존해서생성될수있는두가지가능한 statement 가있다. 만약파라미터가 0 보다크다면 statement 는다음처럼생성될것이다. select * from ACCOUNT where ACC_ID =? 또는파라미터가 0 이거나더작다면 statement 는다음처럼보일것이다. 32

33 select * from ACCOUNT 이것의즉각적인유용함은좀더복잡한상황이발생하기전까지명백하게되지는않을것이다. 예를들면다음은좀더복잡한 예제이다. <statement id="dynamicgetaccountlist" resultmap="account-result" > select * from ACCOUNT <dynamic prepend="where"> <isnotnull prepend="and" property="firstname"> (ACC_FIRST_NAME = #firstname# <isnotnull prepend="or" property="lastname"> ACC_LAST_NAME = #lastname# </isnotnull> ) </isnotnull> <isnotnull prepend="and" property=" address"> ACC_ like # address# </isnotnull> <isgreaterthan prepend="and" property="id" comparevalue="0"> ACC_ID = #id# </isgreaterthan> </dynamic> order by ACC_LAST_NAME 상황에의존적으로위동적 statement 로부터각각다른 16 가지의 SQL 문이생성될수있다. if-slse 구조와문자열연결을코딩 하는것은덩어리지고수백라인의로드를요구할수있다. 동적 statement 를사용하는것은당신의 SQL 문에몇몇조건적인태그를추가하는것처럼간단하다. 예를들면 <statement id="somename" resultmap="account-result" > select * from ACCOUNT <dynamic prepend="where"> <isgreaterthan prepend="and" property="id" comparevalue="0"> ACC_ID = #id# </isgreaterthan> <isnotnull prepend= and" property="lastname"> ACC_LAST_NAME = #lastname# </isnotnull> </dynamic> order by ACC_LAST_NAME 위의 statement에서 <dynamic> 요소는동적인 SQL부분을구분한다. dynamic요소는옵션이고포함된조건이 statement에덧붙여지지않는다면 WHERE 과같은구문이포함되지않을경우에 WHERE 같은구문을관리하는방법을제공한다. statement부분은 statement내에포함될 SQL코드를포함할지안할지결정하는조건적요소를제한없이포함할수있다. 조건적인요소의모든것은쿼리로전달되는파라미터객체의상태에기초하여작동한다. 동적인요소와조건적인요소모두 33

34 prepend 속성을가진다. prepend속성은필요하다면부모요소의 prepend에의해오버라이딩되기위해자유로운코드의일부이다. 위예제에서 where 구문은첫번째 true조건구문을오버라이딩할것이다. 이것은 SQL문이정확하게빌드되는것을확인하기위해필요하다. 예를들면첫번째 true조건의경우에서 AND문이필요없고사실 statement이끝날것이다. 다음의섹션은다양한종류의요소 ( 바이너리조건을포함, 단일성분의조건과 iterate) 를서술한다. 바이너리조건적인요소 바이너리조건적인요소는정적값또는다른프라퍼티값을위한프라퍼티값과비교한다. 만약결과가 true 라면몸체부분 은 SQL 쿼리에포함된다. 바이너리조건적인속성 : prepend statement에붙을오버라이딩가능한 SQL부분 ( 옵션 ) property 비교되는프라퍼티 ( 필수 ) compareproperty 비교되는다른프라퍼티 ( 필수또는 comparevalue) comparevalue 비교되는값 ( 필수또는 compareproperty) <isequal> 프라퍼티와값또는다른프라퍼티가같은지체크. <isnotequal> 프라퍼티와값또는다른프라퍼티가같지않은지체크. <isgreaterthan> 프라퍼티가값또는다른프라퍼티보다큰지체크. <isgreaterequal> 프라퍼티가값또는다른프라퍼티보다크거나같은지체크. <islessthan> 프라퍼티가값또는다른프라퍼티보다작은지체크. <islessequal> 프라퍼티가값또는다른프라퍼티보다작거나같은지체크. 사용법예제 : <islessequal prepend= AND property= age comparevalue= 18 > ADOLESCENT = TRUE </islessequal> 단일조건적인요소 단일조건적인요소는특수한조건을위해프라퍼티의상태를체크한다. 단일조건적인속성 : prepend statement 에붙을오버라이딩가능한 SQL 부분 ( 옵션 ) property 체크되기위한프라퍼티 ( 필수 ) <ispropertyavailable> 프라퍼티가유효한지체크 ( 이를테면파라미터빈의프라퍼티이다.) <isnotpropertyavailable> 프라퍼티가유효하지않은지체크 ( 이를테면파라미터의프라퍼티가아니다.) <isnull> <isnotnull> <isempty> 프라퍼티가 null 인지체크 프라퍼티가 null 이아닌지체크 Collection, 문자열또는 String.valueOf() 프라퍼티가 null 이거나 empty( or 34

Microsoft PowerPoint - ibatis.pptx

Microsoft PowerPoint - ibatis.pptx Sustainability Solu 작성자 : 박찬연 Ibatis (2 nd ) 박찬연 () 2008. 04. 29 목차 소개 datasource sqlmap 트렌젝션 배치 SqlMapClient 로깅 SimpleDataSource ScriptRunner 2 소개 SQL Maps 프레임워크는관계형데이터베이스에접근할때필요한자바코드를현저하게줄일수있도록도와줍니다.

More information

iBATIS-SqlMaps-2

iBATIS-SqlMaps-2 Data Mapper (a.k.a SQL Maps) Version 2.0 개발자가이드 2006 년 3 월 11일 번역 : 이동국 (fromm0@gmail.com) 오타및오역은위메일주소로보내주시기바랍니다. 1 소개 ibatis Data Mapper 프레임워크는당신이관계형데이터베이스에접근할때필요한자바코드를현저하게줄일수있도록도와줄것이다. ibatis 는간단한 XML

More information

iBATIS-SqlMaps-2-Tutorial

iBATIS-SqlMaps-2-Tutorial ibatis SQL Maps 튜토리얼 For SQL Maps Version 2.0 June 17, 2004 번역 : 이동국 (fromm0@gmail.com) 오타및오역은위메일주소로보내주시기바랍니다. 1 소개 이튜토리얼은 SQL Maps 의전형적인사용법을설명한다. 각각의주제에대해서좀더상세한정보는 http://www.ibatis.com 에 서얻을수있는 SQL Maps

More information

iBATIS-SqlMaps-2

iBATIS-SqlMaps-2 데이터매퍼 (a.k.a SQL Maps) Version 2.0 개발자가이드 2006 년 11 월 30일 번역 : 이동국 (fromm0@gmail.com) 오타및오역은위메일주소로보내주시기바랍니다. 1 목차 소개데이터매퍼설치 1.x 에서업그레이드하기 SQL Map XML 설정파일 요소 요소

More information

< 목차 > 1. Data Access Service 개요 (ibatis 활용 ) 3. DBIO 소개

< 목차 > 1. Data Access Service 개요 (ibatis 활용 ) 3. DBIO 소개 전자정부표준프레임워크 Data Access Service 소개 2011-02-23 오픈커뮤니티김영우커미터 < 목차 > 1. Data Access Service 개요 (ibatis 활용 ) 3. DBIO 소개 Contents 1. Data Access Service 개요 1-1. 데이터처리레이어란? 1-2. 데이터처리레이어구성요소 1-3. Data Access

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

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

JVM 메모리구조

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

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

JDBC 소개및설치 Database Laboratory

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

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

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

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 05. 객체의 활용 public class Person{ public String name; public int age; } public Person(){ } public Person(String s, int a){ name = s; age = a; } public String getname(){ return name; } @ 객체의선언 public static void main(string

More information

ALTIBASE 사용자가이드 Templete

ALTIBASE 사용자가이드 Templete Real Alternative DBMS ALTIBASE, Since 1999 ibatis 연동가이드 2010. 09 Copyright c 2000~2014 ALTBASE Corporation. All Rights Reserved. Document Control Change Record Date Author Change Reference 2010-09 snkim

More information

쉽게 풀어쓴 C 프로그래밊

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

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

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

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

PowerPoint Template

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

More information

쉽게 풀어쓴 C 프로그래밍

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

More information

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE ALTIBASE HDB 6.3.1.10.1 Patch Notes 목차 BUG-45710 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG-45730 ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG-45760 ROLLUP/CUBE 절을포함하는질의는 SUBQUERY REMOVAL 변환을수행하지않도록수정합니다....

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

MyBatis

MyBatis MyBatis 목차 3 1.1 mybatis 웹애플리케이션개발하기 4 1.1.1 설치하기 4 1.1.2 MYBATIS 설정파일 5 1.1.3 매퍼 XML과매퍼애노테이션 13 1.1.4 트랜잭션관리 16 1.1.5 좀더복잡한매핑규칙정의 17 1.MyBatis 시작하기 1.1 mybatis 웹애플리케이션개발하기 이전장에서는간단한 mybatis 애플리케이션을만들었고,

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

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

17장 클래스와 메소드

17장 클래스와 메소드 17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18 학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18 객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

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

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

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager are trademarks or registered trademarks of Ari System, Inc. 1 Table of Contents Chapter1

More information

Microsoft PowerPoint - 10Àå.ppt

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

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

슬라이드 1

슬라이드 1 컬렉션프레임워크 (Collection Framework) 의정의 - 다수의데이터를쉽게처리할수있는표준화된방법을제공하는클래스들 - 데이터의집합을다루고표현하기위한단일화된구조 (architecture) - JDK 1.2 이전까지는 Vector, Hashtable, Properties와같은컬렉션클래스로서로다른각자의방식으로처리 - 컬렉션프레임워크는다수의데이터를다루는데필요한다양하고풍부한클래스들을제공하므로프로그래머의부담을상당부분덜어준다.

More information

슬라이드 1

슬라이드 1 1. 개요 - 실행환경데이터처리레이어 (1/3) 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 서비스그룹 설명 Presentation Layer 전자정부개발프레임워크실행환경 Business Logic Layer Persistence Layer Batch Layer Integration Layer Mobile Presentation

More information

(jpetstore \277\271\301\246\267\316 \273\354\306\354\272\270\264\302 Spring MVC\277\315 iBatis \277\254\265\277 - Confluence)

(jpetstore \277\271\301\246\267\316 \273\354\306\354\272\270\264\302 Spring MVC\277\315 iBatis \277\254\265\277 - Confluence) 8 중 1 2008-01-31 오전 12:08 오픈소스스터디 jpetstore 예제로살펴보는 Spring MVC와 ibatis 연동 Added by Sang Hyup Lee, last edited by Sang Hyup Lee on 1월 16, 2007 (view change) Labels: (None) 지금까지 Spring MVC 를셋팅하는과정에서부터하나의

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information

untitled

untitled PowerBuilder 連 Microsoft SQL Server database PB10.0 PB9.0 若 Microsoft SQL Server 料 database Profile MSS 料 (Microsoft SQL Server database interface) 行了 PB10.0 了 Sybase 不 Microsoft 料 了 SQL Server 料 PB10.0

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

@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

제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

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx 자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March

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

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

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

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

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

DocsPin_Korean.pages

DocsPin_Korean.pages Unity Localize Script Service, Page 1 Unity Localize Script Service Introduction Application Game. Unity. Google Drive Unity.. Application Game. -? ( ) -? -?.. 준비사항 Google Drive. Google Drive.,.. - Google

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

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout <<  양수입력 : ; cin >> *p; if (*p <= 0) cout <<  양수를입력해야합니다  << endl; return; 동적할 15 장기타주제들 auto_ptr 변환함수 cast 연산자에의한명시적형변환실행시간타입정보알아내기 (RTTI) C++ 프로그래밍입문 1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout > *p; if (*p

More information

Apache Ivy

Apache Ivy JBoss User Group The Agile Dependency Manager 김병곤 fharenheit@gmail.com 20100911 v1.0 소개 JBoss User Group 대표 통신사에서분산컴퓨팅기반개인화시스템구축 Process Designer ETL, Input/Output, Mining Algorithm, 통계 Apache Hadoop/Pig/HBase/Cassandra

More information

Chapter 1

Chapter 1 3 Oracle 설치 Objectives Download Oracle 11g Release 2 Install Oracle 11g Release 2 Download Oracle SQL Developer 4.0.3 Install Oracle SQL Developer 4.0.3 Create a database connection 2 Download Oracle 11g

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 20 장패키지 이번장에서학습할내용 패키지의개념 패키지로묶는방법 패키지사용 기본패키지 유틸리티패키지 패키지는연관된클래스들을묶는기법입니다. 패키지란? 패키지 (package) : 클래스들을묶은것 자바라이브러리도패키지로구성 ( 예 ) java.net 패키지 네트워크관련라이브러리 그림 20-1. 패키지의개념 예제 패키지생성하기 Q: 만약패키지문을사용하지않은경우에는어떻게되는가?

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Elements and attributes 조윤상 ( 과편협기획운영위원 ) 1 Table of Contents 1. Elements( 요소 )? 2. Attributes( 속성 ), PCDATA, CDATA? 3. Elements 선언방법 4. Attributes 속성 2 15 th KCSE Editor s Workshop, Seoul 2015 Elements

More information

Microsoft PowerPoint - Introduction to Google Guava.pptx

Microsoft PowerPoint - Introduction to Google Guava.pptx 2012 년자바카페 OPEN 세미나 주제 : Introduction to Google Guava 2012. 6. 16 김흥래 hrkim3468@gmail.com Java Developer s Forum JavaCafe community 구아바???? Java Developer s Forum JavaCafe Community 소개 Google Core Library

More information

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

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

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

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

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

More information

JUNIT 실습및발표

JUNIT 실습및발표 JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected

More information

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

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일 Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 Introduce Me!!! Job Jeju National University Student Ubuntu Korean Jeju Community Owner E-Mail: ned3y2k@hanmail.net Blog: http://ned3y2k.wo.tc Facebook: http://www.facebook.com/gyeongdae

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

Spring Boot

Spring Boot 스프링부트 (Spring Boot) 1. 스프링부트 (Spring Boot)... 2 1-1. Spring Boot 소개... 2 1-2. Spring Boot & Maven... 2 1-3. Spring Boot & Gradle... 3 1-4. Writing the code(spring Boot main)... 4 1-5. Writing the code(commandlinerunner)...

More information

<4D F736F F F696E74202D E DB0FCB0E820BBE7BBF3BFA120C0C7C7D120B0FCB0E820B5A5C0CCC5CDBAA3C0CCBDBA20BCB3B0E8>

<4D F736F F F696E74202D E DB0FCB0E820BBE7BBF3BFA120C0C7C7D120B0FCB0E820B5A5C0CCC5CDBAA3C0CCBDBA20BCB3B0E8> 데이터베이스 (Database) ER- 관계사상에의한관계데이터베이스설계 문양세강원대학교 IT특성화대학컴퓨터과학전공 설계과정 [ 그림 3.1] 작은세계 요구사항들의수정과분석 Functional Requirements 데이타베이스요구사항들 FUNCTIONAL ANALYSIS 개념적설계 ERD 사용 High level ltransaction Specification

More information

13주-14주proc.PDF

13주-14주proc.PDF 12 : Pro*C/C++ 1 2 Embeded SQL 3 PRO *C 31 C/C++ PRO *C NOT! NOT AND && AND OR OR EQUAL == = SQL,,, Embeded SQL SQL 32 Pro*C C SQL Pro*C C, C Pro*C, C C 321, C char : char[n] : n int, short, long : float

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

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

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

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

More information

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

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인 표준프레임워크로구성된컨텐츠를솔루션에적용하는것에문제가없는지확인 ( S next -> generate example -> finish). 2. 표준프레임워크개발환경에솔루션프로젝트추가. ( File -> Import -> Existring Projects into

More information

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600 균형이진탐색트리 -VL Tree delson, Velskii, Landis에의해 1962년에제안됨 VL trees are balanced n VL Tree is a binary search tree such that for every internal node v of T, the heights of the children of v can differ by at

More information

설계란 무엇인가?

설계란 무엇인가? 금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 9 강. 클래스의활용목차 멤버함수의외부정의 this 포인터 friend 선언 static 멤버 임시객체 1 /17 9 강. 클래스의활용멤버함수의외부정의 멤버함수정의구현방법 내부정의 : 클래스선언내에함수정의구현 외부정의 클래스선언 : 함수프로토타입 멤버함수정의 : 클래스선언외부에구현

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

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라. 기술문서 14. 11. 10. 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 dokymania@naver.com I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라. Exploit 5 마. 피해 6 III. 결론 6 가. 권고사항 6 I. 소개 가. 역자 본문서는

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

슬라이드 1

슬라이드 1 1. 개요 2. Data Source 3. Data Access 4. ORM 5. Transaction - 1 - 1. 개요 - 실행환경데이터처리레이어 (1/3) 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 전자정부개발프레임워크실행환경 서비스그룹 Presentation Layer 설명 업무프로그램과사용자간의 Interface

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

Microsoft PowerPoint - 27.pptx

Microsoft PowerPoint - 27.pptx 이산수학 () n-항관계 (n-ary Relations) 2011년봄학기 강원대학교컴퓨터과학전공문양세 n-ary Relations (n-항관계 ) An n-ary relation R on sets A 1,,A n, written R:A 1,,A n, is a subset R A 1 A n. (A 1,,A n 에대한 n- 항관계 R 은 A 1 A n 의부분집합이다.)

More information

adfasdfasfdasfasfadf

adfasdfasfdasfasfadf C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.

More information

TITLE

TITLE CSED421 Database Systems Lab MySQL Basic Syntax SQL DML & DDL Data Manipulation Language SELECT UPDATE DELETE INSERT INTO Data Definition Language CREATE DATABASE ALTER DATABASE CREATE TABLE ALTER TABLE

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

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

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

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

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V Mobile Service > IAP > Android SDK IAP SDK TOAST SDK. IAP SDK. Android Studio IDE 2.3.3 Android SDK Version 2.3.3 (API Level 10). Name Reference Version License okhttp http://square.github.io/okhttp/ 1.5.4

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

Microsoft PowerPoint - CSharp-10-예외처리

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

More information

Microsoft PowerPoint - 2강

Microsoft PowerPoint - 2강 컴퓨터과학과 김희천교수 학습개요 Java 언어문법의기본사항, 자료형, 변수와상수선언및사용법, 각종연산자사용법, if/switch 등과같은제어문사용법등에대해설명한다. 또한 C++ 언어와선언 / 사용방법이다른 Java의배열선언및사용법에대해서설명한다. Java 언어의효과적인활용을위해서는기본문법을이해하는것이중요하다. 객체지향의기본개념에대해알아보고 Java에서어떻게객체지향적요소를적용하고있는지살펴본다.

More information

PowerPoint Template

PowerPoint Template 설치및실행방법 Jaewoo Shim Jun. 4. 2018 Contents SQL 인젝션이란 WebGoat 설치방법 실습 과제 2 SQL 인젝션이란 데이터베이스와연동된웹서버에입력값을전달시악의적동작을수행하는쿼리문을삽입하여공격을수행 SELECT * FROM users WHERE id= $_POST[ id ] AND pw= $_POST[ pw ] Internet

More information

슬라이드 1

슬라이드 1 - 1 - 전자정부모바일표준프레임워크실습 LAB 개발환경 실습목차 LAB 1-1 모바일프로젝트생성실습 LAB 1-2 모바일사이트템플릿프로젝트생성실습 LAB 1-3 모바일공통컴포넌트생성및조립도구실습 - 2 - LAB 1-1 모바일프로젝트생성실습 (1/2) Step 1-1-01. 구현도구에서 egovframe>start>new Mobile Project 메뉴를선택한다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드]

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드] GUI 설계 6 주차 DB 연동김문정 tops@yd.ac.kr 강의순서강의전환경 JDK 설치및환경설정톰캣설치및환경설정이클립스 (JEE) 설치및환경설정 MySQL( 드라이버 ) 설치및커넥터드라이브연결 DB 생성 - 계정생성이클립스에서 DB에연결서버생성 - 프로젝트생성 DB연결테이블생성및등록 2 MySQL 설치확인 mysql - u root -p MySQL 에데이터베이스추가

More information

FileMaker 15 ODBC 및 JDBC 설명서

FileMaker 15 ODBC 및 JDBC 설명서 FileMaker 15 ODBC JDBC 2004-2016 FileMaker, Inc.. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc.. FileMaker WebDirect FileMaker, Inc... FileMaker.

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

Chap7.PDF

Chap7.PDF Chapter 7 The SUN Intranet Data Warehouse: Architecture and Tools All rights reserved 1 Intranet Data Warehouse : Distributed Networking Computing Peer-to-peer Peer-to-peer:,. C/S Microsoft ActiveX DCOM(Distributed

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Spider For MySQL 실전사용기 피망플러스유닛최윤묵 Spider For MySQL Data Sharding By Spider Storage Engine http://spiderformysql.com/ 성능 8 만 / 분 X 4 대 32 만 / 분 많은 DB 중에왜 spider 를? Source: 클라우드컴퓨팅구 선택의기로 Consistency RDBMS

More information

API 매뉴얼

API 매뉴얼 PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned

More information

thesis

thesis ( Design and Implementation of a Generalized Management Information Repository Service for Network and System Management ) ssp@nile nile.postech.ac..ac.kr DPE Lab. 1997 12 16 GMIRS GMIRS GMIRS prototype

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

슬라이드 1

슬라이드 1 정적메모리할당 (Static memory allocation) 일반적으로프로그램의실행에필요한메모리 ( 변수, 배열, 객체등 ) 는컴파일과정에서결정되고, 실행파일이메모리에로드될때할당되며, 종료후에반환됨 동적메모리할당 (Dynamic memory allocation) 프로그램의실행중에필요한메모리를할당받아사용하고, 사용이끝나면반환함 - 메모리를프로그램이직접관리해야함

More information