Oracle Database 강좌

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

_Blue_Sky_ 2024. 12. 16. 21:06
728x90
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
728x90