오늘날 데이터베이스는 단순히 데이터를 저장하는 공간을 넘어 다양한 시스템과 연동되어 실시간으로 정보를 교환하고 처리하는 중심 역할을 수행합니다. 이러한 환경에서 오라클 데이터베이스와 외부 시스템 간의 실시간 통신을 위한 효과적인 방법 중 하나가 바로 웹훅(Webhook)입니다.
웹훅(Webhook)이란?
웹훅은 특정 이벤트가 발생하면 미리 설정된 URL로 HTTP 요청을 전송하는 방식으로, 서버 간 통신을 비동기적으로 수행하는 데 사용됩니다. 예를 들어, 오라클 데이터베이스의 특정 테이블에 새로운 데이터가 삽입되면 이벤트를 감지하여 외부 시스템에 알림을 전송할 수 있습니다.
오라클에서 웹훅 구현하기
오라클 데이터베이스에서 웹훅을 구현하기 위해서는 PL/SQL과 UTL_HTTP 패키지를 활용합니다. PL/SQL은 오라클 데이터베이스에서 제공하는 프로그래밍 언어로, 다양한 데이터베이스 작업을 수행할 수 있습니다. UTL_HTTP 패키지는 HTTP 요청을 보내고 응답을 받는 기능을 제공합니다.
1. 웹훅 URL 설정: 웹훅을 호출할 외부 시스템의 URL을 미리 정의합니다. 예를 들어, 새로운 사용자가 등록될 때마다 Slack 채널에 알림을 보내기 위해 Slack의 웹훅 URL을 사용할 수 있습니다.
2. 테이블 생성: 웹훅을 트리거할 이벤트가 발생할 테이블을 생성합니다. 예를 들어, 새로운 사용자 정보를 저장하는 users 테이블을 만들 수 있습니다.
3. PL/SQL 프로시저 작성: UTL_HTTP를 사용하여 HTTP 요청을 전송하는 프로시저를 작성합니다. 이때, JSON_OBJECT_T를 활용하여 요청 데이터를 JSON 형식으로 구성하면 더욱 효율적으로 데이터를 전달할 수 있습니다.
4. 트리거 생성: 테이블에 특정 이벤트(INSERT, UPDATE, DELETE 등)가 발생할 때 위에서 작성한 PL/SQL 프로시저를 호출하는 트리거를 생성합니다.
5. 테스트: 테이블에 데이터를 삽입하거나 수정하여 트리거가 정상적으로 작동하고 웹훅이 호출되는지 확인합니다.
JSON_OBJECT_T를 활용한 예시
Oracle Database 12c부터는 JSON_OBJECT_T와 같은 JSON 관련 객체를 사용할 수 있습니다. 이를 활용하여 좀 더 깔끔하고 관리하기 쉬운 코드를 작성할 수 있습니다.
JSON_OBJECT_T를 활용한 웹훅 구현 예제
1. 테이블 생성
데이터 삽입 시 웹훅 호출을 트리거하기 위해 기본 테이블을 만듭니다.
CREATE TABLE example_table (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR2(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. PL/SQL 프로시저 작성 (JSON_OBJECT_T 활용)
JSON_OBJECT_T를 사용하여 JSON 객체를 생성하고, 이를 HTTP 요청의 본문으로 사용합니다.
CREATE OR REPLACE PROCEDURE send_webhook (
p_name IN VARCHAR2
) AS
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_url VARCHAR2(200) := 'https://example.com/webhook';
l_body CLOB;
l_json_obj JSON_OBJECT_T;
BEGIN
-- JSON 객체 생성
l_json_obj := JSON_OBJECT_T();
l_json_obj.put('name', p_name);
l_json_obj.put('timestamp', TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS'));
-- JSON 객체를 문자열로 변환
l_body := l_json_obj.to_clob();
-- HTTP 요청 생성
l_http_request := UTL_HTTP.begin_request(
url => l_url,
method => 'POST',
http_version => 'HTTP/1.1'
);
-- 요청 헤더 설정
UTL_HTTP.set_header(l_http_request, 'Content-Type', 'application/json');
UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(l_body));
-- 요청 본문 추가
UTL_HTTP.write_text(l_http_request, l_body);
-- 요청 전송 및 응답 받기
l_http_response := UTL_HTTP.get_response(l_http_request);
UTL_HTTP.end_response(l_http_response);
DBMS_OUTPUT.put_line('Webhook sent successfully.');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Error sending webhook: ' || SQLERRM);
END;
/
JSON_OBJECT_T를 사용하는 이유:
- 가독성 향상: JSON 형식으로 데이터를 표현하여 코드 가독성을 높입니다.
- 유연성: 다양한 데이터 형식을 JSON 객체에 담아 전달할 수 있습니다.
- 표준화: JSON은 웹 서비스에서 널리 사용되는 데이터 교환 형식입니다.
3. 트리거 생성
이제 데이터를 삽입할 때 위의 send_webhook 프로시저를 호출하도록 트리거를 생성합니다.
CREATE OR REPLACE TRIGGER example_trigger
AFTER INSERT ON example_table
FOR EACH ROW
BEGIN
send_webhook(:NEW.name);
END;
/
4. 테스트
테이블에 데이터를 삽입하여 트리거와 프로시저가 제대로 작동하는지 확인합니다.
INSERT INTO example_table (name) VALUES ('John Doe');
COMMIT;
이렇게 하면 웹훅 엔드포인트(https://example.com/webhook)로 JSON 데이터가 전송됩니다.
보안 및 추가 고려 사항
- UTL_HTTP 권한 설정
UTL_HTTP는 네트워크 접근 권한이 필요합니다. 필요한 경우 ACL(Access Control List)을 설정하세요. - BEGIN DBMS_NETWORK_ACL_ADMIN.create_acl( acl => 'webhook_acl.xml', description => 'Allow webhook access', principal => 'SCHEMA_NAME', is_grant => TRUE, privilege => 'connect' ); DBMS_NETWORK_ACL_ADMIN.assign_acl( acl => 'webhook_acl.xml', host => 'example.com' ); END; /
- HTTPS 인증서 처리
HTTPS를 사용할 경우 인증서가 필요할 수 있으므로 서버의 인증서를 데이터베이스로 로드해야 합니다. - 에러 핸들링
실제 운영 환경에서는 에러 로그를 기록하거나, 재시도를 위한 로직을 추가하는 것이 좋습니다.
- 보안: 웹훅을 통해 민감한 정보를 전달할 때는 HTTPS를 사용하고, 필요한 경우 인증을 추가하여 보안을 강화해야 합니다.
- 에러 처리: 웹훅 호출 시 발생할 수 있는 오류를 처리하기 위한 예외 처리 로직을 구현해야 합니다.
- 성능: 대량의 데이터를 처리하거나 많은 수의 웹훅을 호출해야 하는 경우 성능 저하가 발생할 수 있으므로 주의해야 합니다.
- 재시도: 웹훅 호출이 실패할 경우 재시도 메커니즘을 구현하여 데이터 손실을 방지해야 합니다.
웹훅 활용 사례
- 실시간 알림: 새로운 데이터가 생성되거나 업데이트될 때 관련 담당자에게 알림을 전송합니다.
- 외부 시스템 연동: 데이터베이스의 변경 사항을 다른 시스템에 실시간으로 반영합니다.
- CI/CD 파이프라인: 코드 변경 시 빌드 및 배포 자동화를 위한 트리거로 활용합니다.
- 데이터 동기화: 여러 시스템 간의 데이터를 동기화합니다.
결론
오라클 데이터베이스와 웹훅을 통합하면 시스템 간의 연동을 효율적으로 구현하고, 실시간 데이터 처리를 위한 강력한 기반을 마련할 수 있습니다. PL/SQL과 JSON_OBJECT_T를 활용하여 웹훅을 구현하면 개발 생산성을 높이고 시스템의 유연성을 향상시킬 수 있습니다.
'Oracle Database 강좌' 카테고리의 다른 글
https://chatgpt.com/share/6762dfe7-08bc-8013-aae4-fbad02473e77 (0) | 2024.12.18 |
---|---|
오라클 스토어드 프로시저에서 JSON 데이터 생성 및 출력: 심층 분석 (0) | 2024.12.16 |
오라클 페이지네이션 성능 최적화: ROWNUM vs ROW_NUMBER() 심층 분석 및 추가 최적화 방안 (1) | 2024.12.14 |
오라클 페이징 구현 및 스토어드 프로시저 활용: 심층 분석 및 실제 예제 (2) | 2024.12.14 |
오라클 스토어드 프로시저 : 실무에서 활용하는 다양한 기능 (2) | 2024.12.08 |