[C# PL/SQL] 14.오라클 프로시저에서 JSON 데이터 처리하기, 프로시저 내에서 JSON 데이터를 처리하고 C#과 연동하는 방법을 소개

현대의 데이터 처리 요구에 걸맞게 많은 데이터베이스 시스템은 JSON(JavaScript Object Notation) 형식의 데이터를 지원합니다. 오라클 또한 이러한 추세에 부응하여 JSON 데이터 타입을 도입하였으며, 이로 인해 개발자는 복잡한 데이터 구조를 간편하게 처리할 수 있게 되었습니다. 이 글에서는 오라클 프로시저에서 JSON 데이터를 어떻게 처리할 수 있는지, 그리고 C#과의 통합 방법에 대해 상세히 설명하겠습니다.

1. JSON 데이터와 오라클 데이터베이스

JSON은 데이터를 직렬화하는 방법 중 하나로, 가볍고 읽기 쉬우며 처리 속도가 빠릅니다. 오라클 12c 버전 이후로 JSON 데이터는 별도의 데이터 타입으로 지원되며, JSON 데이터를 SQL 쿼리와 PL/SQL 프로시저에서 직접 처리할 수 있습니다. JSON 데이터를 활용하면 데이터를 보다 유연하게 다루고, 여러 속성을 가진 복잡한 구조의 데이터를 쉽게 관리할 수 있습니다.

2. 오라클 JSON 데이터 타입

오라클은 JSON 데이터 관리를 위해 JSON 데이터 타입을 제공합니다. JSON 데이터는 VARCHAR2, CLOB, BLOB 필드에 저장될 수 있으며, 기본적으로 ‘JSON’이라는 키워드를 사용하여 데이터 타입을 명시할 수 있습니다. 또한, 오라클은 JSON 데이터를 효과적으로 검색하고 조작할 수 있는 여러 함수와 연산자를 제공합니다.

  • JSON_TABLE: JSON 데이터를 관계형 데이터 형태로 변환
  • JSON_QUERY: JSON 데이터에서 서브셋 추출
  • JSON_VALUE: JSON 데이터에서 특정 값을 추출

3. 오라클 프로시저 생성하기

JSON 데이터를 처리하기 위한 오라클 프로시저를 생성하는 예제를 살펴보겠습니다. 다음은 JSON 데이터를 입력받아 저장하는 프로시저의 예시입니다.


CREATE OR REPLACE PROCEDURE insert_json_data (p_json_data IN CLOB) IS
    v_emp_id NUMBER;
    v_emp_name VARCHAR2(100);
    v_emp_salary NUMBER;
BEGIN
    -- JSON 데이터에서 필요한 값 추출
    SELECT json_value(p_json_data, '$.id'), 
           json_value(p_json_data, '$.name'), 
           json_value(p_json_data, '$.salary')
    INTO v_emp_id, v_emp_name, v_emp_salary 
    FROM dual;

    -- 데이터베이스에 값 저장
    INSERT INTO employees (id, name, salary) VALUES (v_emp_id, v_emp_name, v_emp_salary);
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
END;

위 프로시저는 JSON 데이터를 입력받아 직원 정보를 저장하는 단순한 예제입니다. JSON 데이터에서 ‘id’, ‘name’, ‘salary’를 추출한 후, 이를 employees 테이블에 삽입합니다.

4. C#에서 JSON 데이터 처리하기

C#에서는 JSON 데이터를 처리하기 위해 다양한 라이브러리를 사용할 수 있습니다. 여기서는 인기 있는 Newtonsoft.Json 라이브러리를 활용하여 JSON 데이터를 생성하고 오라클 프로시저를 호출하는 방법을 살펴보겠습니다. NuGet 패키지를 통해 Newtonsoft.Json을 설치합니다.


// C#에서 JSON 데이터 생성하기
using Newtonsoft.Json;

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Salary { get; set; }
}

public void InsertEmployee()
{
    Employee emp = new Employee { Id = 1, Name = "John Doe", Salary = 3000.0m };
    string jsonData = JsonConvert.SerializeObject(emp);

    // 데이터베이스에 JSON 데이터 전송
    using (var connection = new OracleConnection("Data Source=...;User Id=...;Password=..."))
    {
        connection.Open();
        using (var command = new OracleCommand("insert_json_data", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("p_json_data", OracleDbType.Clob).Value = jsonData;
            command.ExecuteNonQuery();
        }
    }
}

위 C# 코드는 새로운 직원을 JSON 객체로 생성한 후, 이를 문자열로 직렬화하고 Oracle Database에 연결하여 프로시저를 호출하는 과정입니다. JSON 데이터는 단순히 직렬화된 문자열 형식으로 전달됩니다.

5. JSON 데이터 조회하기

이제 저장된 사원 정보를 조회하는 예제를 살펴보겠습니다. 오라클 프로시저를 이용하여 JSON 형식으로 데이터를 반환하는 방법입니다.


CREATE OR REPLACE PROCEDURE get_employees_json (p_json_data OUT CLOB) IS
    v_cursor SYS_REFCURSOR;
    v_json_output CLOB;
BEGIN
    OPEN v_cursor FOR SELECT json_object('id' VALUE id, 'name' VALUE name, 'salary' VALUE salary) AS employee
                       FROM employees;

    LOOP
        FETCH v_cursor BULK COLLECT INTO v_json_output;
        EXIT WHEN v_cursor%NOTFOUND;
    END LOOP;

    p_json_data := v_json_output;
    CLOSE v_cursor;
END;

위 프로시저는 employees 테이블의 모든 데이터를 JSON 객체 형태로 변환하여 반환합니다. C# 코드에서 이 프로시저를 호출하여 JSON 데이터를 수신할 수 있습니다.

6. C#에서 JSON 데이터 수신하기


public void GetEmployees()
{
    string jsonData;
    using (var connection = new OracleConnection("Data Source=...;User Id=...;Password=..."))
    {
        connection.Open();
        using (var command = new OracleCommand("get_employees_json", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("p_json_data", OracleDbType.Clob).Direction = ParameterDirection.Output;

            command.ExecuteNonQuery();
            jsonData = command.Parameters["p_json_data"].Value.ToString();
        }
    }

    var employees = JsonConvert.DeserializeObject>(jsonData);
    foreach (var emp in employees)
    {
        Console.WriteLine($"ID: {emp.Id}, Name: {emp.Name}, Salary: {emp.Salary}");
    }
}

위의 C# 코드는 오라클에서 JSON 형식으로 받은 데이터를 Deserialize하여 C#의 Employee 객체 리스트로 변환합니다. 이를 통해 JSON 데이터를 보다 직관적으로 다룰 수 있습니다.

7. 결론

오라클 프로시저에서 JSON 데이터를 처리하고 C#과의 연동하는 방법에 대해 살펴보았습니다. JSON 데이터 형식은 다양한 데이터 구조를 효율적으로 표현할 수 있는 강력한 도구이며, 이를 통해 데이터의 유연성과 확장성을 극대화할 수 있습니다. 이러한 기술을 통해 데이터베이스와 애플리케이션 간의 원활한 데이터 통신이 가능해졌으며, 이를 바탕으로 더 나은 데이터 처리 환경을 구축할 수 있습니다.

다양한 프로젝트에서 JSON 데이터 처리와 같은 최신 기술을 적용하면 더욱 향상된 서비스를 제공할 수 있습니다. 앞으로도 다양한 데이터 처리 기법을 활용하여 응용 프로그램의 효율성을 높이는 방법을 모색해 보시기 바랍니다.