5. C#과 오라클 프로시저를 이용한 CRUD 연산 구현
본 글에서는 C# 언어와 오라클 데이터베이스를 활용하여 CRUD(Create, Read, Update, Delete) 연산을 수행하는 방법에 대해 깊이 있게 설명하겠습니다. CRUD 연산은 데이터베이스 애플리케이션 개발의 기본 요소로, 데이터의 생성, 조회, 업데이트, 삭제를 포괄합니다. C#에서 오라클 프로시저를 사용하는 것은 비즈니스 로직을 데이터베이스와 효과적으로 통합하는 데 도움이 됩니다.
1. 준비사항
- Oracle Database: 오라클 데이터베이스가 설치되어 있어야 하며, 적절한 테이블 및 프로시저가 생성되어 있어야 합니다.
- C# 개발 환경: Visual Studio와 같은 C# 개발 환경이 필요합니다.
- ODP.NET: Oracle Data Provider for .NET (ODP.NET)을 설치하여 C# 애플리케이션이 Oracle 데이터베이스와 통신할 수 있게 합니다.
2. 오라클 프로시저 생성
우선, 데이터베이스에서 CRUD 연산을 수행할 프로시저를 작성해야 합니다. 아래는 예를 들어 보여줄 테이블과 프로시저입니다.
-- 사용자 테이블 생성
CREATE TABLE Users (
UserId NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
UserName VARCHAR2(100),
Email VARCHAR2(100)
);
-- 사용자 추가 프로시저
CREATE OR REPLACE PROCEDURE CreateUser (
p_UserName IN VARCHAR2,
p_Email IN VARCHAR2
) AS
BEGIN
INSERT INTO Users (UserName, Email) VALUES (p_UserName, p_Email);
COMMIT;
END CreateUser;
-- 사용자 조회 프로시저
CREATE OR REPLACE PROCEDURE ReadUser (
p_UserId IN NUMBER,
o_UserName OUT VARCHAR2,
o_Email OUT VARCHAR2
) AS
BEGIN
SELECT UserName, Email INTO o_UserName, o_Email FROM Users WHERE UserId = p_UserId;
END ReadUser;
-- 사용자 업데이트 프로시저
CREATE OR REPLACE PROCEDURE UpdateUser (
p_UserId IN NUMBER,
p_UserName IN VARCHAR2,
p_Email IN VARCHAR2
) AS
BEGIN
UPDATE Users
SET UserName = p_UserName, Email = p_Email
WHERE UserId = p_UserId;
COMMIT;
END UpdateUser;
-- 사용자 삭제 프로시저
CREATE OR REPLACE PROCEDURE DeleteUser (
p_UserId IN NUMBER
) AS
BEGIN
DELETE FROM Users WHERE UserId = p_UserId;
COMMIT;
END DeleteUser;
3. C# 애플리케이션에서 오라클 프로시저 호출하기
이제 프로시저를 수행할 C# 애플리케이션을 작성하겠습니다. 이를 위해 ODP.NET을 사용하여 Oracle 데이터베이스에 연결하고, 프로시저를 호출하겠습니다.
3.1. NuGet 패키지 설치
Visual Studio에서 ODP.NET을 설치하려면 NuGet Package Manager를 통해 설치합니다. ‘Oracle.ManagedDataAccess’ 패키지를 검색하여 설치합니다.
3.2. C# 프로젝트 작성
새로운 C# 콘솔 애플리케이션을 생성한 후 다음과 같은 코드로 CRUD 연산을 구현합니다.
using System;
using Oracle.ManagedDataAccess.Client;
namespace OracleCRUDExample
{
class Program
{
private static string connectionString = "User Id=your_user;Password=your_password;Data Source=your_data_source;";
static void Main(string[] args)
{
// Create
CreateUser("John Doe", "john.doe@example.com");
// Read
ReadUser(1); // Assume 1 is the user's ID
// Update
UpdateUser(1, "Jane Doe", "jane.doe@example.com");
// Delete
DeleteUser(1);
}
static void CreateUser(string userName, string email)
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand("CreateUser", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("p_UserName", OracleDbType.Varchar2).Value = userName;
cmd.Parameters.Add("p_Email", OracleDbType.Varchar2).Value = email;
cmd.ExecuteNonQuery();
Console.WriteLine("User Created Successfully.");
}
}
}
static void ReadUser(int userId)
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand("ReadUser", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("p_UserId", OracleDbType.Int32).Value = userId;
cmd.Parameters.Add("o_UserName", OracleDbType.Varchar2, 100).Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add("o_Email", OracleDbType.Varchar2, 100).Direction = System.Data.ParameterDirection.Output;
cmd.ExecuteNonQuery();
string userName = cmd.Parameters["o_UserName"].Value.ToString();
string email = cmd.Parameters["o_Email"].Value.ToString();
Console.WriteLine($"UserId: {userId}, UserName: {userName}, Email: {email}");
}
}
}
static void UpdateUser(int userId, string userName, string email)
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand("UpdateUser", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("p_UserId", OracleDbType.Int32).Value = userId;
cmd.Parameters.Add("p_UserName", OracleDbType.Varchar2).Value = userName;
cmd.Parameters.Add("p_Email", OracleDbType.Varchar2).Value = email;
cmd.ExecuteNonQuery();
Console.WriteLine("User Updated Successfully.");
}
}
}
static void DeleteUser(int userId)
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand("DeleteUser", conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("p_UserId", OracleDbType.Int32).Value = userId;
cmd.ExecuteNonQuery();
Console.WriteLine("User Deleted Successfully.");
}
}
}
}
}
4. 코드 설명
위의 코드에서 각 프로시저를 호출하는 방법은 다음과 같습니다:
- CreateUser: 사용자 이름과 이메일을 매개변수로 받아 사용자를 생성합니다.
- ReadUser: 사용자의 ID를 매개변수로 받아 해당 사용자의 정보를 조회합니다.
- UpdateUser: 사용자 ID, 새로운 사용자 이름 및 이메일을 매개변수로 받아 사용자의 정보를 업데이트합니다.
- DeleteUser: 사용자 ID를 매개변수로 받아 해당 사용자를 삭제합니다.
5. 예외 처리와 최적화
C# 애플리케이션에서 데이터베이스 작업을 수행할 때는 예외 처리를 적절히 구현하는 것이 중요합니다. 예외 처리를 추가하여 데이터베이스 연결이 실패하거나, 프로시저 호출 시 오류가 발생하는 경우를 처리할 수 있습니다.
try
{
// DB operation
}
catch (OracleException ex)
{
Console.WriteLine($"Oracle Error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
6. 결론
C#과 오라클 프로시저를 이용한 CRUD 연산 구현에 대해 알아보았습니다. 강력한 데이터베이스 처리 기능을 가지고 있는 오라클과 객체지향 언어인 C#의 조합은 확장성과 유지보수성을 높이는 데 기여할 수 있습니다. 본 예제를 참고하여 더 복잡한 비즈니스 로직도 구현해 보시기 바랍니다.