본문 바로가기

프로그래밍153

ISAPI 기반 어플리케이션 서버의 데이터베이스 커넥션 처리 DataSnap REST Application Server 또는 SOAP Application Server 를 ISAPI 로 개발할 수 있다. 이때 해당 모듈을 데이터베이스 미들 티어로 사용할 경우라면 DB 커넥션에 대하여 몇 가지 작업을 해주어야한다. 1. 커넥션 관리 Wizard 에서 기본 생성되는 코드를 사용할 경우, 세션이나 요청별로 데이터베이스 커넥션이 발생하여 무수한 TIME_WAIT 를 발생시킨다. 물론 잦은 쿼리가 발생한다면 해당 쿼리당 커넥션 요청이 재발생하여 응답이 느려질 것이다. 다음은 데이터베이스 커넥션을 하나 생성해서 사용하는 방법이다. 물론, 풀링을 구현해서 사용하여도 좋을 것이다. 웹서비스로 개발되었다면, Service activation model 을 Global 로 해준다... 2012. 7. 20.
Delphi XE2 에서 DataSnap REST Application Client 프로젝트에서 New Item 을 실행한 후, DataSnap REST Client Module 을 추가한다. REST Application Server 가 다른 서버에 위치하는 경우엔 Remote Server 를 선택한다. 해당 서버가 단독 실행형이 아닌 IIS 에서 동작한다면, IIS module 을 선택한다. Host name 에 서버의 주소를 입력하고, Port 는 IIS 의 포트를 입력한다. 각종 테스트로 인하여 예제를 든 서버의 경우 9090 포트를 사용하고 있다. URL path 에 어플리케이션 서버가 위치하고 있는 경로를 입력한다.(예로 든 IIS 설정은 2012/06/05 - [프로그래밍/Delphi] - DataSnap REST Application ISAPI 배포 - IIS 7.5 의 .. 2012. 7. 13.
dbExpress MySQL 5.1 한글 테이블명 사용 최근 대부분의 플랫폼에서 유니코드를 지원하는 관계로 자연스레 한글 사용이 늘고 있는데, DBMS 의 테이블명이나 칼럼명도 한글로 사용하는 경우가 있다. MySQL 5.1 에서 기본 문자열을 utf8 로 정의한 후 이를 확인한다. SHOW VARIABLES LIKE 'char%'; 이후 델파이에서 TSQLConnection 설정 후, TSQLQuery 를 실행하거나 TSQLTable 을 사용할 경우 Syntax 오류 또는 ???? 로 테이블명이 나타날 것이다.(아참, libmysql.dll 은 32비트 버전을 구하여 시스템 폴더에 넣어야한다. 64비트 윈도우즈에서도 마찬가지이니 주의할 것.) 해결 방법은 간단하다. TSQLConnection 의 Params 에서 ServerCharSet 을 지정해주면 된다.. 2012. 6. 26.
Delphi XE2 에서 DataSnap REST Application Cross Domain 처리 기껏 REST 서버를 구축하여도 만약 해당 서버 어플리케이션의 API를 또 다른 서버에서 호출하여 사용할 경우, 접근 권한 문제가 발생한다.(대충 그려보았다.) 이를 해결하는 다양한 방법들이 존재하는데... 익스플로러 및 어지간한 예전 웹브라우저들까지 모두 지원하려면 JSONP 를 사용하여야 한다.(서버에서 access-control-allow-origin:* 을 헤더에 싣는 방법도 있지만, 최신 웹브라우저에서만 올바르게 동작하며 익스플로러에선 제대로 동작하지 않는다.) 일단, JSONP 에서 요구하는 형태로 결과를 반환하여야하는데 XE2 에 추가된 TDSHTTPWebDispatcher 의 FormatResult 이벤트 메소드를 아래와 같이 만지작거려야한다. procedure TWebModule1.DSH.. 2012. 6. 20.
Delphi XE2, dbExpress Oracle 10g 연동 오라클 연결시 필요한 라이브러리가 있는데, 이를 위해 오라클 클라이언트를 별도로 설치하는 것은 아무래도 배포시 거추장 스럽다. 일단, http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 에서 해당하는 instant client 를 다운로드 받는다. XE2 dbExpress 가 지원하는 데이터베이스와 해당 버전은 다음과 같으니 참고하면 된다. InterBase XE, 2009, 2007, 7.5.1, 7.1*, 8.0*, 6.5* (All) (Driver dbxINT.dll, Client GDS32.DLL)Firebird 2.5, 2.1, 1.5 (Ent/Ult/Arch) (Driver dbxfb.dll, .. 2012. 5. 30.
Interface 요약 #7 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 10. Interface Delegation IInterface1을 구현한 TObject1이 있다고하자. 만약, IInterface1 과 IInterface2 를 모두 사용하는 TCombinedObject의 경우 이미 TObject1에 의해 구현된 IInterface1를 소스카피와 같은 방법으로 다시 구현하여야할까? -> No. :) Delegation: 어떤 클래스가 다른 클래스의 포인터를 가지고 있음을 의미함. 델파이는 다른 클래스에 인터페이스의 구현부를 위임(delegate)할 수 있는 방법을 제공한다. type IInterface1.. 2012. 4. 19.
Interface 요약 #6 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 9. 클래스 내(內) 다중 인터페이스 구현 Object Pascal의 경우 C++ 과 같은 클래스의 다중상속은 지원하지 않는다.(다중상속 시 조상 메쏘드의 이름이 중복될 경우 애매한 상황이 연출되는 등의 문제가 있다.) 다중 인터페이스의 구현은 다음과 같다. type TMyMultiplyInterfacedClass = class(TInterfacedObject, IInterface1, IInterface2) 다중 인터페이스는 다중 상속과는 다르다.(상기 클래스의 조상 클래스는 TInterfacedObject 뿐이다.) type IInter.. 2012. 4. 19.
Interface 요약 #5 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 8. 객체 모델과 인터페이스 모델을 혼용하지 말 것. procedure DoSomethingWithInterface(Intf: IFormattedNumber); begin ShowMessage(Intf.FormattedString); end; procedure CreateAndUseObject; var MyInteger: TFormattedInteger; begin MyInteger:= TFormattedInteger.Create(12); DoSomethingWithInterface(MyInteger as IFormattedNumber);.. 2012. 4. 19.
Interface 요약 #4 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 7. Interface의 포인터 획득하기 var MyInteger: TFormattedInteger; MyNumber: IFormattedNumber; begin MyInteger:= TFormattedInteger.Create(12); MyNumber:= MyInteger; end; 컴파일시 정적으로 할당됨(만약, 객체가 해당 인터페이스를 지원하지 않으면 컴파일시 에러발생) var MyObject: TObject; MyNumber: IFormattedNumber; begin MyObject:= TFormattedInteger.Create.. 2012. 4. 19.
Interface 요약 #3 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 5. TInterfacedObject IUnknown 인터페이스의 실행부가 작성되어 있음(따라서, TInterfacedObjet를 상속하면 QueryInterface, _AddRef, _Release를 구현해줄 필요가 없음.) system.pas 에 정의됨 TInterfacedObject = class(TObject, IUnknown) protected FRefCount: Integer; function QueryInterface(const IID: TGUID; out Obj): HResul; stdcall; function _AddRef.. 2012. 4. 19.
Interface 요약 #2 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 4. GUID(Globally Unique Identifier) GetInterface 와 as 연산자를 사용하기 위해선 필요함(따라서 COM외에도 사용됨) Ctrl + Shift + G 로 생성 혹은 CoCreateGuid (Win API) 함수 호출 유일한 값임(현재 시간, 현재 프로세스 번호, MAC Address 등으로 생성) TGUID = record D1: LongWord; D2: Word; D3: Word; D4: array[0..7] of Byte; end; MyGuid:= ['{2DE825C1-EADF-11D2-B39F-0.. 2012. 4. 19.
Interface 요약 #1 지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;; 현재, 틈틈이 COM 공부를 하고 있는 중입니다. 해서 interface에 대해 이것저것 살펴보고 있는 중인데요. ^^ '사람은 아는 만큼 본다'라는 말을 절감하고 있습니다. 두어 달 전에는 볼 수 없었던 것들이 지금은 보이는 군요. 처음엔 아래 한글을 띄우고 공부한 것들을 강좌형태로 만들 생각이었는데 2페이지 가량 진행하다가 포기하였습니다. 아무래도 시간이 많이 부족하네요. 일단은 추후 문서화 작업을 하기로 하고... 급한대로 여기 게시판에다가 생각나는 부분을 요약할 생각입니다. 1. 추상 클래스 일반적인 클래스와 차이는 없으나, 거기에.. 2012. 4. 19.
파스칼로 만든 부트로더... - 1 - 2006년경 OS 제작에 한창 관심을 가지고 있던 무렵, Turbo Pascal 과 Delphi 로 모든 걸 제작해보고자 마음 먹고 이리저리 머리를 굴린 결과~ TP 로 부트로더를 만드는데 성공했다. { 000h~3FFh : Interrupt Vector Table 400h~4FFh : BIOS 500h~5FFh : DOS Parameters 1000h~7BFFh : unusable 7C00h~7DFFh : Boot Sector 7E00h~8FFFh : FAT Table 9000h~ABFFh : Directory Entry Table 10000h~1FFFFh : Stack 64 KBytes 20000h~2FFFFh : Boot Loader 64 KBytes 30000h~9FFFFh : Useable 44.. 2012. 4. 9.
PPP - Point to Point Protocol PPP 는 OSI 참조모델(2012/01/09 - [프로그래밍/서버관리] - OSI 7계층) 중 데이터링크(2계층)에서 동작한다. PPP Frame 은 다음과 같다. 상기 그림에서 Information 영역을 Protocol + Data 로 세분화하지 않으면 HDLC 의 프레임과 동일하다. 프로토콜에 따라 다음과 같은 값을 가지게된다. 간략하게 보면 다음과 같다. LCP(Link Control Protocol) 는 링크의 수립, 유지, 종료를 담당한다. PAP 와 CHAP 는 인증프로토콜이다. PAP 의 경우 clear text 로 계정과 암호를 보내기 때문에 보안상 취약하다. 따라서 MD5 로 해싱하여 처리하는 CHAP 방식이 많이 사용된다. NCP 는 서로 다른 망계층 프로토콜로 데이터를 전달할 수 .. 2012. 1. 11.
OSI 7계층 이젠 기억도 잘 안나는 OSI 7계층...ㅠㅠ 인터넷에 돌아다니는 이미지들을 참고하여 정리해보았다. 먼저, 각 층별 데이터 단위를 살펴보면 다음과 같다. 1계층 물리 계층: Bit 2계층 데이터링크 계층: Frame 3계층 네트워크 계층: Packet 4계층 트랜스포트 계층: Message, Segment 5계층 세션 계층: Message, Data 6계층 표현 계층: Message, Data 7계층 응용 계층: Message, Data 각 층은 아래 층의 데이터가 되며(Data Encapsulation), TCP/IP 에서 이러한 층간 관계를 나타내면 다음과 같다. HTTP 의 경우라면 다음과 같다. 각 층이 헤더와 바디로 구성되었다고 볼때 바디 즉, 직전 층에 해당하는 부분을 Payload 라고 부른.. 2012. 1. 9.