ADO.NET과 구성 요소
ADO.NET은 Microsoft의 .NET Framework에서 데이터와 데이터 서비스에 접근할 수 있는 데이터 액세스 서비스를 제공하는 구성 요소 집합(클래스 라이브러리)입니다.
일반적으로 프로그래머들이 관계형 데이터베이스 시스템에 저장되어 있는 데이터에 접근하거나 수정할 때 사용합니다. (물론, 비관계형 데이터에 접근할 때도 사용할 수 있습니다.)
주요 구성 요소
Connection 객체
데이터베이스와의 연결을 관리하기 위해 사용되며, 데이터베이스 연결 문자열을 사용하여 데이터베이스에 연결합니다.
주로 Open()
과 Close()
메서드를 사용하여 연결을 열고 닫습니다.
Open()에는 동기적으로 연결을 하는 Open()
과 비동기적으로 연결을 수행하는 OpenAsync()
가 있습니다.
Data Provider | NameSpace | MainClass |
---|---|---|
SQL Server | System.Data.SqlClient | SqlConnection |
Oracle | System.Data.OracleClient | OracleConnection |
OLEDB | System.Data.OleDb | OleDbConnection |
ODBC | System.Data.Odbc | OdbcConnection |
Command 객체
데이터베이스에 대해 SQL 명령문이나 저장 프로시저를 실행하기 위한 명령어 객체입니다.
즉, 데이터베이스 안의 데이터를 조회, 수정, 삭제, 삽입하기 위해 쓰이며, ExecuteReader()
, ExecuteNonQuery()
, ExecuteScalar()
등의 메서드 등을 사용하여 데이터를 읽거나 조작합니다.
Query를 실행 할 때에는 문자열을 +
연산자로 연결하여 사용하는 것은 SQL Injection (SQL문을 해킹) 등의 문제를 발생시킬 수 있으므로 SqlParameter
클래스를 사용하는 것이 권장됩니다.
또한, OpenAsync()
와 같이 비동기적으로 Query를 실행할 수 있는 ExecuteScalarAsync()
와 같은 메서드도 존재합니다.
Data Provider | NameSpace | MainClass |
---|---|---|
SQL Server | System.Data.SqlClient | SqlCommand |
Oracle | System.Data.OracleClient | OracleCommand |
OLEDB | System.Data.OleDb | OleDbCommand |
ODBC | System.Data.Odbc | OdbcCommand |
DataReader 객체
데이터베이스 안의 데이터를 조회하기 위해 쓰이는 읽기 전용 리더 객체입니다.
데이터베이스에서 행 단위로 데이터를 읽어오며, 연결된 상태에서만, 한 번에 하나의 행씩 순차적으로 읽습니다.
매우 빠르고 메모리 효율적이지만, 연결이 열려 있어야 하므로 자원 관리에 주의해야 합니다.
Data Provider | NameSpace | MainClass |
---|---|---|
SQL Server | System.Data.SqlClient | SqlDataReader |
Oracle | System.Data.OracleClient | OracleDataReader |
OLEDB | System.Data.OleDb | OleDbDataReader |
ODBC | System.Data.Odbc | OdbcDataReader |
DataAdapter 객체
데이터베이스로부터 조회해온 데이터를 DataSet에 채우거나, DataSet에 변경된 데이터를 데이터베이스에 적용시키는데 쓰이는 객체입니다.
Fill()
메서드를 사용하여 DataSet을 채우고, Update()
메서드를 사용하여 데이터 소스에 변경 사항을 반영합니다.
Data Provider | NameSpace | MainClass |
---|---|---|
SQL Server | System.Data.SqlClient | SqlDataAdapter |
Oracle | System.Data.OracleClient | OracleDataAdapter |
OLEDB | System.Data.OleDb | OleDbDataAdapter |
ODBC | System.Data.Odbc | OdbcDataAdapter |
DataSet 객체
메모리 내의 데이터 캐시 역할을 하며, 여러 테이블과 관계를 관리할 수 있습니다.
쉽게 말해, 메모리 상에 존재하는 데이터베이스라고 할 수 있습니다.
메모리 상에 존재하기 때문에, 데이터 소스와의 연결을 필요로 하지 않으며, 연결이 끊어진 상태에서 데이터를 조작할 수 있습니다.
즉, DataSet을 사용하면 데이터베이스와의 연결이 끊긴 상태에서도 작업이 가능하기 때문에 서버의 부하를 줄일 수 있습니다.
DataSet 객체는 DataTable
, DataRelation
등의 서브 컴포넌트를 포함합니다.
| Data Provider | NameSpace | MainClass | | — | — | — | | Memory | System.Data | DataSet DataTable DataRelation |
DataView 객체
DataTable
의 특정 데이터를 필터링하거나 정렬할 수 있는 뷰를 제공합니다.
Data Provider | NameSpace | MainClass |
---|---|---|
Memory | System.Data | DataView |
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();
}
- SqlConnection: 이 객체는 SQL Server 데이터베이스에 대한 연결을 나타냅니다.
connectionString
매개변수는 데이터베이스 위치, 인증 정보 등을 포함하는 문자열입니다. - SqlCommand: 이 객체는 SQL 쿼리나 명령을 나타냅니다.
queryString
매개변수는 실행할 SQL 쿼리입니다.connection
객체를 통해 데이터베이스에 쿼리를 전달합니다. - Open():
connection
객체의 메서드로 데이터베이스 연결을 엽니다. - ExecuteReader():
command
객체의 메서드로 SQL 쿼리를 실행하고 결과를SqlDataReader
객체로 반환합니다. - SqlDataReader: 이 객체는 쿼리 결과를 읽어옵니다.
Read()
메서드를 사용하여 각 행을 순차적으로 읽습니다. - 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"]);
}
- DataSet: 이 객체는 메모리 내에서 데이터를 저장하고 관리합니다. 여러 테이블과 관계를 포함할 수 있으며, 데이터베이스와의 연결이 필요 없습니다.
- SqlConnection: SQL Server 데이터베이스에 대한 연결을 나타냅니다.
connectionString
매개변수는 데이터베이스 위치, 인증 정보 등을 포함하는 문자열입니다. - SqlDataAdapter: 이 객체는 데이터베이스와
DataSet
간의 데이터 전송을 관리합니다.queryString
매개변수는 실행할 SQL 쿼리입니다. - Open():
connection
객체의 메서드로 데이터베이스 연결을 엽니다.using
블록이 끝나면connection
객체도 자동으로 닫힙니다. - Fill():
adapter
객체의 메서드로 데이터베이스에서 데이터를 읽어와DataSet
을 채웁니다. - DataRow:
DataSet
의 테이블에서 개별 행을 나타냅니다.
ADO.NET의 장점
- 유연성: 여러 종류의 데이터 소스와 함께 사용할 수 있습니다.
- 확장성: 대규모 데이터베이스 응용 프로그램을 지원합니다.
- 성능: 데이터베이스와 직접 통신하는 효율적인 데이터 읽기 및 조작 기능을 제공합니다.
- 보안: 보안 연결과 파라미터화된 쿼리를 사용하여 SQL 인젝션 등의 보안 위협을 방지할 수 있습니다.
참고
아키텍처 - ADO.NET | Microsoft Learn