즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2022.09] Dapper 클래스 고도화

다물칸 2022. 9. 22. 11:43
728x90
반응형

안녕하세요. 오늘은 기존에 올렸던 블로그의 클래스를 고도화해서 다시 올려봅니다. 

 

 

[2021.03] SqLite + Dapper(ORM) 사용방법

환경: Visual Studio 2017, C#, 닷넷 4.6.1 검색능력이 떨어진 건지 제대로 된 게시물이 없는 건지 국/내외 게시물을 다 뒤져도 안나와서 짜집기 + 자작으로 작성해보았다. Node.js에서 Squelize로 작년까지

endev.tistory.com

고도화 주제는 다음과 같습니다. 

 

1. 인터페이스를 통해 클래스를 사용하는 위치에서 외부 참조를 사용하지 않게 한다. 

2. 불특정 객체를 반환할 수 있도록 한다. 

 

외부참조 사용하지 않게하기

IDBConnection은 범용적으로 모든 DB에서 인터페이스로 사용할 수 있습니다. 다만 DB별로 Connection String이 다르기 때문에 아래처럼 번잡하죠. 하지만 사용하는 곳에서 쉽게 사용할 수 있습니다. 

public  IDbConnection SimpleDBConnection()
{
    try
    {
        if (!CheckValidationDB()) return null;
        if (this.DBCfg.DBType == (int)DB_TYPE.SQLite)
        {
            if (conn != null)
                return conn;
            // Connection String 반환
            var connStr = new SQLiteConnectionStringBuilder(string.Format(@"Data Source={0};Version=3", DBCfg.DBFile))
            {
                JournalMode = SQLiteJournalModeEnum.Wal
            }.ToString();
            conn = new SQLiteConnection(connStr);
            //ExecuteQuery("PRAGMA cache_size=10000;"); // 이거 하면 왜 죽냐?
            return conn;
        }
        else if (DBCfg.DBType == (int)DB_TYPE.PostgreSQL)
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                return conn;
            }
            else
            {
                string connStr = string.Format("User ID={0};Password={1};Host={2};Port={3};Database={4};", 
                    DBCfg.UserID, DBCfg.UserPw, DBCfg.DBHost, DBCfg.DBPort, DBCfg.DBName);
                conn = new NpgsqlConnection(connStr);
                if (conn != null)
                {
                    conn.Open();
                }
                return conn;
            }
        }
        else if (DBCfg.DBType == (int)DB_TYPE.MySQL)
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                return conn;
            }
            else
            {
                string connStr = string.Format("Server={0};Port={1};Database={2};Uid={3};Pwd={4}", 
                    DBCfg.DBHost, DBCfg.DBPort, DBCfg.DBName, DBCfg.UserID, DBCfg.UserPw);
                conn = new MySqlConnection(connStr);
                if (conn != null)
                {
                    conn.Open();
                }
                return conn;
            }
        }
        else if (DBCfg.DBType == (int)DB_TYPE.MSSQL)
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                return conn;
            }
            else
            {
                string connStr = string.Format("Persist Security Info=True;Data Source={0},{1};Initial Catalog={2};User ID={3};Password={4};Network Library=DBMSSOCN;",
                    DBCfg.DBHost, DBCfg.DBPort, DBCfg.DBName, DBCfg.UserID, DBCfg.UserPw);
                conn = new SqlConnection(connStr);
                if (conn != null)
                {
                    conn.Open();
                }
                return conn;
            }
        }
        else
        {
            return null;
        }

    }
    catch (Exception ex)
    {
        logger?.Error("== SimpleDBConnection() ==");
        logger?.Error(ex);
        return null;
    }
}

 

불특정 객체 반환할 수 있게 하기

// 단일 레코드 조회
public T GetItemQuery<T>(IDbConnection cnn, string Qry)
{
    return SqlMapper.Query(cnn, Qry).FirstOrDefault();
}

// 다중 레코드 조회
public IEnumerable<T> GetMultipleQuery<T>(IDbConnection cnn, string Qry)
{
    SqlMapper.GridReader gr = SqlMapper.QueryMultiple(cnn, Qry);
    return gr.Read<T>();
}

T객체를 사용해 클래스 형태로 데이터를 받아올 수 있습니다. 

 

전체 클래스는 너무 많아서 올리지는 않을 예정이고, 위 두개의 샘플만으로 많이 응용을 할 수 있을 거라고 생각됩니다. 

그럼 이만!!

반응형