Oracle Database 강좌

오라클 데이터베이스와 웹훅(Webhook) 통합: PL/SQL과 JSON_OBJECT_T를 활용한 실전 가이드

_Blue_Sky_ 2024. 12. 16. 21:06
728x90

 

오늘날 데이터베이스는 단순히 데이터를 저장하는 공간을 넘어 다양한 시스템과 연동되어 실시간으로 정보를 교환하고 처리하는 중심 역할을 수행합니다. 이러한 환경에서 오라클 데이터베이스와 외부 시스템 간의 실시간 통신을 위한 효과적인 방법 중 하나가 바로 웹훅(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 관련 객체를 사용할 수 있습니다. 이를 활용하여 좀 더 깔끔하고 관리하기 쉬운 코드를 작성할 수 있습니다.


 

728x90

 

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 데이터가 전송됩니다.


 

728x90

보안 및 추가 고려 사항

  1. UTL_HTTP 권한 설정
    UTL_HTTP는 네트워크 접근 권한이 필요합니다. 필요한 경우 ACL(Access Control List)을 설정하세요.
  2. 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; /
  3. HTTPS 인증서 처리
    HTTPS를 사용할 경우 인증서가 필요할 수 있으므로 서버의 인증서를 데이터베이스로 로드해야 합니다.
  4. 에러 핸들링
    실제 운영 환경에서는 에러 로그를 기록하거나, 재시도를 위한 로직을 추가하는 것이 좋습니다.
웹훅 활용 시 주의 사항
  • 보안: 웹훅을 통해 민감한 정보를 전달할 때는 HTTPS를 사용하고, 필요한 경우 인증을 추가하여 보안을 강화해야 합니다.
  • 에러 처리: 웹훅 호출 시 발생할 수 있는 오류를 처리하기 위한 예외 처리 로직을 구현해야 합니다.
  • 성능: 대량의 데이터를 처리하거나 많은 수의 웹훅을 호출해야 하는 경우 성능 저하가 발생할 수 있으므로 주의해야 합니다.
  • 재시도: 웹훅 호출이 실패할 경우 재시도 메커니즘을 구현하여 데이터 손실을 방지해야 합니다.

웹훅 활용 사례

  • 실시간 알림: 새로운 데이터가 생성되거나 업데이트될 때 관련 담당자에게 알림을 전송합니다.
  • 외부 시스템 연동: 데이터베이스의 변경 사항을 다른 시스템에 실시간으로 반영합니다.
  • CI/CD 파이프라인: 코드 변경 시 빌드 및 배포 자동화를 위한 트리거로 활용합니다.
  • 데이터 동기화: 여러 시스템 간의 데이터를 동기화합니다.

결론

오라클 데이터베이스와 웹훅을 통합하면 시스템 간의 연동을 효율적으로 구현하고, 실시간 데이터 처리를 위한 강력한 기반을 마련할 수 있습니다. PL/SQL과 JSON_OBJECT_T를 활용하여 웹훅을 구현하면 개발 생산성을 높이고 시스템의 유연성을 향상시킬 수 있습니다.

728x90