
EF Core 9(Entity Framework Core 9)이 곧 출시될 예정이며, .NET 개발자들이 데이터를 처리하는 방식에 큰 변화를 가져올 새로운 기능들을 선보입니다. 특히 이번 릴리스에서 가장 주목할 만한 개선 사항 중 하나는 JSON 열(column)에 대한 심층적인 통합입니다.
과거에는 JSON 데이터를 데이터베이스에 저장하고 쿼리하는 작업이 다소 번거로웠습니다. 하지만 EF Core 9은 이 과정을 훨씬 더 직관적이고 강력하게 만들어, 마치 일반적인 관계형 데이터처럼 JSON 데이터를 다룰 수 있게 해줍니다.
이번 블로그 포스트에서는 EF Core 9에서 새롭게 선보이는 JSON 통합 기능의 주요 내용과 그 활용 방법을 자세히 살펴보겠습니다.
JSON 열: 기본 개념
EF Core 9의 핵심적인 변화는 JSON 데이터를 포함하는 속성을 데이터베이스의 전용 JSON 열에 매핑할 수 있다는 점입니다. 이를 통해 개발자는 관계형 데이터베이스의 장점과 NoSQL 데이터베이스의 유연성을 동시에 활용할 수 있게 됩니다.
예를 들어, User라는 엔터티가 있고 각 사용자에게는 주소, 소셜 미디어 프로필 등 다양한 연락처 정보가 있다고 가정해 보겠습니다. 이러한 정보는 구조화되어 있지만 사용자마다 다를 수 있으므로 JSON 형식으로 저장하는 것이 이상적입니다.
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ContactDetails Contacts { get; set; } // JSON으로 매핑될 속성
}
public class ContactDetails
{
public string Email { get; set; }
public Address Address { get; set; }
public List<SocialMediaProfile> SocialMedia { get; set; }
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
public class SocialMediaProfile
{
public string Platform { get; set; }
public string Url { get; set; }
}
이제 DbContext에서 ToJson() 메서드를 사용하여 Contacts 속성을 JSON 열로 지정할 수 있습니다.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.OwnsOne(u => u.Contacts, ownedNavigationBuilder =>
{
ownedNavigationBuilder.ToJson(); // Contacts를 JSON 열로 매핑
ownedNavigationBuilder.OwnsOne(c => c.Address);
ownedNavigationBuilder.OwnsMany(c => c.SocialMedia);
});
}
이렇게 설정하면 EF Core는 User 테이블에 Contacts라는 JSON 열을 생성하고, ContactDetails 객체의 모든 중첩된 구조(주소, 소셜 미디어 목록 등)를 이 열 안에 JSON 문서로 저장합니다.
JSON 데이터 심층 쿼리: LINQ의 마법 ✨
EF Core 9의 진정한 강점은 LINQ를 사용하여 JSON 문서의 깊은 곳까지 쿼리할 수 있다는 점입니다. SQL 데이터베이스가 기본적으로 지원하는 JSON 함수를 활용하여 매우 효율적이고 강력한 쿼리를 실행할 수 있습니다.
요소 탐색
JSON 문서 내의 특정 값에 접근하는 것은 매우 간단합니다. 예를 들어, 'London'에 사는 모든 사용자를 찾고 싶다면 다음과 같이 쿼리할 수 있습니다.
var usersInLondon = await context.Users
.Where(u => u.Contacts.Address.City == "London")
.ToListAsync();
이 LINQ 쿼리는 데이터베이스 엔진에서 지원하는 JSON_VALUE와 같은 함수를 사용하는 SQL로 변환되어, JSON 문서 내부를 효율적으로 탐색합니다.
컬렉션 쿼리
JSON 배열에 대한 쿼리도 매우 강력합니다. 예를 들어, 트위터 프로필을 가진 모든 사용자를 찾고 싶다면 어떻게 해야 할까요? Any()를 사용하면 간단하게 해결할 수 있습니다.
var twitterUsers = await context.Users
.Where(u => u.Contacts.SocialMedia.Any(p => p.Platform == "Twitter"))
.ToListAsync();
이 쿼리는 JSON 배열을 순회하며 조건에 맞는 요소가 하나라도 있는지 확인하는 SQL로 변환됩니다.
뿐만 아니라 Count(), OrderBy(), Skip(), Take() 등 다양한 LINQ 메서드를 JSON 컬렉션에 직접 사용할 수 있습니다. 예를 들어, 사용자의 첫 번째 소셜 미디어 프로필만 가져오는 것도 가능합니다.
var firstSocialMedia = await context.Users
.Select(u => u.Contacts.SocialMedia.FirstOrDefault())
.ToListAsync();
JSON 데이터 업데이트: 간편한 수정
EF Core 9에서는 JSON 데이터를 수정하는 작업도 매우 간편해졌습니다. 일반적인 C# 객체를 다루는 것처럼 속성을 변경하고 SaveChangesAsync()를 호출하기만 하면 됩니다.
예를 들어, 특정 사용자의 도시를 'New York'으로 변경하는 코드는 다음과 같습니다.
var user = await context.Users.FirstAsync(u => u.Name == "John Doe");
user.Contacts.Address.City = "New York";
await context.SaveChangesAsync();
EF Core는 변경된 부분을 감지하고 데이터베이스의 JSON 문서를 업데이트하는 데 필요한 SQL을 자동으로 생성합니다. 이는 **부분 업데이트(Partial Update)**를 지원하므로 전체 JSON 문서를 다시 작성할 필요 없이 변경된 부분만 효율적으로 수정할 수 있습니다.
JSON 배열에 새로운 요소를 추가하거나 기존 요소를 삭제하는 것도 마찬가지로 간단합니다.
// 새로운 소셜 미디어 프로필 추가
user.Contacts.SocialMedia.Add(new SocialMediaProfile { Platform = "LinkedIn", Url = "..." });
// 트위터 프로필 삭제
var twitterProfile = user.Contacts.SocialMedia.FirstOrDefault(p => p.Platform == "Twitter");
if (twitterProfile != null)
{
user.Contacts.SocialMedia.Remove(twitterProfile);
}
await context.SaveChangesAsync();
마무리하며
EF Core 9의 심층적인 JSON 통합은 관계형 데이터베이스와 문서 기반 데이터 모델의 경계를 허무는 중요한 발전입니다. 이제 개발자들은 복잡하고 유연한 데이터 구조를 데이터베이스에 쉽게 저장하고, 강력한 LINQ 쿼리를 통해 효율적으로 데이터를 탐색하고 조작할 수 있게 되었습니다.
이러한 변화는 애플리케이션 설계의 유연성을 높이고, 특정 시나리오에서 별도의 NoSQL 데이터베이스를 사용해야 했던 필요성을 줄여줍니다. .NET 개발자라면 EF Core 9이 가져올 이러한 강력한 기능들을 적극적으로 활용해 보시길 바랍니다!
'최신 IT' 카테고리의 다른 글
| REST API 설계시 가장 흔하게 하는 실수 5가지 와 그 해결 방법 (0) | 2025.10.04 |
|---|---|
| CSS의 최신 20가지 기능들 (0) | 2025.10.04 |
| 2025년의 Modern Node.js Patterns (0) | 2025.09.23 |
| .NET 고성능 객체 매퍼, Mapster로 개발 속도 높이기 (1) | 2025.09.22 |
| 2026년 주목해야 할 10가지 UI 트렌드 (0) | 2025.09.18 |