1. SqlKata란

SqlKata | SqlKata

C#에서 사용 가능한 쿼리 기반 ORM.

ORM : 객체(코드)와 DB(테이블)을 매핑해주는 도구(라이브러리)

Dapper나 SQL Kata를 쓰는 경우 repository를 통해 데이터를 읽고 쓰는 방식이다.
→ DB 조작을 수행하는 클래스(서비스) 생성.

해당 문서에서 사용할 SQL Kata의 경우, 흔히 사용하는 ORM중 하나인 EF와 달리, SQL문을 통해 DB에 접근한다.

2. SqlKata 설치

# .csproj파일이 있는 곳에서
dotnet add package SqlKata
dotnet add package SqlKata.Execution # 확장 기능 사용시

혹은 Nuget 사용

Untitled

3. QueryFactory 서비스 주입

using SqlKata;
using SqlKata.Compilers;
using SqlKata.Execution;
...
builder.Services.AddTransient<QueryFactory>((e) =>
{
	// MySqlConnection : MySqlConnector설치
  var connection = new MySqlConnection(
    "Host=localhost;Port=3306;User=user;Password=secret;Database=Users;SslMode=None"
  );

  var compiler = new MySqlCompiler();

  return new QueryFactory(connection, compiler);

});

4. QueryFactory서비스를 DI

using SqlKata.Execution;
...
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
  private QueryFactory _db;
  public WeatherForecastController(ILogger<WeatherForecastController> logger, QueryFactory db)
  {
      _db = db;
  }

	// 
	[HttpGet("{id}")]
	public IActionResult Get(int id)
	{
		// userId값을 url로 넘겨주면, 그 인덱스의 유저 email을 반환.
		// SELECT Email FROM account WHERE AccountId={id};
		string email = _db.Query("account").Select("Email").Where("AccountId", id).FirstOrDefaultAsync<string>();
    if (email == null || email.Count() == 0)
		{
        return NotFound();
		}
    return Ok(email);
	}
}

실제 프로젝트에서는 QueryFactory를 래핑해서 DB에 쓰는 동작을 하는 별도의 Service를 정의해서, 이를 Controller에서 쓰는게 좋다.

5. SqlKata 사용 예시

게임에서 필요한 유저정보, 게임정보, 승패 결과정보를 담는 테이블들을 생성 후 활용하는 예제.

# 유저 정보 테이블
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    salt VARCHAR(255) NOT NULL,
    hashed_password VARCHAR(255) NOT NULL,
    UNIQUE (username)
);
# 게임 정보
CREATE TABLE games (
    game_id INT AUTO_INCREMENT PRIMARY KEY,
    start_time TIMESTAMP,
    end_time TIMESTAMP
);

# 유저별 승패 결과
CREATE TABLE game_results (
    result_id INT AUTO_INCREMENT PRIMARY KEY,
    game_id INT,
    user_id INT,
    is_winner BOOL,
    FOREIGN KEY (game_id) REFERENCES games(game_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

테이블 생성 삭제