위 프로젝트를 시작한 이유는 자연 키 생성을 자동화하기 위한 것이었습니다.
자연 키가 왜 필요했냐하면, 클라이언트 코드에 아래와 같이 내부 정보인 Id 값을 노출하기 보다는
아래와 같이 슬러그로 노출되기를 원했기 때문입니다.
구현
class Movie
{
public int Id { get; private set; }
public required string Title { get; set; }
public required int Year { get; set; }
public required string Key { get; set; }
}
static class KeyPolicy
{
public static string Movie(string title, int year) =>
$"{title} {year}";
}
public record CreateMovie(string Title, string Year);
// var request = new CreateMovie("신세계", 2013);
첨부의 프로젝트는 아래와 같이 사용됩니다.
using Transcriptor.HanguelRomanization;
var g = app.MapGroup("/movies");
g.MapPost("", async (CreateMovie r, AppDbContext db, CancellationToken ct) =>
{
var key = KeyPolicy.Movie(r.Title, r.Year).RomanizeHangeuls('-');
var e = new Movie { Name = r.Title, Year = r.Year, Key = key };
db.Movies.Add(e);
await db.SaveChangesAsync(ct);
return Results.Created(e.ToDto());
});
g.MapGet("/{key}", async (string key, AppDbContext db, CancellationToken ct) =>
{
var e = await db.Movies.FirstOrDefaultAsync(m => m.Key == key, ct);
return e != null ? Results.Ok(e.ToDto())
: Results.NotFound();
});
도메인 비지니스의 일부가 별도의 프로젝트로 성장한 경험이었습니다.
Transcriptor 는 문자열에서 한글만 추출해서, 변환합니다.
아직은 한글의 모든 음운현상을 구현하지 않았습니다.