본문 바로가기
인생은 실전/C#

[LinqToDB] LinqToDB - ② : LINQ 데이터베이스 액세스 라이브러리를 사용해 DB에 연결하기

by 나는영하 2023. 2. 3.

 LINQ 데이터베이스 액세스 라이브러리를 사용해 DB연결

 

지난 시간에 T4 텍스트 템플릿을 사용해서 DB에 있는 스키마 들을 C# 클래스 형태로 생성해보았습니다.

2023.01.26 - [인생은 실전/C#] - [LinqToDB] LinqToDB - ① : T4 텍스트 템플릿을 사용해서 C# POCO 개체 생성하기

 

[LinqToDB] LinqToDB - ① : T4 텍스트 템플릿을 사용해서 C# POCO 개체 생성하기

T4 텍스트 템플릿(Text Template)을 사용해서 C# POCO 개체 생성 T4??? POCO 개체?? 다소 생소한 용어가 많습니다. 🟢 T4 : Text Template Transformation Toolkit의준말 (코드를 생성해주는 도구) 🟢 POCO : Plain Old CLR Ob

920416.tistory.com

오늘은 LINQ 데이터베이스 액세스 라이브러리(LinqToDB)를 사용해서 데이터베이스에 아주 간단히 연결하는 과정을 알아보도록 하겠습니다.

 

 1. LinqToDB 사전 구성

1️⃣ app.config에 데이터베이스 연결 문자열 입력 

<configuration>
	<connectionStrings>
		<add name="DOMAIN" connectionString="Data Source=localhost;Initial Catalog=AdventureWorks2019;User ID=sa;Password=1" providerName="System.Data.SqlClient" />
	</connectionStrings>
</configuration>

위와 같이 app.config에 <connectionStrings> 태그 아래 데이터베이스 연결 문자열을 입력해 줍니다.


2️⃣ DBSetting.cs 클래스 생성 및 구성

 ① 지시문(using)
LinqToDB의 Configuration과 Data 네임스페이스를 외부 참조한다.

using LinqToDB.Configuration;
using LinqToDB.Data;

 ② DBSetting.cs 전문

namespace LinqToDB.Database
{
    public class DBSetting
    {
        public DBSetting(string connectionString)
        {
            DataConnection.DefaultSettings = new MySettings(connectionString);

        }
        public class ConnectionStringSettings : IConnectionStringSettings
        {
            public string ConnectionString { get; set; }
            public string Name { get; set; }
            public string ProviderName { get; set; }
            public bool IsGlobal => false;
        }

        public class MySettings : ILinqToDBSettings
        {
            private string connectionString;

            public MySettings(string connectionString)
            {
                this.connectionString = connectionString;
            }

            public IEnumerable<IDataProviderSettings> DataProviders
                => Enumerable.Empty<IDataProviderSettings>();

            public string DefaultConfiguration => "System.Data.SqlClient";
            public string DefaultDataProvider => "System.Data.SqlClient";

            public IEnumerable<IConnectionStringSettings> ConnectionStrings
            {
                get
                {
                    yield return
                        new ConnectionStringSettings
                        {
                            Name = "AdventureWorks2019",
                            ProviderName = "System.Data.SqlClient",
                            ConnectionString =
                                connectionString
                        };
                }
            }
        }
    }
}

DBSetting의 생성자를 통해 해당 객체를 새로 만들때 인자로 데이터베이스 연결 문자열을 지정합니다.

(프로젝트의 시작지점에서 일반적으로 DBSetting 객체를 생성해서 데이터베이스의 연결 문자열을 Default값으로 지정해줍니다.)

 

③ DBSetting의 내부 클래스중에 첫번째인 ConnectionStringSettings

해당 클래스는 IConnectionStringSettings 인터페이스를 상속받아서 DB연결에 사용되는 문자열 관련 인자들을 프로퍼티 형태로 만들어 둡니다. 해당 인터페이스를 상속받으면 VisualStudio의 intellisense기능을 사용해 쉽게 프로퍼티 형태로 만들 수 있습니다.(단축키 : Ctrl + . )

 

④ DBSetting의 내부 클래스중에 두번째인 MySettings

해당 클래스는 ILinqToDBSettings 인터페이스를 상속받습니다. 해당 인터페이스를 상속받으면 내부 멤버들이 만들어 지는데 여기서 public IEnumerable<IConnectionStringSettings> ConnectionStrings만 사용합니다. (나머지 3개의 멤버들에 대해선 사용하지 않는다고 코드조차 안만들어두면 인터페이스 멤버 구현 오류로 실행이 안되니 위와 동일하게 코드 작성은 해둡시다 👍😁)

 

추후 DB에 연결할때 위 ConnectionStrings 메서드에 접근해서 ConnectionString 프로퍼티를 Get해서 사용하게 됩니다. 중단점을 이용해 디버그를 해보면 db에 접근할때마다 본 메서드가 호출되는 것을 알 수 있습니다. 

 

 

 2. LinqToDB를 사용해 DB 연결

1️⃣ 데이터베이스 연결

   public MainWindow()
        {
            InitializeComponent();
            var connectionString = ConfigurationManager.ConnectionStrings["DOMAIN"].ConnectionString;
            DBSetting dBSetting = new DBSetting(connectionString);
            this.Loaded +=MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            using (var db = new AdventureWorks2019DB())
            {
                db.AddressTypes.ToList();
            } 
        }

해당 Form(여기서는 WPF이기 때문에 window)이 로드되기 전에 app.config에 있는 "DOMAIN"이란 이름의 ConnectionString을 불러와서 DBSetting 생성자의 인자값으로 전달합니다.

 

데이터베이스에 연결하는 방법은 간단합니다.

using(var db = new AdventureWorks2019DB())를 사용하면 해당 DB에 접근하게 됩니다.

using문을 사용함으로써 DB 리소스에 액세스하고 다시 자동으로 해당 리소스를 반납시켜줌으로써 리소스 관리를 쉽게 도와줍니다.(db나 file 등에 접근할때 using문을 사용하는것을 생활화 합시다!!😁)

 

AdventureWorks2019DB()는 지난시간에 T4 템플릿으로 만든 C# POCO개체의 CLASS의 생성자입니다. 

위의 사진과 같이 MSSQL에 있는 Person.AddressType 테이블과 POCO 개체의 AddressType과 데이터가 동일함을 알 수있습니다.(POCO 개체는 DB에 있는 스키마의 정보만을 저장하고 이를 통해 특정 스키마에 접근하는것 같아 보입니다.🤔)

 

 

이제부턴 본격적으로 LINQ에 대해서 파헤쳐보겠습니다!! 

댓글