-
[ADO.NET] ADO.NET & Dapper 개념 및 차이Computer Science🖥️ 2025. 3. 16. 23:14
ADO.NET 과 Dapper 의 사용 이유
.NET을 사용하게 되면서, 자연스럽게 DB에 연결하는 것에 ADO.NET을 사용하였는데요.
ADO.NET은 .NET 프레임워크에서 사용하는 DB 액세스 라이브러리 입니다.제 경우, MSSQL(DB)를 사용하고 있는데, MSSQL에 쉽게 연결 및 쿼리문 실행을 제공하는 라이브러리가 ADO.NET 입니다.
최근 ADO.NET을 사용하다가 Dapper를 사용하면 연결 코드가 훨씬 깔끔하고 간단하다는 것을 보고 사용했기에 이를 정리하려 합니다!Dapper란 무엇이냐면, ADO.NET 기반으로 만들어진 데이터베이스 연결 라이브러리인데요.
ADO.NET의 Connection, Adpater, Command 등을 이용해 데이터 베이스와 연결했던 것과 달리 Dapper함수를 사용하여 더욱 편리하게 접근할 수 있다는 것입니다.그럼 Dapper를 체감하기 위해선 우선 ADO.NET 방식을 봐볼까요?? :)
ADO.NET
.NET 프레임워크에서 제공하는 모든 데이터에 쉽게 접근, 조작할 수 있는 개체.
데이터 접근에 필요한 인터페이스, 클래스를 포함하고 있다.- System.Data라는 네임스페이스 안에 있다.
- 다른 로컬 또는 원격에서 데이터에 대한 상호작용이 필요하거나, 메모리에서는 결과를 유지하고 전송해 데이터를 처리할 경우 DataSet이라는 메모리 집합을 사용할 수 있다.
ADO.NET 구성 요소
크게 2가지로 구분된다.
- DataSet
- 데이터 집합 - 실제 데이터베이스처럼, 여러 테이블을 담을 수 있는 데이터 타입이다.
- 실제 데이터 베이스와 차이점은 메모리상에만 저장된다는 것이다.
- DataSet을 이용한 방식이 왜 좋냐면? 데이터 베이스에서 수정작업을 할 때, 이전 같으면 작업을 하는 동안 계속 데이터베이스에 연결 상태에서 작업한다. 하지만 DataSet을 사용하면 아래와 같이 동작한다.
DB 연결 → DataSet 전송 → DB 연결 종료 → 받은 DataSet 에서 수정 작업 처리 → 다시 DB 연결 → 변경된 DataSet 을 DB에 적용 → DB 연결 종료 // 위와 같이 하면, 데이터베이스와의 연결이 끊긴 상태에서도 작업이 가능하기 때문에 서버의 부하를 줄일 수 있다.
- .NET 공급자
- 데이터 베이스에 연결, 조작, 데이터를 가져오기 위한 개체들을 제공하는 역할
- 이 공급자의 구성 요소로는 크게 4가지가 있다.
Connection, Command, DataReader, DataAdapter
구성요소 설명 Connection 데이터베이스 또는 데이터 원본에 연결하기 위해 쓰인다. Command 데이터베이스 안의 데이터를 조회, 수정, 삭제, 삽입하기 위해 쓰인다. (명령 입력하는 객체) DataReader 데이터베이스 안의 데이터를 조회하기 위해 쓰인다.읽기 전용이며 또한 앞으로만 읽어나갈 수 있다.
Command 보다 빠른 속도를 제공한다.DataAdapter 데이터베이스로부터 조회해온 데이터를 DataSet에 채우거나,DataSet에 변경된 데이터를 데이터베이스에 적용시키는데 쓰인다. (값을 가져오는 장치) ADO.NET 사용 예시
MSSQL 로컬에 연결하는 코드입니다 :)
ADO.NET - SELECT
public string SetDBConnString(string DbName) { string strSource = "localhost"; // 주소 string strDbName = DbName; string strId = "설정한 ID"; string strPwd = "설정한 비밀번호"; string strConn = string.Format($" Data Source={strSource};Initial Catalog={strDbName};Persist Security Info=false;Integrated Security=false;User ID={strId};Password={strPwd};enlist=true;TrustServerCertificate=True;"); return strConn; } private DataSet selectData() { string strConn = SetDBConnString("EDU001"); DataSet ds = new DataSet(); using (SqlConnection conn = new(strConn)) { // 터널 - connection, 버스 - adapter, 조종사 - command 느낌 DataTable dt = new DataTable(); StringBuilder sb = new StringBuilder(); // 쿼리문을 담을 stringbuilder sb.AppendLine("SELECT TOP 10"); sb.AppendLine(" Deptno"); sb.AppendLine(" ,Dname"); sb.AppendLine(" ,Loc"); sb.AppendLine("FROM Dept;"); // 어뎁터 - 쿼리문, 연결 문자열로 생성 SqlDataAdapter adt = new(sb.ToString(), conn); try { // 실제 쿼리문으로 데이터를 가져오는 부분만 데이터베이스 연결 - 해제 // 빠르게 연결, 해제 하기 때문에 쓸데없이 데이터베이스를 잡고있는 시간을 줄여준다. conn.Open(); adt.Fill(ds); // 어뎁터로 가져온 테이블 여러개를 DataSet에 넣어주는 작업 conn.Close(); } catch { conn.Close(); } } return ds }
Dapper
Dapper는 ADO.NET의 성능을 유지하면서 간결한 코드 작성을 도와주는 마이크로 ORM(Object-Relational Mapping)
- 여러 함수들이 있지만, 대체로 아래와 같이 사용하는 것 같다.
- SELECT - Query, QueryMultiple, QueryFirstOrDefault, ExcuteReader
- INSERT, UPDATE, DELETE - Execute
위에서 ADO.NET으로 SELECT문을 보여서 Dapper로도 SELECT 문을 예시로 들자면 아래와 같다.
public List<User> selectUserList(Employee employee) { List<User> result; // User 데이터형 미리 선언 var sql = "SELECT * FROM Users WHERE Age > @Age"; // 쿼리문 작성 using (var connection = new SqlConnection(strconn)) { var users = connection.Query<User>(sql, new { Age = 20 }).ToList(); } return result; }
정리
- ADO.NET, Dapper 둘다 .NET 프레임워크에서 데이터베이스를 연결하기 위한 편리함을 위해 만들어진 데이터베이스 액세스 라이브러리이다.
- 하지만 Dapper는 ADO.NET을 기반으로 만들어져, Command, Adpater를 만들지 않고도 안에 포함된 함수로 간단히 쿼리문을 실행시키고 데이터를 얻는다.
- 단점으로 꼽자면, SQL 문이 문자열로 이루어져있어, ADO.NET, Dapper 둘다 컴파일 단계에서 이것의 오류를 찾기가 어렵다. 런타임에서만 오류를 알 수 있으므로, 반드시 데이터베이스 반환값과 함께 오류 처리를 잘 해줘야한다.
시간이 없어 많이 작성하지 못했지만, 데이터베이스의 연결 시 런타임 에러가 발생했을 때 트랜잭션을 잡아두는 경우가 있다.
이를 대비하기 위해 Transaction을 한번 더 감싸서 에러가 났을 경우, Rollback, Complete 등으로 끊어주는 습관을 가져보자.
이미 database, 프레임워크에서 연결을 잘 끊어준다고는 되어있다고 하지만, 에러가 발생했을 때, 데이터베이스 쿼리문 실행이 느려지는 것을 몇번 경험했기에…. 잘 관리해준다고 나쁠 것은 없는 것 같다. :)'Computer Science🖥️' 카테고리의 다른 글
[MSSQL] Recursive CTE & 조직도 (0) 2025.03.02 RESTful API란 무엇인가? (1) 2024.11.15 [JAVAProgramming] 다형성(Polymorphism) (0) 2021.10.09