이 게시물은 Visual Studio, MySQL 환경에서의 .NET 7과 SqlKata 2.4.0에 관해 설명합니다. 다른 버전을 사용할 경우 게시글의 설명과 다를 수 있습니다.
이 글은 https://github.com/sqlkata/querybuilder를 참고하여 작성되었습니다.
목차
이번 글에서는 SqlKata에 대해 알아보고, 이를 활용하여 ASP.NET Core 환경에서 CRUD를 구현하는 방법을 알아보겠습니다.
1. SqlKata란
C#으로 사용 가능한 SQL 쿼리 빌더입니다. 고수준의 API를 제공하여 사용자 입장에서 편리하게 사용할 수 있습니다. SQL에 익숙하지 않은 사용자도 어렵지 않게 사용 가능합니다. 이 라이브러리는 오픈소스로 개발되었습니다.
요약하자면, SqlKata는 C#으로 데이터베이스를 다루는 것을 쉽게 만들어주는 라이브러리입니다.
CRUD 구현은 Member 테이블에 Member를 삽입, 개별 조회, 전체 조회, 수정, 삭제하는 것으로 해보겠습니다. 이를 위해 우선, Visual Studio에서 ASP.NET Core Web API를 선택하여 새로운 프로젝트를 생성합니다. 그 후, IDE 상단의 Tools -> NuGet Package Builder -> Manage Nuget Package For Solution으로 들어가서 MySQLConnector, SqlKata, SqlKata.Execution를 설치해 줍니다. 저는 Last Stable 버전으로 설치해 주었습니다.
그 후, Controller, util class와 함께 데이터베이스 CRUD를 활용한 메서드를 개발합니다. 이 글에서는 그중 SqlKata를 활용해 DB에 자료를 CRUD 하는 방식을 소개할 것입니다.
코드에서 비즈니스 로직과 인증 로직은 최대한 제거하였습니다.
2. Create
public async Task<ErrorCode> CreateMemberAsync(String email, String nickname, String password)
{
// password를 해싱하여 hashingPassword로 만드는 로직
try
{
var count = await _queryFactory.Query("member").InsertAsync(new
{
Email = email,
Nickname = nickname,
SaltValue = saltValue,
HashedPassword = hashingPassword
});
if (count != 1) // db에 멤버 정보를 넣는 것에 실패했을 경우
{
return ErrorCode.CreateAccountFailInsert;
}
return ErrorCode.None;
}
catch (Exception e)
{
return ErrorCode.CreateAccountFailException;
}
}
email, nickname, password를 가지고 비동기적으로 Member를 Create 하는 메서드입니다. ErrorCode는 enum형으로 개발하였습니다.
3. Read
public async Task<Tuple<ErrorCode, MemberInfo>> GetMemberAsync(long memberId)
{
try
{
var memberInfo = await _queryFactory.Query("member")
.Select("Email", "Nickname")
.Where("AccountId", memberId)
.FirstAsync<MemberInfo>();
return new Tuple<ErrorCode, MemberInfo>(ErrorCode.None, memberInfo);
}
catch (Exception e)
{
return new Tuple<ErrorCode, MemberInfo>(ErrorCode.AccountNotExist, null);
}
}
memberId를 가지고 비동기적으로 Member를 단건 조회하는 메서드입니다. 반환값의 형태는 ErrorCode와 MemberInfo입니다. MemberInfo에 Email과 Nickname 값만 들어가기 때문에, 쿼리 작성 시에도 Email과 Nickname만 조회합니다.
public async Task<Tuple<ErrorCode, IEnumerable<MemberInfo>>> GetMemberListAsync()
{
try
{
var memberList = await _queryFactory.Query("member")
.Select("Email", "Nickname")
.GetAsync<MemberInfo>();
return new Tuple<ErrorCode, IEnumerable<MemberInfo>>(ErrorCode.None, memberList);
}
catch (Exception e)
{
return new Tuple<ErrorCode, IEnumerable<MemberInfo>>(ErrorCode.GetAccountListFail, null);
}
}
비동기적으로 Member를 전체 조회하는 메서드입니다. 반환값의 형태는 ErrorCode와 MemberInfo Enumerable입니다. MemberInfo에 Email과 Nickname 값만 들어가기 때문에, 쿼리 작성 시에도 Email과 Nickname만 조회합니다. Member 단건 조회 메서드와 로직이 유사합니다.
4. Update
public async Task<ErrorCode> UpdateMemberAsync(long memberId, String updatedNickname)
{
try
{
await _queryFactory.Query("member").Where("accountId", memberId).UpdateAsync(new
{
Nickname = updatedNickname
});
return ErrorCode.None;
}
catch (Exception e)
{
return ErrorCode.UpdateAccountFail;
}
}
memberId와 updatedNickname을 가지고 memberId에 해당되는 Member를 찾아 해당 Member의 Nickname을 updatedNickname로 비동기적으로 수정하는 메서드입니다. ErrorCode를 반환합니다.
5. Delete
public async Task<ErrorCode> DeleteMemberAsync(long memberId)
{
try
{
await _queryFactory.Query("member").Where("AccountId", memberId).DeleteAsync();
return ErrorCode.None;
}
catch (Exception e)
{
return ErrorCode.DeleteAccountFail;
}
}
memberId로 Member를 비동기적으로 단건 삭제하는 메서드입니다. 즉, Member 테이블의 행 하나를 삭제하는 메서드입니다. ErrorCode를 반환합니다.
예제를 통해 ASP.NET Core에서의 SqlKata에 대해 간단히 알아보았습니다. 더 많은 정보는 https://github.com/sqlkata/querybuilder를 참고하세요.
'Framework > .NET' 카테고리의 다른 글
| MySQL에 C#의 DateTime.MaxValue를 넣을 수 없는 이유 (0) | 2023.05.08 |
|---|---|
| ASP.NET에서의 MySQL VS Redis (0) | 2023.05.03 |
| [ASP.NET Core로 Web API 만들기] 1. ASP.NET Core에 대해 (0) | 2023.04.22 |