'프로그래밍/오픈소스'에 해당되는 글 14건

  1. 2012.12.06 spring-data에서 redis 사용하기
  2. 2012.12.05 Hibernate @NotFound 어노테이션
  3. 2011.02.17 이클립스에 GlassFish 설치하기
  4. 2010.05.06 SQLite with Eclipse (1)
  5. 2010.04.13 SWF파일 분석 도구
  6. 2010.03.17 boost library 설치
  7. 2010.03.15 libcurl 사용하기
  8. 2009.09.11 SQLite (3)
  9. 2009.09.03 ACE(ADAPTIVE Communication Environment)
  10. 2009.08.21 MySQL++

spring-data는 이름에서 느낄수 있는 그대로 데이터 접근에 필요한 기능을 제공해준다.

spring-data는 하나의 큰 카테고리로 생각할 수 있으며, 그 하위의 sub-project들은 각각 big- data, http, redis, mongoDB 등 다양한 형태로 제공되는 데이터에 접근할 수 있는 기능을 구현한다.


spring-data에서 제공되는 데이터 접근 기술은 다음과 같다.



spring-data 관련 정보는 여기서 확인하자 : http://www.springsource.org/spring-data


본 포스팅에서는 spring-data에서 redis를 사용하는 방법을 다룬다.


먼저 redis에 대해 간략한 설명은 다음과 같다.


Redis는 "REmote DIctionary System"의 약자로 메모리 기반의 Key/Value Store 이다. 
Cassandra나 HBase와 같이 NoSQL DBMS로 분류되기도 하고, memcached와 같은 In memory 솔루션으로 분리되기도 한다. 성능은 memcached에 버금가면서 다양한 데이타 구조체를 지원함으로써 Message Queue, Shared memory, Remote Dictionary 용도로도 사용될 수 있으며, 이런 이유로 인스탄트그램, 네이버 재팬의 LINE 메신져 서비스, StackOverflow,Blizzard,digg 등 여러 소셜 서비스에 널리 사용되고 있다.

BSD 라이센스 기반의 오픈 소스이며 최근 VMWare에 인수되어 계속해서 업그레이드가 되고 있다. 16,000 라인정도의 C 코드로 작성되었으며, 클라이언트 SDK로는 Action Script,C,C#,C++,Clojure,Erlang,Java,Node.js,Objective-C,Perl,PHP,Python,Smalltalk,Tcl등 대부분의 언어를 지원한다.


필자는 일반적으로 RDBMS의 SQL 질의 결과를 캐시하는 용도로서 redis를 사용하고 있으나, 위 소개글 처럼 메모리 기반 NoSQL 솔루션으로 사용될 수도 있다. 


redis에 대한 정보는 여기서 확인하자 : http://www.redis.io/clients


redis는 다양한 언어의 클라이언트를 지원한다. 우리는 java언어를 사용하기 때문에 redis 클라이언트로 jedis를 사용해야 한다.


jedis : https://github.com/xetorthio/jedis


빌드툴로 maven을 사용하고 있다면 spring-data와 jedis 설치는 다음과 같다. 

버전은 알아서 최신 버전으로 바꿔주자. (jedis는 2.0 이상 버전을 사용해야 한다.)

<!-- jedis -->
<dependency> 
    <groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.1.0</version>
</dependency> 
<!-- jedis -->

<!-- spring data for jedis -->
<dependency>
	<groupId>org.springframework.data</groupId>
  	<artifactId>spring-data-redis</artifactId>
  	<version>1.0.2.RELEASE</version>
</dependency> 
<!-- spring data for jedis -->

다음으로 spring-context에 다음과 같이 bean 설정을 추가한다. 

<!-- Redis Source -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
	<property name="hostName" value="${redis.host}"/>
	<property name="port" value="${redis.port}"/>
	<property name="password" value="${redis.password}"/>
</bean>
    
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
   	<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!-- Redis Source -->

위 connectionFactory 샘플에서는 가장 기본적인 host, port, password 설정만 있다.

실제는 connection pooling 사용 등 다양한 설정을 처리할 수 있음을 참고한다.


StringRedisTemplate는 RedisTemplate를 상속하는데, RedisTemplate는 spring-data에서 redis로의 데이터 접근 및 처리 명령을 제공하는 helper class이다. redis의 대부분의 연산들이 string 처리에 기반하기 때문에 StringRedisTemplate는 가장 기초적이고 빈번하게 사용된다.


redis에서는 string, hash, list, set, sorted set 자료구조를 제공하는데 spring-data에서는 각각 자료구조에 해당하는 operation을 추상화한 클래스를 제공한다.


 sting

 ValueOperations<K, V>

 list

 ListOperations<K, V>

 hash

 HashOperations<K, HK, HV>

 set  SetOperations<K, V>
 sorted set  ZSetOperations<K, V>


이들 operation 클래스 외에도 주어진 key에 operation를 바인딩한 bounnd***Ops 형태의 이름을 가지는 클래스를 제공하기 도 한다. 이들 클래스는 내부적으로 각각 자료구조에 일치하는 operation 클래스를 사용하고 있기 때문에, 실질적으로위 표에 나열된 클래스를 통해 redis 연산이 수행된다는 것이다. 


각각의 operation 클래스는 jedis에서 제공하는 명령을 그대로 wrapping 하고 있기 때문에 사용법 자체는 그리 어렵지 않다.


redis 서버가 특정 key를 포함하고 있는지 확인하는 메소드는 다음과 같다.


 Boolean RedisTemplate::hasKey(String key)


다음의 예제코드는 BoundHashOperations를 통해 redis 서버에서 hash 구조로 데이터를 저장하고 읽어오는 예이다.

BoundHashOperations은 이미 특정 key에 바인딩되어 있으므로, 데이터를 읽거나 쓸때 key를 지정하지 않는다. (여기서 말하는 key는 hash의 key가 아님. hash 데이터 자체가 바인딩된 key를 의미)

// redis서버에서 hash형태의 데이터를 읽어온다.
public void restore(BoundHashOperations<String, String, String> hashOps) {
	refKey 		 = hashOps.get("refKey");
	refName 	 = hashOps.get("refName");
	name 		 = hashOps.get("name");
	basePath 	 = hashOps.get("basePath");
	relativePath 	 = hashOps.get("relativePath");
	srcName 	 = hashOps.get("srcName");
	srcExt 		 = hashOps.get("srcExt");
	size 		 = NumberUtils.toLong(hashOps.get("size"));
	width 		 = NumberUtils.toInt(hashOps.get("width"));
	height 		 = NumberUtils.toInt(hashOps.get("height"));
	orderNum 	 = NumberUtils.toInt(hashOps.get("orderNum"));
	try { regdate = fmt.parse(hashOps.get("regdate")); } catch(Exception ignore) {/**/}
}
	
// redis서버로 hash형태의 데이터를 저장한다.
public void cache(BoundHashOperations<String, String, String> hashOps) {
	if( StringUtils.isNotEmpty(refKey) ) 		hashOps.put("refKey", refKey);
	if( StringUtils.isNotEmpty(refName) ) 		hashOps.put("refName", refName);
	if( StringUtils.isNotEmpty(name) ) 		hashOps.put("name", name);
	if( StringUtils.isNotEmpty(basePath) ) 		hashOps.put("basePath", basePath);
	if( StringUtils.isNotEmpty(relativePath) ) 	hashOps.put("relativePath", relativePath);
	if( StringUtils.isNotEmpty(srcName) ) 		hashOps.put("srcName", srcName);
	if( StringUtils.isNotEmpty(srcExt) ) 		hashOps.put("srcExt", srcExt);
	if( size != null ) 				hashOps.put("size", String.valueOf(size));
	if( width != null ) 				hashOps.put("width", String.valueOf(width));
	if( height != null ) 				hashOps.put("height", String.valueOf(height));
	if( orderNum != null ) 				hashOps.put("orderNum", String.valueOf(orderNum));
	if( regdate != null ) 				hashOps.put("regdate", fmt.format(regdate));
}		

redis에서 제공하는 list, set 등의 자료구조로의 연산도, redis에서 제공하는 명령셋을 이해하면 어렵지 않게 사용할 수 있다.


마지막으로 redis에 대한 좋은 소개글 링크를 첨부한다.


http://dev.kthcorp.com/2011/07/28/redis-buildingfast-lightweight-webapp/

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

다음과 같이 Parent, Child 두개의 테이블이 존재하고 Parent와 Child가 1:N의 관계를 형성한다고 할때, Parent 테이블의 PK가 Child 테이블에서 FK로 사용되어진다. 아래 그림을 좀 더 자세히 보면 Parent는 0개 이상의 Child와 관계할 수 있고, Child는 반드시 1개의 Parent와 관계해야 하는 제약을 지니는데 이는 즉, parent_seq가 null이 될 수 없음을 의미한다.


 

위 내용은 관계형 데이터베이스 논리 모델링에서 나오는 아주 기초적인 내용이다.


그런데 실제 프로젝트를 진행하다보면 위와 같은 제약조건들을 제대로 지키지 않아 데이터 무결성이 훼손된 경우를 많이 보게 된다. 물론 시스템 퍼포먼스를 위해 의도적으로 비정규화를 수행하는 경우도 많지만, 심지어 모든 테이블에 PK만 존재하고 FK가 전혀 존재하지 않는 경우도 봐왔다. (물론 논리 모델에서는 FK가 존재하지만, 실제 물리 모델에는 FK를 전혀 반영하지 않은 경우이다) 필자는 아직 경험이 일천해 모든 관계형 데이터베이스 전문 서적에서 FK 제약조건에 대해 지켜야 한다고 나와있지만 , 실제 현업에서는 이런식의 데이터베이스 설계가 존재하는지 정확한 이유는 모른다. 아마도 제약조건에 따른 데이터 관리의 까다로움과 퍼포먼스 저하에 대한 우려 때문에 그런것이 아닌가 하고 추측만할 뿐이다.


어찌되었든 제약조건이 정상적으로 걸어져 있다면 Child 테이블에 parent_seq가 0을 가지는 row는 절대 insert될수가 없다. 

그러나 많은 데이터베이스 설계들이 이런 제약조건을 제대로 지키지 않고 있기 때문에 parent_seq가 0인 row가 insert되고 해당 Child의 row로부터 seq가 0인 row를 Parent 테이블에서 select 할 수 있는 가능성의 여지를 남겨두게 된다.


자 그럼 본론으로 들어가서 Hibernate를 통해 Child와 Parent Entity를 @ManyToOne 관계로 매핑하고 FetchType을 EAGER로 설정해 join 연산을 수행하게 되면 아래와 비슷한 오류 메세지를 만나게 된다.


org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.orderme.admin.entity.legacy.shop.ShopInfo#0] 


위와 같은 문제를 해결하기 위해 @NotFound 어노테이션을 사용할 수 있다.


 @NotFound(action=NotFoundAction.IGNORE)


식별자 값이 유효하지 않더라도 org.hibernate.ObjectNotFoundException 를 발생시키지 않고 무시한다. 


하지만 이게 과연 좋은 방법인가에 대해서는 고민을 해봐야한다. 위와 같은 조치를 통해 예외를 무시할 경우 데이터 무결성을 훼손시키는 데이터가 어딘가에 존재하고 있는데 그것을 인지할 수 있는 수단을 무시하는 것과 같기 때문이다.


커뮤니티에서도 이와 같은 문제를 지적하는 글을 찾을 수 있었다. 

https://forum.hibernate.org/viewtopic.php?f=1&t=1007085


현재 사용중인 Hibernate 버전은 3.6.10.Final 인데 아직 NotFoundAction의 옵션으로 IGNORE, EXCEPTION 2개만 제공하고 있는 것으로 보이며, 아직까지 해당 이슈에 대한 어떠한 조치는 없는 것 같다.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

1. GlassFish
GlassFish 커뮤니티가 제공하는 오픈 소스 애플리케이션 서버 GlassFish는 2005년 썬을 통해 선보인 이래로 개발자들 사이에서 큰 인기를 끌고 있습니다. GlassFish는 현재 두 가지 버전의 보급판(GlassFish v2와 새로 발표된 Glassfish v3 Prelude)이 시중에 나와 있으며, 그 중 GlassFish v2는 현재까지 다운로드 횟수가 약 9백만 카피에 달하며 2009년 한 해에만 이미 30만 개의 제품이 등록되었습니다. 여기에 신기능을 추가하고 기존 기능을 더욱 강화한 Glassfish v3 Prelude는 Java나 동적 언어(jRuby 등) 기반의 리치 인터넷 애플리케이션 개발에 더할 나위 없는 최고의 플랫폼으로 평가 받고 있습니다.



2. 이클립스와 연동하기
GlassFish를 사이트에서 다운로드 받고 설치 파일을 실행합니다.
(GlassFish를 설치하기 위해서는 JDK1.6 이상이 설치 되어 있어야 합니다.)


위 그림처럼 -j 옵션을 주고 JDK 설치 디렉토리를 지정하여 설치 파일을 실행할 수 있습니다.

설치파일이 실행되면 필요한 정보를 입력하고 GlassFish 설치를 손쉽게 진행할 수 있습니다.


위 그림은 4848포트를 통해 GlassFish를 설정하고 모니터링 할 수 있는 관리자의 비밀번호는 입력하는 화면입니다.


GlassFish를 설치하기 위해서는 JDK1.6 이상의 버전이 필요합니다. 위 그림은 JDK의 설치 경로를 지정하는 화면 입니다.

JDK 경로지정을 마치면 GlassFish의 설치를 계속합니다.


GlassFish의 설치를 완료하고 GlassFish를 이클립스에 연동해 보겠습니다.


먼저 위 그림처럼 상단의 링크를 통해 GlassFish를 위한 Server Adapter를 추가해야 합니다.


링클를 클릭하면 위 그림처럼 다영한 Server Adapter가 나열되는데 이중에서 GlassFish를 선택하면 됩니다.
(위 그림에서는 이클립스에 이미 GlassFish Server Adapter가 추가되어 있기 때문에 목록에 나타나지 않고 있습니다.  GlassFish Server Adapter가 설치되지 않은 경우라면 Oracle WebLogic의 상단에 GlassFish가 위치하고 있습니다.)


 GlassFish Server Adapter를 설치하고, 이클립스 Server 탭에서 서버를 추가해보면 위 그림처럼 GlassFish가 존재하는 것을 확인 할 수 있습니다. 여기서 GlassFish Server Open Source Edition을 선택합니다.


앞서 언급했듯이 GlassFish를 구동하기 위해서는 JDK1.6 이상의 버전이 필요합니다.(JRE가 아닙니다.) 
따라서 아래 그림들 처럼 GlassFish를 구동하는데 사용될 JDK를 설정해야 합니다. 






JDK설정을 마치고, 아래 그림처럼 JDK의 설치 경로와 GlassFish설치 경로를 입력하여 GlassFish를 이클립스에 연동시킵니다.


마지막으로 아래 그림 처럼 Admin계정에 대한 비밀번호 입력을 합니다.


GlassFish 설치를 마치고 정상적으로 실행됬다면 localhost:4848을 통해 아래 그림과 같은 화면을 확인할 수 있습니다.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

다음 사이트에서 SQLiteJDBC를 다운로드 합니다.

* SQLite JDBC 다운로드: http://www.zentus.com/sqlitejdbc/

이클립스의 Perspective를 다음 그림과 같이 Database Development로 변경합니다.


Database Connection에서 오른쪽 마우스를 클릭해 새로운 Connection을 추가합니다.

추가할수 있는 다양한 형태의 Database 목록을 선택할 수 있는데 여기서 SQLite를 선택합니다.


위에서 다운로드한 SQLiteJDBC 설정하기 위해 다음 그림과 같이 상단 우측 삼각형(Edit Driver Definition)을 클릭합니다.


jar List 탭에서 Add JAR를 클릭하고 다운로드 받은 SQLiteJDBC Driver을 선택합니다.


연결할 SQLite 데이터베이스 파일을 지정하고 이름을 입력합니다.


성공적으로 Connection이 생성되면 다음 그림과 같은 화면을 볼 수 있습니다.


SQL문장을 실행하기 위해 Connection에서 오른쪽 마우스를 클릭해 'Open SQL Scrapbook'을 선택합니다.

그리고 화면에 나타나는 SQL Scrapbook에서 Type, Name, Database 등을 다음 그림과 같이 SQLite, Connection 이름, Database 이름을 지정합니다.


SQL문장을 입력하고 Alt + S로 SQL문장을 실행할 수 있습니다.

SQL문장 실행결과는 다음 그림과 같이 이클립스 하단에서 확인할 수 있습니다.


JDBC드라이버만 있다면 위와 비슷한 절차를 통해 Oracle, MySQL, DB2 등 다양한 Database 서버에 이클립스를 통해 접속하여 SQL문을 실행할 수 있습니다. 

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

  1. 좋은정보 감사합니다 트래백 가져갈께요

    2010.08.12 12:38 신고 [ ADDR : EDIT/ DEL : REPLY ]

SWFTools는 어도비 플래시 파일(*.swf)을 다룰 수 있는 유틸리티 모음입니다.
윈도우와 리눅스를 포함하는 다양한 운영체제에서 사용할 수 있으며, 사용에 제한이 없는 오픈소스 도구 입니다.


SWFTools의 주요 기능은 다음과 같습니다.

  • PDF2SWF
    A PDF to SWF Converter. Generates one frame per page. Enables you to have fully formatted text, including tables, formulas, graphics etc. inside your Flash Movie. It's based on the xpdf PDF parser from Derek B. Noonburg.
  • SWFCombine
    A multi-function tool for inserting SWFs into Wrapper SWFs, contatenating SWFs, stacking SWFs or for basic parameter manipulation (e.g. changing size).
  • SWFStrings
    Scans SWFs for text data.
  • SWFDump
    Prints out various informations about SWFs, like contained images/fonts/sounds, disassembly of contained code as well as cross-reference and bounding box data.
  • JPEG2SWF
    Takes one or more JPEG pictures and generates a SWF slideshow from them. Supports motion estimation compression (h.263) for better compression of video sequences.
  • PNG2SWF
    Like JPEG2SWF, only for PNGs.
  • GIF2SWF
    Converts GIFs to SWF. Also able to handle animated gifs.
  • WAV2SWF
    Converts WAV audio files to SWFs, using the L.A.M.E. MP3 encoder library.
  • AVI2SWF
    Converts AVI animation files to SWF. It supports Flash MX H.263 compression. Some examples can be found at examples.html. (Notice: this tool is not included anymore in the latest version, as ffmpeg or mencoder do a better job nowadays)
  • Font2SWF
    Converts font files (TTF, Type1) to SWF.
  • SWFBBox
    Allows to read out, optimize and readjust SWF bounding boxes.
  • SWFC
    A tool for creating SWF files from simple script files. Includes support for both ActionScript 2.0 as well as ActionScript 3.0.
  • SWFExtract
    Allows to extract Movieclips, Sounds, Images etc. from SWF files.
  • AS3Compile
    A standalone ActionScript 3.0 compiler. Mostly compatible with Flex.

프로그램을 다운로드 받아 설치하면 아래 그림과 같이 다양한 명령행 프로그램을 확인할 수 있습니다.


위 프로그램 중 swfextract는 플래시 파일로부터 이미지(JPEG, PNG) 파일을 추출하는데 사용될 수 있습니다.

먼저 플래시 파일안에 존재하는 이미지 파일들의 ID 값을 확인하기 위해 아래와 같은 명령을 실행합니다.

 swfextract.exe main.swf

  
명령을 실행하면 위 그림과 같이 플래시안의 다양한 오브젝트 및 리소스 ID를 출력합니다.

본 예에서는 JPEG중 ID가 3에 해당하는 이미지 파일을 추출하기 위해 다음과 같은 명령을 입력합니다.

 swfextract.ext -j 3 main.swf -o 3.jpg


위 명령을 실행하면 3.jpg 이미지가 생성된것을 확인할 수 있습니다.
(PNG 이미지를 추출하려면 위 명령에서 -j 대신 -p 파라미터를 입력합니다.) 

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

 자바는 하드웨어 접근이 원칙적으로 통제되어 있으므로 표준 API에서 지원하지 않는 기능을 사용하기 위해서는 네이티브 바이너리에 직접 접근해야만 한다. 이 제한은 플랫폼 독립적이어야 하는 자바의 원칙을 깨는 것이므로, 자바가 좀 더 많은 일을 할 수 있게 하기 위해 표준 API안에 개발에 필요한 가능한한 많은 기능들을 제공해야 했다. 덕분에 자바 개발자들은 네트워킹, 쓰레드, DB접근, GUI등 애플리케이션 개발에 필수적인 요소들에 객체지향적으로 잘 설계된 방대한 라이브러리를 자유롭게 사용할 수 있다.

 반면에, C++은 언어와 API가 별개이다. C++에서는 시스템에 관련된 API는 플랫폼 개발자가 제공하는 것이 원칙이므로, 플랫폼 독립적인 방법을 제공하기 위해 표준 API의 어휘를 늘리는 것에 적극적이지 않았다. 그 결과 iostream과 stl을 제외하자면 객체지향으로 설계된 API가 없는 거나 다름없는 빈약한 언어가 되었고, 나머지는 모두 플랫폼 개발자가 제공하는 라이브러리에 의존해야 했다.

 C++로 응용프로그램을 개발할 때, 사소하지만 빈번하게 사용되는 유틸리티들마저 부족한 것은 큰 문제이다. 달력이나 유리수 표현과 같은 유틸리티는 어지간한 입문서에서 단골로 다룰 만큼 작은 라이브러리지만, 표준이 없으므로 필요할 때마다 계속 "바퀴를 다시 발명하여"사용해야만 한다.

 boost는 이런 문제의식을 배경으로, 범용으로 빈번하게 사용되는 작은 유틸리티들을 제공하려는 프로젝트이다. 그래프, 쓰레기 수집 기능을 가진 포인터, 파일시스템, 수학 연산들, 쓰레드, 스캐너와 LL파서 등 유용한 기능을 가진 라이브러리들을 많이 확보하고 있다.

 boost는 다섯 달에 한 번 꼴로 버전업이 이루어지는데, 매 버전업마다 많은 라이브러리가 추가된다. 진보적인 C++문법을 사용하는 관계로 컴파일러와 플랫폼에 따라 성공적으로 컴파일되지 않는 라이브러리가 있을 수 있으니 테스트 결과를 참고해서 사용해야 한다. 지속적으로 포팅이 이루어지고 있으니 컴파일 실패율은 계속 낮아질 것으로 보인다. 너무 활발하게 진행되는 프로젝트이다 보니 버전업이 되면서 하위호환성이 보장되지 않는 경우가 있으므로 주의해야 한다.

boost 공식 사이트: http://www.boost.org/


1. boost 설치
 boost library는 c++의 template를 이용한 구현이 많은데, 이러한 기능들은 *.lib파일이 필요없이 헤더파일(*.hpp)만 있으면 사용할수 있다.(c++의 template는 선언과 구현을 헤더파일와 구현파일로 구분하는 것을 허용하지 않기 때문에, 선언과 구현이 모두 hpp 파일안에 존재한다.) boost는 또한 컴파일이 필요한 라이브러리를 제공하며 선택으로 빌드하여 사용할 수 있다.

boost의 설치를 손쉽게 해주는 툴이 아래 사이트에서 제공된다.


위 사이트에서 제공하는 boost 최신 버전 설치파일을 다운로드한다.

다운로드받은 파일을 실행해 사용하는 Visual Studio의 버전에 따라 아래와 같은 순서로 boost를 설칠할수 있다.

boost에서 제공하는 많은 컴포넌트(컴파일이 필요한)를 필요에 따라 선택해 설치할수 있다.


설치를 성공적으로 마치면 아래 그림과 같이 inclide디렉터리(boost 디렉터리)와 lib디렉터리를 확인할수 있다.


위 그림처럼 include 디렉터리에는 hpp파일들이 기능에 따라 정리되어 세부 디렉터리에 저장되어 있다.
asio 관련 파일을 링크시키자 한다면 #include <boost/asio/ssl.hpp>와 같이 링크할수 있다.


위 그림처럼 lib 디렉터리에는 컴파일된 lib파일이 있다.


2. 네이밍
lib파일들은 mt, gd와 같은 prefix가 붙는데 boost library에 대한 네이밍 규칙은 다음과 같다.

lib
MS Windows 플랫폼을 제외하고 모든 boost라이브러리는 이 string으로 시작된다. 단, MS Windows에서는 static library만 해당 prefix를 사용한다.

boost_regx
라이브러리 이름으로 모든 boost라이브러리의 파일명은 boost_ 로 시작된다.

-vc90
boost를 빅하는데 사용된 툴과 버전을 알려준다.

-mt
라이브러리가 멀티쓰레딩을 지원하는지 알려준다. -mt는 멀티쓰레딩을 지원하도록 빌드됬음을 의미힌다.

-d
빌드 옵션에 따라, 아래와 같은 추가 문자가 붙거나 빠진다.

 Key  Use this library when:
 s  linking statically to the C++ standard library and compiler runtime support libraries. 
 g  using debug versions of the standard and runtime support libraries.
 y  using a special debug build of Python.
 d  building a debug version of your code.
 p  using the STLPort standard library rather than the default one supplied with your compiler.
 n  using STLPort's deprecated “native iostreams” feature.8

-1_42
boost의 버전명.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

curl은 데이터 전송과 관련된 프로그램의 빠른 작성을 위해서 사용하는 command line tool입니다.
HTTP, FTP, LDAP, TELNET, HTTPS, DICT와 같은 프로토콜을 지원하며, SSL을 가지는 각각의 프로토콜 역시 지원합니다.
또한 HTTP기반의 upload, proxies, cookies, user+password 인증을 사용할 수도 있습니다.

이러한 툴의 제공과는 별도로 위의 프로토콜들을 지원하는 클라이언트의 제작을 도와주기 위한 libCURL을 제공합니다.
libCURL을 이용하면 데이터 전송과 관련된 프로그램을 빠르게 작성할 수 있습니다.

다운로드 : http://curl.haxx.se/


1. VC++에 설치하기
위 사이트에서 다운로드를 받은 압축파일을 풀면 아래 그림과 같이 dsw파일이 있는 것을 확인할수 있습니다.
(dsw파일은 비쥬얼 스튜디오 6.0의 워크스페이스 파일입니다.)


워크스페이스를 열면 아래와 같이 2개의 프로젝트가 존재하는데, libcurl을 빌드하면 라이브러리 파일을 얻을수 있습니다.
별도의 준비과정없이 바로 프로젝트가 빌드됩니다.


빌드가 완료되면 DLL-Debug(또는 DLL-release) 폴더 안에,  아래 그림과 같이 lib와 dll파일이 생성됩니다.
(디버그의 경우 postfix로 d가 붙습니다.)




2. 프로젝트에 링크하기
프로젝트의 추가 라이브러리 디렉터리에 위에서 빌드한 lib와 dll파일이 위치한 경로를 입력하고, 추가 종속성으로 lib파일명 을 입력한 후, libcurl의 헤더파일을 추가합니다.

아래 그림과 같은 헤더파일은 include 디렉터리 안에 존재합니다.




3. 예제 코드
프로젝트 셋팅이 완료되었으면 아래와 같은 예제 코드를 작성해 실행할 수 있습니다.
#include "stdafx.h"
#include <iostream>

#include "curl/curl.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	curl_global_init(CURL_GLOBAL_ALL);
	
	CURL *ctx = curl_easy_init();
	if( ctx == NULL ) {
		cout << "Unable to initialize cURL interface" << std::endl;
		return -1;
	}
	
	curl_easy_setopt(ctx, CURLOPT_URL, "http://www.daum.net");
	curl_easy_setopt(ctx, CURLOPT_NOPROGRESS, 1);

	curl_easy_setopt(ctx, CURLOPT_WRITEHEADER, stdout);
	curl_easy_setopt(ctx, CURLOPT_WRITEDATA, stdout);

	const CURLcode rc = curl_easy_perform(ctx);
	if( rc != CURLE_OK ) {
		cout << "Error from cURL: " << curl_easy_strerror(rc) << std::endl;
		return -1;
	}
	else {
		double statDouble;
		long statLong;
		char *statString = 0;

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_HTTP_CODE, &statLong) ) {
			cout << "Response code:  " << statLong << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_CONTENT_TYPE, &statString) ) {
			cout << "Content-Type:  " << statString << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_SIZE_DOWNLOAD, &statDouble) ) {
			cout << "Download size:  " << statDouble << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_SPEED_DOWNLOAD, &statDouble) ) {
			cout << "Download speed:  " << statDouble << endl; 
		}

	}
	
	curl_easy_cleanup(ctx);
	curl_global_cleanup();
	return 0;
}
보다 자세한 내용은 아래 페이지에서 확인할 수 있습니다.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
Posted by devop
TAG c++, CURL, HTTP, vc++

댓글을 달아 주세요

SQLite는 데이터베이스의 일종으로 SQL 데이터베이스 엔진을 탑재하는 경량화된 데이터베이스로서, MySQL, MS-SQL, Oracle과 같은 데이터베이스를 다루어 본 경험이 있는 사람이라면 SQLite에 손쉽게 익숙해질 수 있습니다. 

위에 언급한 MySQL 등의 데이터베이스들은 큰 큐모의 데이터베이스 프로그래밍을 지원하기에 적당하며 간단하고 빠른 용도의 데이터베이스로는 적합하지 않습니다. 그렇다고 파일을 사용하기에는 기능이 너무 제한적이며 데이터의 관리에도 어려움이 많습니다.

SQLite는 일종의 파일 데이터베이스로 MySQL 등과는 다르게 서버/클라이언트 모델을 지원하는 데이터베이스가 아니라, 로컬에서만 사용가능합니다. 원격 데이터베이스로의 Connection이 발생하지 않기때문에 데이터로의 접근이 매우 빠르며, 표준 SQL구문을 모두 지원하기 때문에 데이터의 관리도 용이합니다. SQLite는 그 경량성때문에 요즘 이슈가 되는 아이폰 등의 모바일 기기에 널리 사용되고 있으며 C, C++, Java, Object-C, Delphi, PHP 등 다양한 언어로 개발 환경을 지원하고, 다양한 운영체제에서 사용될 수 있습니다.

SQLite의 특징은 다음과 같습니다.

  • SQL92의 대부분을 지원한다. 다음은 지원하지 않는 몇 가지 기능들이다.
  • 단일 파일에 데이터베이스의 모든것을 포함한다.
  • ACID(Atomic, Consistent, Isolate, Durable) 보증
  • byte order에 관계없이 데이터 파일의 공유가 가능
  • 2테라바이트 (2^41)크기의 데이터 파일 생성지원
  • 효율적인 메모리 사용 : 25k라인정도의 C코드로 이루어졌다.
  • 많은 일반적인 명령을 실행하는데 PostgreSql과 Mysql보다 최소 2배이상 명령에 따라서 10-20배 이상 빠르다.
  • 하나의 구조체와 3개의 함수만 사용하는 정도로 sqlite를 사용하는 C/C++ 코드를 만들어 낼 수 있다.
  • TCL, Perl, PHP, .Net, Java, Python, SmallTalk, Ruby등의 다양한 언어지원
  • 다른 라이브러리등의 도움없이 작동된다. libsqlite.so와 sqlite 2개의 파일이면 작동 환경을 만들 수 있다.
  • Public Domain 라이센스를 가진다.
  • sqlite는 서버/클라이언트 모델을 지원하는 RDBMS가 아니다. 로컬에서만 사용가능하며 인터넷응용을 원한다면 별도의 서버 프로그램을 만들어야 한다.



1. Java에서 SQLite 사용하기
Java로 SQLite를 사용하기 위한 방법으로 Java Wrapper와 JDBC 드라이버가 있습니다. Wrapper는 C 라이브러리는 JNI를 통해 호출하는 방식으로 사용하기가 매우 번거롭습니다. JDBC 드라이버는 Java의 표준 JDBC 인터페이스를 통해 SQLite를 호출하는 방법으로 일반적인 데이터베이스를 다루는 방법과 거의 동일합니다.

SQLite JDBC 다운로드: http://www.zentus.com/sqlitejdbc/

SQLiteJDBC에는 기본적으로 SQLite3가 포함되어 있기때문에 별도로 SQLite를 다운로드 받지 않아도 됩니다.

Connection을 생성하는 코드는 다음과 같습니다.
public static Connection getConnection() {
		try {
			Class.forName("org.sqlite.JDBC");
			return DriverManager.getConnection("jdbc:sqlite:mydb.db");
		} catch (ClassNotFoundException e) {
		} catch (SQLException e) {
		}
		return null;
	}
Table을 생성하는 코드는 다음과 같습니다.
public void createTableTest() {
		Connection conn = null;
		Statement stat = null;
		try {
			conn = getConnection();
			if( conn != null ) {
				stat = conn.createStatement();
				stat.executeUpdate("drop table if exists mytable;");
				stat.executeUpdate("create table if not mytable(id int primary key);");
			}
		} catch (Exception e) {
			// exception handling
		} finally {
			if( stat != null ) try{ stat.close(); } catch(Exception e){}
			if( conn != null ) try{ conn.close(); } catch(Exception e){}
		}
	}
Select 쿼리를 수행하는 예제
public boolean selectQueryTest() {
		Connection conn = null;
		PreparedStatement stat = null;
		ResultSet rs = null;
		boolean result = false;
		try {
			conn = getConnection();
			if( conn != null ) {
				stat = conn.prepareStatement("select id from mytable where id=?;");
				stat.setLong(1, 10);
				rs = stat.executeQuery();
				if( rs.next() ) {
					if( 10 == rs.getLong("id") )
						result = true;
				}
			}
		} catch (Exception e) {
			// exception handling
		} finally {
			if( rs != null ) try{ rs.close(); } catch(Exception e){}
			if( stat != null ) try{ stat.close(); } catch(Exception e){}
			if( conn != null ) try{ conn.close(); } catch(Exception e){}
		}
		return result;
	}
한가지 주의해야 할 점은 SQLiteJDBC는 멀티쓰레드에서의 동기화를 지원하지 않기 때문에, 동시접근가능성이 있는 코드에 대해서 synchronized 블럭을 사용해야 합니다.(MySQL 등의 데이터베이스는 서버 프로세스에서 클라이언트간의 동기화가 이루어지기 때문에 synchronized 블럭을 사용할 필요가 없습니다.) 

'프로그래밍 > 오픈소스' 카테고리의 다른 글

이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
HttpClient와 Jericho Parser를 이용한 HTML 파싱  (0) 2009.07.28
Posted by devop

댓글을 달아 주세요

  1. SQLite로 작성한 DB를 이클립스에서 열람 및 수정할 수 있는 방법이 따로 있나요?

    2010.05.01 14:37 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 이클립스에서 SQLite 데이터베이스를 조작하는 방법을 포스팅 했습니다. http://lyb1495.tistory.com/entry/SQLite-with-Eclipse

      2010.05.06 14:08 신고 [ ADDR : EDIT/ DEL ]
  2. 좋은 정보 감사합니다 Trackback 해갈께요

    2010.08.12 12:36 신고 [ ADDR : EDIT/ DEL : REPLY ]

1. 개요
ADAPTIVE Communication Environment(ACE)는 네트웍 어플리케이션에서의 동시성(Concurrent)과 I/O를 효율적이고 유연하게 제어하기 위한 많은 핵심 패턴들을 제공해주는 오픈소스 기반 크로스 플랫폼 C++ 객체지향 프레임워크 입니다.

(The ADAPTIVE Communication Environment (ACE) is a freely available, open-source object-oriented (OO) framework that implements many core patterns for concurrent communication software. ACE provides a rich set of reusable C++ wrapper facades and framework components that perform common communication software tasks across a range of OS platforms. The communication software tasks provided by ACE include event demultiplexing and event handler dispatching, signal handling, service initialization, interprocess communication, shared memory management, message routing, dynamic (re)configuration of distributed services, concurrent execution and synchronization.)

ACE에 의해 제공되는 네투웍 소프트웨어 기능들은 다음과 같습니다.

  • 이벤트 다중수신 (event demultiplexing)
  • 이벤트 핸들러 디스페칭 (event handler dispatching)
  • 시그널 핸들링 (signal handling)
  • 서비스 초기화 (service initialization)
  • 프로세스간 통신 (interprocess communication)
  • 공유메모리 관리 (shared memory management)
  • 메세지 라우팅 (message routing)
  • 분산 서비스들에 대한 동적 (재)설정 (dynamic (re)configuration of distributed services)
  • 동시실행과 동기화 (concurrent execution and synchronization) 

ACE는 고성능 실시간 통신 서비스와 어플리케이션을 개발하는 데에 촛점이 맞춰져 있습니다. 이것은 프로세스간 통신, 이벤트 다중수신, 명시적 동적 링킹, 동시처리방식의 객체지향 네트워크 어플리케이션과 서비스의 개발을 단순하게 만들어줍니다. 이에 더하여 ACE는 시스템 설정과 동적으로 연결된 서비스들에 의한 실시간 재설정, 프로세스와 쓰레드상에서 서비스들을 실행하는 것을 자동화해주기 까지 합니다.

원문 링크: http://www.cs.wustl.edu/~schmidt/ACE-overview.html



2. ACE 빌드하기
먼저 ACE의 공식 사이트에서 ACE를 다운로드 받습니다. 다운로드 받은 파일을 압축을 풀고 내용은 보면 아래와 같은 화면을 볼 수 있습니다.


ace라는 폴더로 들어가 아래와 같이 config.h라는 파일을 추가해 줍니다.


config.h파일은 내용은 다음과 같습니다.
//#define ACE_AS_STATIC_LIBS 1
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
//#define ACE_NO_INLINE 1
#include "ace/config-win32.h"
ACE_AS_STATIC_LIBS는 ACE를 정적 라이브러리로 빌드할때 필요한 플래그 입니다.
ACE를 STL과 함께 사용하기 위해 ACE_HAS_STANDARD_CPP_LIBRARY 플래그를 정의합니다.
ACE_NO_INLINE 는 메소드 인라인처리를 무효화하기 위한 플래그 입니다.
config.h파일에서 include하는 파일은 빌드 시스템에 따라 다른데 여기서는 Windows에서 빌드하므로 config-win32.h를 추가합니다.
다시 상위폴더로 돌아와 Visual Studio 솔루션 파일을 열어 소스코드를 빌드할 준비를 합니다.
예제에서는 ACE_vc8라는 솔루션 파일을 오픈합니다.(프로젝트가 엄청 많아서 솔루션을 오픈하는데도 상당한 시간이 걸립니다.)
솔루션 파일을 열면 아래 그림과 같은 많은 프로젝트가 존재하는데 가장 위에서 ACE라는 프로젝트를 발견할 수 있습니다.
자 이제 ACE프로젝트를 빌드하면 됩니다.
빌드가 성공적으로 이루어지면 아래 그림과 같이 lib라는 폴더에 공유라이브러리가 성공적으로 생성된 것을 확인할 수 있습니다.
(d접미사가 붙은 라이브러리는 디버그용임을 나타냅니다.)

3.  ACE에 대한 개인적인 느낌
ACE는 크로스플랫폼 시스템 어플리케이션을 개발하는데 많은 도움을 줄 수 있는 매우 유용한 프레임워크 입니다. ACE는 운영체제의 다양한 시스템 API를 ACE 프레임워크 내부로 감추고 외부로 표준화된 인터페이스를 제공합니다. 일반적으로 많은 시스템 어플리케이션들은 각 운영체제에 매우 종속적이기 때문에 다른 플랫폼으로 이식하는 작업은 상당히 어려운데 ACE의 표준화된 인터페이스를 사용해 작성된 시스템 어플리케이션은 별도의 수정없이 다른 플랫폼으로의 이식이 가능하다라는 장점이 있습니다. 이것은 마치 Java의 JVM과 비슷하게 보일 수 있습니다. (하지만 ACE는 Java의 JVM과는 완전히 다른 개념을 가지며 서로 비교할 수 있는 대상이 아닙니다.) 때로는 운영체제간의 차이로 인해 특정 기능을 지원하는 시스템이 존재할 수 있습니다. 이런 경우 ACE는 자체적으로 특정 기능을 수행하기 위한 시뮬레이션 코드를 실행하게 되며 이것은 마치 시스템에서 해당 기능이 수행되는것과 같은 효과를 보입니다.(물론 이럴경우 퍼포먼스는 떨어지게 마련입니다.) 

또한 ACE 자체는 검증된 수많은 패턴으로 이루어진 객체지향 프레임워크로서 시스템 아키텍쳐를 학습하기 위한 훌륭한 레퍼런스로 활용될 수 있습니다. ACE가 담고있는 수많은 패턴과 철학은 Pattern-Oriented Software Architecture Volume 2에 집약되 있는데... 문제는 이 책을 읽어내기가 엄청나게 어렵습니다... ㅠ

ACE가 많은 장점을 지니고 있는 훌륭한 객체지향 프레임워크임에는 누구도 부인할 수 없을 것입니다. 다만, 이런 훌륭한 ACE를 실무에 사용하기 위해서는 사전 배경지식이 만만치 않으며 초반 학습곡선이 매우 가파르기 때문에 쉽게 익숙해지기가 어렵습니다. 게다가 국내에 소개된 ACE서적은 단 3권으로, ACE의 매우 방대한 내용을 생각해볼 때 단 3권의 서적으로 ACE의 많은 내용을 담아내기에는 무리가 있습니다.






'프로그래밍 > 오픈소스' 카테고리의 다른 글

SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
HttpClient와 Jericho Parser를 이용한 HTML 파싱  (0) 2009.07.28
GeoIP를 이용한 IP대역별 국가코드 검색  (1) 2009.07.07
Posted by devop

댓글을 달아 주세요

MySQL++은 이름에서 짐작할수 있듯이 MySQL C API를 보다 사용하기 쉽도록 C++인터페이스로 작성한 것입니다. 
MySQL++은 표준 C++ 컴파일러와 MySQL 데이터베이스를 설치가능한 플랫폼이라면 거의 모든 환경(Windows, Linux, MAC OS X 등)에서 동작가능합니다.

MySQL++과 같이 사용하기에 권장되는 MySQL은 버전 4.1이상 입니다. 그 이하버전에 대해서는 충분한 테스트가 이루어지지 않았다고 합니다.



1. 빌드하기
MySQL++을 컴파일 하기 위해서는 MySQL 설치시 제공하는 *.h 파일들과 라이브러리 파일이 필요합니다.(MySQL을 설치할때 개발지원 항목을 체크해야 합니다.)


MySQL을 개발지원을 포함해 설치하면 위 그림과 같은 화면을 볼수 있습니다. 여기서 include 폴더에 *.h 파일들이 lib/opt 폴더 안에 라이브러리 파일들이 존재합니다.



이제 MySQL++ 솔루션 파일을 열어 위 그림과 같이 추가 포함 디렉토리에 include 경로를, 추가 라이브러리 디렉터리에 lib/opt 경로를 넣어주면 됩니다.(기본적으로 C:\Program Files\MySQL\MySQL Server 5.0 경로 아래 해당 디렉터리 경로가 설정되 있습니다.)


이제 굵은 글씨로 표시된 mysqlpp 프로젝트를 성공적으로 빌드할 수 있습니다. 빌드를 마치면 Release(또는 Debug)폴더 안에 mysqlpp.dll 파일이 생성된것을 확인할수 있습니다.(디버그 버전일 경우 _d 라는 접미사가 붙습니다.)


2. MySQL++ 링크하기
MySQL++을 자신의 프로젝트로 링크해서 사용하기 위해서는 위에서와 비슷한 절차가 필요합니다. 먼저 MySQL의 *.h파일과 라이브러리 파일이 있는 include 경로와 lib 경로를 프로젝트에 설정하고 마찬가지로 MySQL++의 *.h파일과 라이브러리 파일이 있는 경로를 프로젝트에 설정해야 합니다.(*.h 파일들은  MySQL++의 lib폴더에서 찾을수 있습니다.)


3. 매뉴얼
사이트: http://tangentsoft.net/mysql++/doc/ 에서 다운로드 할 수 있습니다.
Specialized SQL Structures와 같은 특징들은 매우 유용하므로 자세히 살펴보는게 좋습니다.


4. 라이센스
MySQL++은 LPGL 라이센스 정책을 따릅니다. 여담이지만 LPGP 라이센스하의 프로젝트들은 공유라이브러리로만 빌드할수 있으며 정적 라이브러리로는 빌드가 불가능 합니다.


5. 다른 라이브러리
MySQL을 wrapping한 라이브러리로 Connector/C++이 있습니다. 

MySQL++과의 차이점은 다음과 같습니다.

   MySQL Connector/C++ MySQL++ 
API Follow JDBC 3.0 API  Non-standard API
The MySQL++ API is "C++-ish" and rich of C++ specific goodies
License GPL(+FLOSS License Exception)
Commercial license upon request 
LGPL 
Status Preview only  Stable GA(Generla Availability) release


6. 예제코드
#include "mysql++.h"

int main(int argc, char *argv[])
{
	// Get database access parameters from command line
	const char* db = 0, *server = 0, *user = 0, *pass = "";
	if (!parse_command_line(argc, argv, &db, &server, &user, &pass)) {
		return 1;
	}

	// Connect to the sample database.
	mysqlpp::Connection conn(false);
	if (conn.connect(db, server, user, pass)) {
		// Retrieve a subset of the sample stock table set up by resetdb
		// and display it.
		mysqlpp::Query query = conn.query("select item from stock");
		if (mysqlpp::StoreQueryResult res = query.store()) {
			cout << "We have:" << endl;
			for (size_t i = 0; i < res.num_rows(); ++i) {
				cout << '\t' << res[i][0] << endl;
			}
		}
		else {
			cerr << "Failed to get item list: " << query.error() << endl;
			return 1;
		}

		return 0;
	}
	else {
		cerr << "DB connection failed: " << conn.error() << endl;
		return 1;
	}
}

'프로그래밍 > 오픈소스' 카테고리의 다른 글

SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
HttpClient와 Jericho Parser를 이용한 HTML 파싱  (0) 2009.07.28
GeoIP를 이용한 IP대역별 국가코드 검색  (1) 2009.07.07
Posted by devop
TAG c++, mysql, MySQL++

댓글을 달아 주세요