ADO.NET : .NET에서 데이터베이스(DB)에 접근하기 위한 기술
ADO.NET 내부 계층 관계도
┌─────────────────────────────────────┐ │ Application Layer │ ├─────────────────────────────────────┤ │ ORM (Dapper, EF Core) - Optional│ ├─────────────────────────────────────┤ │ ADO.NET Core │ │ ┌──────────────┬─────────────────┐ │ │ │ Connected │ Disconnected│ │ │ │ │ │ │ │ │ Connection │ DataAdapter│ │ │ │ Command │ ↕ │ │ │ │ DataReader │ DataSet │ │ │ │ Transaction │ DataTable │ │ │ └──────────────┴─────────────────┘ │ ├─────────────────────────────────────┤ │ Provider (SqlClient 등) │ ├─────────────────────────────────────┤ │ Database │ └─────────────────────────────────────┘
개념 구조도 설명
5층: 애플리케이션 (우리가 만드는 C# 코드) ↕ 4층: ORM (Dapper, EF Core) - 선택사항 ↕ 3층: ADO.NET (Connection, Command, DataSet 등) ↕ 2층: Provider (SqlClient, MySqlClient 등) ↕ 1층: 실제 데이터베이스 (SQL Server, MySQL 등)
각 층은 자기 역할만 하고 아래층한테 일을 시키는 구조
1층 - Database: 실제 데이터가 저장된 곳
2층 - Provider: "통역사" 역할
SqlClient = SQL Server와 대화하는 통역사
MySqlClient = MySQL과 대화하는 통역사
DB마다 다른 언어(프로토콜)를 쓰니까 각각 통역사가 필요
3층 - ADO.NET: "도구 상자"
Connection = DB 문 여는 도구
Command = 명령 전달하는 도구
DataReader = 데이터 읽는 도구
DataSet = 데이터 담는 그릇
4층 - ORM: "자동화 비서" (선택 사항)
5층 - 우리 코드: 실제 우리가 작성하는 부분
DAC (Data Access Component) : DB에 접근하기 위한 구성요소들의 묶음
ADO.NET 안에서 실제로 DB와 통신하는 역할로 .NET에서 DB에 접근하는 기술
ADO.NET 안에 DAC들이 포함되어 있다
EX) Connection, Command, DataReader, DataAdapter
MS 계열 정리
[ ODBC ] ↓ [ OLE DB (COM 기반) ] ↓ [ ADO (Classic) ] ↓ [ ADO.NET ] ↓ [ NATIVE Provider ] ├─ SqlClient (SQL Server) ├─ Oracle Provider └─ MySQL Provider
ODBC(Open Database Connectivity) : 프로그램이 특정 DB 종류에 상관없이 데이터에 접근할 수 있도록 해주는 표준 인터페이스
특징
가장 오래된 공통 DB 연결 규격
DB마다 드라이버만 바꿔서 사용 가능
성능이 느리고 구조가 복잡함
“범용이지만 오래되고 느림”
OLE DB(Object Linking and Embedding Component Object Model) : 관계형 DB뿐 아니라 다양한 데이터 소스에 접근하기 위한 인터페이스
특징
MS가 ODBC 단점 보완하려고 만든 기술
COM(Component Object Model) : 마이크로소프트가 만든 “언어·프로그램이 달라도 재사용 가능한 컴포넌트 규칙”
DB뿐 아니라 다양한 데이터 소스 접근 가능
“ODBC 개선판, 하지만 COM이라 무거움”
ADO(ActiveX Data Objects) : OLE DB를 편하게 쓰기 위해 만든 고수준 데이터 접근 API
특징
OLE DB 위에서 동작
COM 기반의 라이브러리
VB, ASP에서 많이 사용
.NET 이전 시대 기술
“OLE DB를 편하게 쓰는 껍데기”
ADO.NET : .NET 환경에서 데이터베이스와 애플리케이션을 연결하기 위한 Microsoft의 표준 데이터 접근 기술
특징
.NET 전용 데이터 접근 기술
비연결(Disconnected) 구조 지원
성능과 확장성 개선
“.NET 시대의 표준 DB 접근 방식”
| 항목 | ADO | ADO.NET |
|---|---|---|
| 기반 | COM | .NET |
| 연결 방식 | 연결 유지 | 비연결 지원 |
| 성능/확장성 | 낮음 | 높음 |
| 현재 사용 | 레거시 | ✅ 표준 |
NATIVE Provider : 특정 데이터 베이스를 위해 DB 벤더가 직접 제공한 전용 데이터 접근 드라이버/ 프로바이더
특징
DB 제조사가 직접 만든 전용 드라이버
가장 빠르고 안정적
ADO.NET에서 주로 사용
“현재 주력, 가장 효율적”

Connected / Disconnected 구조
ADO.NET은 두 가지 방식 제공
Connected : DB 연결 = 계속 유지
대용량 데이터, 빠른 스트리밍 조회, 로그 처리 ,대량 데이터 출력 ,실시간 처리
사용자가 많아질수록 → 커넥션 부족, 성능 저하, 서버 과부하
Disconnected : DB는 짧게 연결하고 → 나머지는 메모리에서 처리하자
Connected 방법의 문제를 해결 하기 위한 방법
장점 : DB 연결 시간 최소화, 동시 사용자 증가 가능, 웹 환경에 최적
Connected, Disconnected 2가지 방법 다 사용
ADO.NET은 3rd Party를 추가하여 확장 할 수 있다
SqlConnection
DB와의 연결을 관리하는 객체
Connection String을 통해 DB 접속
“DB 문을 열고 닫는 역할”
SqlCommand
SQL 문 또는 Stored Procedure 실행하는 객체
SqlConnection 위에서 동작
“DB에 명령을 전달”
SqlTransaction
트랜잭션 처리하는 객체
Commit / Rollback 제공
“여러 작업을 하나의 단위로 처리”
DataSet 계층 구조
DataSet └─ DataTable └─ DataRow └─ DataColumn
DataSet
메모리 상의 DB 전체 구조를 담는 상위 객체
여러 DataTable을 포함
DB 연결을 끊고 메모리에서 작업
DataTable
테이블 하나를 메모리에 표현하는 객체
하나의 테이블 구조
행과 열로 구성
DataRow / DataColumn
DataRow : 한 행(레코드)
DataColumn : 컬럼 정의
“조회 결과를 메모리에 적재하여 처리”
| 구분 | 방식 |
|---|---|
| 빠른 조회 | ExecuteReader |
| 단일 값 | ExecuteScalar |
| 데이터 수정 | ExecuteNonQuery |
| 메모리 작업 | DataSet / DataTable |
Execute 메서드 = SqlCommand가 SQL을 실제로 실행하는 방법
SqlCommand : SQL + 실행 환경을 담는 객체
DB에 명령을 보내고 실행
실행 결과를 어떤 형태로 받을지를 결정
ExecuteNonQuery
INSERT / UPDATE / DELETE
반환값: 영향 받은 행 수
“결과가 없는 SQL 실행”
ExecuteScalar
단일 값 조회
예: COUNT(*), MAX(), SUM()
“첫 행 첫 컬럼만 반환”
ExecuteReader
순방향(Read-Only) 조회
DataReader 사용
빠르고 메모리 효율적
“처음부터 끝까지 한 줄씩 읽기”
ORM (Object-Relational Mapping) = 객체와 관계형 DB 테이블을 자동으로 매핑해주는 기술
DB 테이블 ↔ 객체(Class) 자동 매핑
SQL 중심 → 객체 중심 개발
생산성 향상
“DB를 객체처럼 다룸”
Dapper : .NET에서 사용하는 경량 ORM
ADO.NET 기반 마이크로 ORM
SQL 직접 작성 + 객체 매핑
SQL 작성 필요 → SQL 제어 가능
빠르고 가벼움
완전한 ORM 아님, 단순 매핑 중심
“실무에서 많이 쓰는 가벼운 ORM”