Pro*C는 C 프로그래밍 언어를 사용하여 Oracle 데이터베이스와 연동하는 중재 언어입니다. C#은 .NET 프레임워크의 일부로, 객체 지향 프로그래밍 언어입니다. 이 두 언어를 연동하여 안정적이고 효율적인 데이터베이스 애플리케이션을 구축하기 위한 다양한 방법들이 존재합니다. 이 글에서는 Pro*C와 C# 간의 연동을 위한 세 가지 주요 방법, 즉 프로세스 간 통신(IPC), 파일 기반 데이터 교환, 네트워크 소켓 활용 방법을 다루겠습니다.
1. 프로세스 간 통신(IPC)
프로세스 간 통신(IPC)은 서로 다른 프로세스들이 데이터를 주고받기 위한 전략으로, 메모리 공유, 메시지 큐, 파이프, 소켓 등 여러 방법을 사용할 수 있습니다. Pro*C와 C#을 연동하는 데 있어 IPC를 활용하는 것은 다수의 애플리케이션이 서로 데이터를 효율적으로 교환하는 데 매우 유용합니다.
1.1. IPC의 이해
IPC는 물리적으로 다른 주소 공간에서 실행되고 있는 프로세스들 간의 데이터 교환을 가능하게 합니다. 일반적으로 두 가지 방법이 가장 많이 사용됩니다:
- 공유 메모리: 두 프로세스가 동일한 메모리 공간을 공유하여 데이터를 교환하는 기법입니다.
- 메시지 패싱: 한 프로세스가 다른 프로세스에 메시지를 보내고 수신하는 방식으로, 일반 소켓이나 파이프를 사용할 수 있습니다.
1.2. Pro*C와 IPC 연동 예제
아래는 Pro*C에서 IPC를 사용하여 C#과 데이터를 전달하는 예제입니다.
/* Pro*C 코드 예제 */
#include <stdio.h>
#include <sqlca.h>
#include <stdlib.h>
void sendMessage(char *message) {
// 메시지를 C# 쪽으로 전송하는 로직 구현
}
int main() {
/* 데이터베이스 연결 및 쿼리 처리 */
executeQuery(); // 쿼리 실행
sendMessage("Hello from Pro*C"); // C#으로 메시지 전송
return 0;
}
위의 Pro*C 코드는 간단하게 DB와 연결하고 메시지를 C#으로 보낼 수 있는 구조를 보여줍니다. C# 쪽에서는 해당 메시지를 수신하게 되어 있습니다.
2. 파일 기반 데이터 교환
파일 기반 데이터 교환은 데이터를 파일을 통해 주고받는 방법으로, 데이터를 영속적으로 저장할 필요가 있을 때 유용합니다. Pro*C에서는 쿼리 결과를 파일에 저장하고, C#에서는 해당 파일을 읽어들이는 방식으로 연동할 수 있습니다.
2.1. 파일 생성 및 쓰기
Pro*C에서 쿼리 결과를 파일에 저장하는 예제입니다.
/* Pro*C 파일 쓰기 예제 */
#include <stdio.h>
#include <sqlca.h>
#include <stdlib.h>
#include <string.h>
void writeToFile(char *filename, char *data) {
FILE *file = fopen(filename, "w");
if (file == NULL) {
perror("Unable to open file!");
exit(1);
}
fprintf(file, "%s", data);
fclose(file);
}
int main() {
/* DB 작업 후 쿼리 결과를 data 변수에 저장 */
char data[100] = "DB 작업 결과";
writeToFile("output.txt", data); // 결과를 output.txt에 저장
return 0;
}
위의 코드는 Pro*C 프로그램이 쿼리 결과를 “output.txt”라는 파일에 쓰는 방법을 보여줍니다. 다음으로 C#에서 해당 파일을 읽는 방법을 다루어 보겠습니다.
2.2. 파일 읽기 (C# 예제)
/* C# 파일 읽기 예제 */
using System;
using System.IO;
class Program {
static void Main(string[] args) {
string filename = "output.txt";
string data = File.ReadAllText(filename); // 파일에서 데이터 읽기
Console.WriteLine(data); // 읽은 데이터 출력
}
}
C# 코드는 Pro*C로 생성된 “output.txt” 파일에서 데이터를 읽어오는 방법을 보여줍니다. 이렇게 파일 기반 데이터 교환을 통해 둘 간의 상호작용이 가능해집니다.
3. 네트워크 소켓 활용
네트워크 소켓은 다른 컴퓨터에서 실행 중인 애플리케이션과 IPC를 가능하게 하는 방법으로, 클라이언트-서버 모델을 기반으로 합니다. 소켓을 사용하여 Pro*C와 C#이 서로 데이터를 주고받을 수 있습니다.
3.1. 소켓 이해하기
소켓은 네트워크에서 두 컴퓨터 간의 연결을 수립하기 위한 기술입니다. 소켓을 통해 프로세스는 TCP/IP 프로토콜을 사용하여 서로 통신할 수 있습니다. 클라이언트는 서버에 연결 요청을 하고, 서버는 요청을 수락하여 통신을 시작합니다.
3.2. Pro*C에서 소켓 서버 구현
/* Pro*C 소켓 서버 예제 */
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int socket_desc;
struct sockaddr_in server, client;
char *message = "Hello from Pro*C Server";
// 소켓 생성
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (socket_desc == -1) {
printf("Could not create socket");
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
// 바인드 및 리슨
bind(socket_desc, (struct sockaddr *)&server, sizeof(server));
listen(socket_desc, 3);
printf("Waiting for incoming connections...\n");
int c = sizeof(struct sockaddr_in);
int new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
send(new_socket, message, strlen(message), 0);
close(new_socket);
close(socket_desc);
return 0;
}
위의 Pro*C 코드는 간단한 소켓 서버를 구현하여 클라이언트로부터 연결 요청을 수신하고 “Hello from Pro*C Server” 메시지를 전송하는 구조를 보여줍니다.
3.3. C#에서 소켓 클라이언트 구현
/* C# 소켓 클라이언트 예제 */
using System;
using System.Net.Sockets;
using System.Text;
class Program {
static void Main() {
TcpClient client = new TcpClient("127.0.0.1", 8888);
NetworkStream stream = client.GetStream();
byte[] bytes = new byte[256];
int bytesRead = stream.Read(bytes, 0, bytes.Length);
string responseData = Encoding.UTF8.GetString(bytes, 0, bytesRead);
Console.WriteLine("Received: {0}", responseData);
client.Close();
}
}
C# 클라이언트는 Pro*C 서버에 연결하여 데이터를 수신하는 방법을 보여줍니다. 위의 예제에서는 Pro*C 서버로부터 받은 메시지를 콘솔에 출력합니다.
결론
이번 글에서는 Pro*C와 C# 간의 연동 방안을 알아보았습니다. IPC, 파일 기반 데이터 교환, 네트워크 소켓 활용 등 다양한 방법이 있으며, 각 방법의 장단점과 실제 코드 예제를 통해 이론을 더욱 구체화했습니다. 애플리케이션의 요구 사항에 따라 적절한 연동 방법을 선택하여 구현함으로써 효율적인 데이터 교환을 가능하게 할 수 있습니다. 이러한 기법들을 활용하여 데이터베이스와 강력한 C# 애플리케이션을 개발하는 데 많은 도움이 되기를 바랍니다.