포스트

ADO.NET과 구성 요소

ADO.NET은 Microsoft의 .NET Framework에서 데이터와 데이터 서비스에 접근할 수 있는 데이터 액세스 서비스를 제공하는 구성 요소 집합(클래스 라이브러리)입니다.

일반적으로 프로그래머들이 관계형 데이터베이스 시스템에 저장되어 있는 데이터에 접근하거나 수정할 때 사용합니다. (물론, 비관계형 데이터에 접근할 때도 사용할 수 있습니다.)

주요 구성 요소

Connection 객체

데이터베이스와의 연결을 관리하기 위해 사용되며, 데이터베이스 연결 문자열을 사용하여 데이터베이스에 연결합니다.

주로 Open()Close() 메서드를 사용하여 연결을 열고 닫습니다.

Open()에는 동기적으로 연결을 하는 Open()과 비동기적으로 연결을 수행하는 OpenAsync()가 있습니다.

Data ProviderNameSpaceMainClass
SQL ServerSystem.Data.SqlClientSqlConnection
OracleSystem.Data.OracleClientOracleConnection
OLEDBSystem.Data.OleDbOleDbConnection
ODBCSystem.Data.OdbcOdbcConnection

Command 객체

데이터베이스에 대해 SQL 명령문이나 저장 프로시저를 실행하기 위한 명령어 객체입니다.

즉, 데이터베이스 안의 데이터를 조회, 수정, 삭제, 삽입하기 위해 쓰이며, ExecuteReader(), ExecuteNonQuery(), ExecuteScalar() 등의 메서드 등을 사용하여 데이터를 읽거나 조작합니다.

Query를 실행 할 때에는 문자열을 +연산자로 연결하여 사용하는 것은 SQL Injection (SQL문을 해킹) 등의 문제를 발생시킬 수 있으므로 SqlParameter 클래스를 사용하는 것이 권장됩니다.

또한, OpenAsync()와 같이 비동기적으로 Query를 실행할 수 있는 ExecuteScalarAsync()와 같은 메서드도 존재합니다.

Data ProviderNameSpaceMainClass
SQL ServerSystem.Data.SqlClientSqlCommand
OracleSystem.Data.OracleClientOracleCommand
OLEDBSystem.Data.OleDbOleDbCommand
ODBCSystem.Data.OdbcOdbcCommand

DataReader 객체

데이터베이스 안의 데이터를 조회하기 위해 쓰이는 읽기 전용 리더 객체입니다.

데이터베이스에서 행 단위로 데이터를 읽어오며, 연결된 상태에서만, 한 번에 하나의 행씩 순차적으로 읽습니다.

매우 빠르고 메모리 효율적이지만, 연결이 열려 있어야 하므로 자원 관리에 주의해야 합니다.

Data ProviderNameSpaceMainClass
SQL ServerSystem.Data.SqlClientSqlDataReader
OracleSystem.Data.OracleClientOracleDataReader
OLEDBSystem.Data.OleDbOleDbDataReader
ODBCSystem.Data.OdbcOdbcDataReader

DataAdapter 객체

데이터베이스로부터 조회해온 데이터를 DataSet에 채우거나, DataSet에 변경된 데이터를 데이터베이스에 적용시키는데 쓰이는 객체입니다.

Fill() 메서드를 사용하여 DataSet을 채우고, Update() 메서드를 사용하여 데이터 소스에 변경 사항을 반영합니다.

Data ProviderNameSpaceMainClass
SQL ServerSystem.Data.SqlClientSqlDataAdapter
OracleSystem.Data.OracleClientOracleDataAdapter
OLEDBSystem.Data.OleDbOleDbDataAdapter
ODBCSystem.Data.OdbcOdbcDataAdapter

DataSet 객체

메모리 내의 데이터 캐시 역할을 하며, 여러 테이블과 관계를 관리할 수 있습니다.

쉽게 말해, 메모리 상에 존재하는 데이터베이스라고 할 수 있습니다.

메모리 상에 존재하기 때문에, 데이터 소스와의 연결을 필요로 하지 않으며, 연결이 끊어진 상태에서 데이터를 조작할 수 있습니다.

즉, DataSet을 사용하면 데이터베이스와의 연결이 끊긴 상태에서도 작업이 가능하기 때문에 서버의 부하를 줄일 수 있습니다.

DataSet 객체는 DataTable, DataRelation 등의 서브 컴포넌트를 포함합니다.

| Data Provider | NameSpace | MainClass | | — | — | — | | Memory | System.Data | DataSet DataTable DataRelation |

DataView 객체

DataTable의 특정 데이터를 필터링하거나 정렬할 수 있는 뷰를 제공합니다.

Data ProviderNameSpaceMainClass
MemorySystem.DataDataView

ADO.NET의 데이터 액세스 방법

1. 연결 기반 접근법

연결 기반 접근법은 데이터베이스와의 연결이 열려 있는 동안 데이터를 읽어오고 조작합니다. 실시간 데이터 액세스가 필요한 경우에 유용합니다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(queryString, connection);
    connection.Open();
    SqlDataReader reader = command.ExecuteReader();

    while (reader.Read())
    {
        Console.WriteLine(String.Format("{0}", reader[0]));
    }
    reader.Close();
}
  1. SqlConnection: 이 객체는 SQL Server 데이터베이스에 대한 연결을 나타냅니다. connectionString 매개변수는 데이터베이스 위치, 인증 정보 등을 포함하는 문자열입니다.
  2. SqlCommand: 이 객체는 SQL 쿼리나 명령을 나타냅니다. queryString 매개변수는 실행할 SQL 쿼리입니다. connection 객체를 통해 데이터베이스에 쿼리를 전달합니다.
  3. Open(): connection 객체의 메서드로 데이터베이스 연결을 엽니다.
  4. ExecuteReader(): command 객체의 메서드로 SQL 쿼리를 실행하고 결과를 SqlDataReader 객체로 반환합니다.
  5. SqlDataReader: 이 객체는 쿼리 결과를 읽어옵니다. Read() 메서드를 사용하여 각 행을 순차적으로 읽습니다.
  6. Close(): reader 객체의 메서드로 데이터 리더를 닫습니다. using 블록이 끝나면 connection 객체도 자동으로 닫힙니다.

2. 비연결 기반 접근법

비연결 기반 접근법은 데이터를 메모리에 로드한 후 데이터베이스 연결을 닫고, 메모리 내에서 데이터를 조작합니다. 연결 비용을 줄이고 데이터베이스에 대한 부하를 줄이는 데 유리합니다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
DataSet dataSet = new DataSet();
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
    connection.Open();
    adapter.Fill(dataSet);
}

// DataSet을 사용하여 데이터 조작
foreach (DataRow row in dataSet.Tables[0].Rows)
{
    Console.WriteLine(row["ColumnName"]);
}
  1. DataSet: 이 객체는 메모리 내에서 데이터를 저장하고 관리합니다. 여러 테이블과 관계를 포함할 수 있으며, 데이터베이스와의 연결이 필요 없습니다.
  2. SqlConnection: SQL Server 데이터베이스에 대한 연결을 나타냅니다. connectionString 매개변수는 데이터베이스 위치, 인증 정보 등을 포함하는 문자열입니다.
  3. SqlDataAdapter: 이 객체는 데이터베이스와 DataSet 간의 데이터 전송을 관리합니다. queryString 매개변수는 실행할 SQL 쿼리입니다.
  4. Open(): connection 객체의 메서드로 데이터베이스 연결을 엽니다. using 블록이 끝나면 connection 객체도 자동으로 닫힙니다.
  5. Fill(): adapter 객체의 메서드로 데이터베이스에서 데이터를 읽어와 DataSet을 채웁니다.
  6. DataRow: DataSet의 테이블에서 개별 행을 나타냅니다.

ADO.NET의 장점

  • 유연성: 여러 종류의 데이터 소스와 함께 사용할 수 있습니다.
  • 확장성: 대규모 데이터베이스 응용 프로그램을 지원합니다.
  • 성능: 데이터베이스와 직접 통신하는 효율적인 데이터 읽기 및 조작 기능을 제공합니다.
  • 보안: 보안 연결과 파라미터화된 쿼리를 사용하여 SQL 인젝션 등의 보안 위협을 방지할 수 있습니다.

참고

아키텍처 - ADO.NET | Microsoft Learn

Connection 객체의 Open()과 OpenAsync()

SQLParameter 클래스와 파라미터

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.