자동화된 자연 키

FP 연습 예제 - :man_teacher: 튜토리얼, 팁, 강좌 - 닷넷데브

위 프로젝트를 시작한 이유는 자연 키 생성을 자동화하기 위한 것이었습니다.

자연 키가 왜 필요했냐하면, 클라이언트 코드에 아래와 같이 내부 정보인 Id 값을 노출하기 보다는

https://myapi/movies/100
https://myapi/movies?id=100

아래와 같이 슬러그로 노출되기를 원했기 때문입니다.

https://myapi/movies/shin-sae-gye-2013

구현

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 는 문자열에서 한글만 추출해서, 변환합니다.
아직은 한글의 모든 음운현상을 구현하지 않았습니다.

4 Likes

영화라는 도메인에서 연도제목 이 겹치는 모두 경우는 매우 드물긴 하겠지만,

유니크하게 생성되기는 어렵지 않을까 생각합니다.

그와는 별개로

RomanizeHangeuls(...) 메서드의 내부가 매우 궁금해지네요 ㅋㅋㅋㅋ

URL 용 슬러그 생성할 일이 있는데 아주 필요합니다.

2 Likes

정확한 지적이십니다.

간략히 소개하기 위해 실무에 사용된 고유성 보장 코드까지 이 게시글에 적지 않았지만, 실제 코드는 아래와 같이 단일 값으로 처리하더라도 고유성이 보장됩니다.

https://myapi/movies/shin-sae-gye
https://myapi/movies/shin-sae-gye-2
https://myapi/movies/shin-sae-gye-3

이 고유성 보장 코드 또한, 별도의 도메인 로직입니다.

RomanizeHangeuls를 포함한 모든 코드는 깃허브에 모두 공개되어 있습니다.

2 Likes