C#에서 사용 가능한 쿼리 기반 ORM.
ORM : 객체(코드)와 DB(테이블)을 매핑해주는 도구(라이브러리)
Dapper나 SQL Kata를 쓰는 경우 repository를 통해 데이터를 읽고 쓰는 방식이다.
→ DB 조작을 수행하는 클래스(서비스) 생성.
해당 문서에서 사용할 SQL Kata의 경우, 흔히 사용하는 ORM중 하나인 EF와 달리, SQL문을 통해 DB에 접근한다.
# .csproj파일이 있는 곳에서
dotnet add package SqlKata
dotnet add package SqlKata.Execution # 확장 기능 사용시
혹은 Nuget 사용
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);
});
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에서 쓰는게 좋다.
게임에서 필요한 유저정보, 게임정보, 승패 결과정보를 담는 테이블들을 생성 후 활용하는 예제.
# 유저 정보 테이블
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)
);