VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #3/3

2024. 2. 15. 11:08VB.NET/MS-SQL

EFCoreExam.zip
0.01MB

 

이번 시간에는 지난 시간에 이어서 EntityFrameworkCore을 사용해서 DB의 내용을 가져오고, DB에 내용을 저장하는 기능을 구현해 보도록 하자.

 

2024.02.12 - [VB.NET/MS-SQL] - VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #1/3

 

VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #1/3

항상 ADO를 사용하는게 익숙했는데, 아무래도 MAUI와 같은 멀티플랫폼에서의 호환성을 위해 ADO는 점점 사라지는 추세인듯 하다. 그래서, 다른 대안을 찾다보니 EntityFrameworkCore가 있더라. 이건 하위

chakhani.tistory.com

2024.02.14 - [VB.NET/MS-SQL] - VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #2/3

 

VB.NET 쿼리 없이 DB 사용하기 (EntityFrameworkCore) #2/3

이번 시간에는 지난번에 언급했던 작업 순서에 따라 차근차근 아주 상세하게 EntityFrameworkCore을 이용해서 MS-SQL을 사용하는 방법에 대해 알아보도록 하자. 1. 프로젝트 생성 VS2022 Community로 새 프로

chakhani.tistory.com

6. DB를 사용하기 위한 클래스 생성

  •  ClassDB 라는 클래스를 생성해서 DB를 사용한다.
  •  SelectUserInfo : 쿼리문의 Select 기능을 대체하는 함수
  •  InsertUserInfo : 쿼리문의 Insert 기능을 대체하는 함수
Friend Class DBClass

    Friend Shared Function SelectUserInfo(pDBInfo As DB_INFO, pUserID As String) As USER_INFO

        Dim lpItem As New USER_INFO With {.User_id = ""}

        Using dbItem As New DBConn(pDBInfo)
            ' User_Info 테이블에서 데이터 조회
            'Dim users = dbItem.User_test.OrderByDescending(Function(u) u.User_score).ToList()    ' 정렬
            Dim users = dbItehttp://m.User_info.Where(Function(u) u.User_id = pUserID).ToList()          ' 조건
            If users.Count > 0 Then lpItem = users(0)
        End Using

        Return lpItem

    End Function

    Friend Shared Function InsertUserInfo(pDBInfo As DB_INFO, pUserInfo As USER_INFO) As Integer

        Dim lpCnt As Integer = 0
        Using dbItem As New DBConn(pDBInfo)
            dbItem.Add(pUserInfo)
            lpCnt = dbItem.SaveChanges()
        End Using

        Return lpCnt

    End Function

End Class

 

자... 이제 이번 강좌의 가장 핵심이 나왔다. 첫번째 강좌에서도 잠깐 언급했지만, DB를 사용하는 가장 중요한 목적은 빠르게 데이터를 읽고 쓰는데 있다. 기존에는 DB의 데이터를 읽을때 Select 구문을 사용했고, DB에 데이터를 쓸때는 Insert 구문을 사용했다.

 

하지만, EntityFrameworkCore을 사용하게 되면 Select 구문도 안쓰고, Insert 구문도 안쓴다. 그러니 이들 구문을 대체할 다른 방법이 필요한 것이고, 위 소스에 이 방법이 들어있으니 하나씩 차근차근 살펴보자.

(1) SelectUserInfo 함수

예전 ADO 방식으로 DB를 사용할때는 명시적으로 Open문과 Close문을 사용해서 열고 닫아줘야 했는데, EntityFrameworkCore를 사용한 방식에서는 Using문을 사용해서 열고, 끝나면 자동으로 닫히게 된다. 여기서 User_info는 일종의 컴포넌트 역할을 수행하게 되는데 ADO의 RecordSet을 대체한다고 생각하면 될 듯 하다.

Dim users = dbItem.User_test.OrderByDescending(Function(u) u.User_score).ToList()
  • 정렬 (Order By) : Select문의 가장 기본기능인 정렬을 구현했다. DBConn 클래스에 정의한 User_info 변수를 이용해서 데이터를 정렬하게 된다.
  • OrderBy, OrderByDescending : 각각 Order By ASC, Order By Desc를 대체한다.
  • Function(u) u.User_score : 람다 형식으로 함수를 선언해서 user_score를 기준으로 정렬하게 된다. 이 구문은 쿼리문으로 Order By user_score Desc를 대체한다.
Dim users = dbItehttp://m.User_info.Where(Function(u) u.User_id = pUserID).ToList()
  • 조건 (Where) : Select문에서 조건문을 표헌한다.
  • Function(u) u.User_id = pUserID : 역시 람다 형식의 함수를 이용해서 user_id를 기준으로 검색하게 된다. 이 구문은 쿼리문으로 Where user_id = 'pUserID'를 대체한다.

이처럼 쿼리문의 Where절과 Order By절을 숨겨놓고 함수로 사용하니 실제 코딩할때 쿼리문을 작성할 필요가 없는 것이다. 물론 Join문과 같은 복합적인 기능도 제공하지만, 이번 강좌에서는 이정도 수준의 설명만 진행하도록 하겠다.

(2) InsertUserInfo 함수

여기서도 Using문을 사용해서 DB에 접근한다. DB에 내용을 추가하고 SaveChanges 함수로 최종 저장하면 데이터가 Commit 되는 구조이다.

7. 메인 폼에서 DB의 내용을 읽고 쓰기

   - 메인 폼에 아래 그림처럼 컨트롤을 추가하자.

EntityFrameworkCore 예제

컨트롤 이름 텍스트
From FormMain EntityFrameworkCore 예제
Button ButtonSelect &Select
Button ButtonInsert &Insert
Label Label1 ID :
Label Label2 Name :
Label Label3 Score :
TextBox TextBoxID  
TextBox TextBoxName  
TextBox TextBoxScore  
ListBox ListBoxLog  

(1) DB 정보 선언

Private DBInfo As New DB_INFO With {.Server = "CABBIKHAN\SQLEXPRESS", .DBName = "ECCoreExam", .UserID = "eccoreexam", .Password = "eccoreexam11", .Trust = True}

접속하는 DB의 정보를 넣는다. 필자는 MSSQL Express를 사용해서 로컬에 ECCoreExam이라는 DB를 만들고 사용자 아이디와 비밀번호를 설정했다. 이 부분은 각자 환경에 맞춰서 설정해주면 되겠다. 마지막 Trust는 SSL 인증서가 있으면 False를 넣어주면 된다. 내 로컬 PC에는 SSL 인증서가 없어서 True로 설정했다.

(2) Select 버튼 클릭

Private Sub ButtonSelect_Click(sender As Object, e As EventArgs) Handles ButtonSelect.Click
   Call WriteUserList(DBClass.SelectUserList(DBInfo))
End Sub

Private Sub WriteUserList(pList As List(Of USER_INFO))
    Dim lpMsg As String

    If pList.Count = 0 Then
        Call WriteLog("DB에 저장된 내용이 없습니다.")
    Else
        For i As Integer = 0 To pList.Count - 1
            lpMsg = $"user_id={pList(i).User_id}, user_name={pList(i).User_name}, user_score={pList(i).User_score}"
            Call WriteLog(lpMsg)
        Next
    End If
End Sub

Private Sub WriteLog(pStr As String)

    Dim lpStr As String

    lpStr = "[" & Format(Now, "yyyy/MM/dd HH:mm:ss") & "] " & pStr
    ListBoxLog.Items.Insert(0, lpStr)

    Do While ListBoxLog.Items.Count > 100
        ListBoxLog.Items.RemoveAt(ListBoxLog.Items.Count - 1)
    Loop

End Sub

 

위에서 만들어둔 SelectUserList 함수를 호출해서 가져온 사용자 목록을 리스트박스(ListBoxLog)에 뿌려준다. 처음 실행시 데이터가 없으니 없다고 뿌려주면 된다.

 

WriteLog 함수는 파라미터로 넘겨받은 문자열에 현재 날짜/시간을 추가해서 최대 100줄 한도 내에서 데이터를 화면에 뿌려주며, 100줄이 넘어가면 오래된 항목부터 삭제하는 간단한 함수이다.

(3) Insert 버튼 클릭

Private Sub ButtonInsert_Click(sender As Object, e As EventArgs) Handles ButtonInsert.Click
    Dim lpItem As New USER_INFO With {.User_id = TextBoxID.Text, .User_name = TextBoxName.Text, .User_score = Val(TextBoxScore.Text)}
    Dim lpCnt As Integer = DBClass.InsertUserInfo(DBInfo, lpItem)
    Call WriteLog($"총 {lpCnt}개의 데이터가 삽입되었습니다.")
    If lpCnt > 0 Then
        Call WriteUserList(DBClass.SelectUserList(DBInfo))
    End If
End Sub

 

위에서 만들어둔 InsertUserInfo 함수를 이용해서 화면에 입력한 사용자 아이디, 이름, 점수를 DB에 기록한 후, 전체 DB의 내용을 화면에 뿌려준다.

 

아래는 최초 실행시 Select 버튼을 한번 누르고, 텍스트박스에 적절한 값을 입력후 Insert버튼을 누른 후의 화면이다.

마치며...

이렇게 총 3개의 강좌를 통해 EntityFrameworkCore을 사용해서 MS-SQL을 다루는 방법에 대해 알아보았다. 데이터 삭제, 각종 Join문 등 여기서 다루지 않은 많은 기능들이 있지만, 이번 강좌의 목적은 생소한 개념인 EntityFrameworkCore을 이용해서 DB를 사용하는 방법을 알아보는 것이기 때문에 어느정도 목적에 부합은 했다고 생각된다.

 

이를 이용해서 조금더 심화된 기능을 구현하는건 직접 해보시기 바라며 이번 강좌를 마치도록 하겠다.

 

ps. 첨부된 파일은 VS2022에서 열어야 정상 동작하며, 웬만하면 정상 동작하겠지만 혹시 오류가 발생하면 NuGet 패키지 관리자에서 EntityFrameworkCore 관련 항목 제거 후 다시 설치해보자.

반응형