EF Core 를 사용할 때 DB접근 객체와 데이터 교환 객체 디자인

EF Core를 이용하게 되면 테이블의 레코드에 해당하는 엔티티 (또는 DAO라고도 하는) 를 구성해야 합니다.
이렇게 구성한 엔티티를 이용해 테이블도 만들고 질의를 하게 되는데, 뷰레이어에서 그대로 이 엔티티를 사용하는 것은 좋은 접근은 아닙니다. 뷰와 데이터 계층 분리를 어렵게 하고 데이터-뷰 사이의 구간이 네트워크 원격구간이 될 경우 (JSON API를 통한 SPA 웹앱 등) 불필요한 데이터가 전송구간에 포함될 수 있기 때문입니다.

그래서 Java나 .NET에서 일반적으로 사용하는 방식은 데이터에 집중하는 DAO와 표현에 집중하는 DTO로 데이터를 관점별로 분리해서 사용하게 됩니다.

C# 9의 record와 인터페이스를 적절히 활용하면 다음처럼 사용이 가능합니다.

using System;
using System.Text.Json;

var dbData = new UserInfo("dimohy", "정세일", "abcdefg1234567", "010-1111-2222");
var jsonText = JsonSerializer.Serialize(dbData as IUserDto);
Console.WriteLine(jsonText);

// var reverseData = JsonSerializer.Deserialize<IUserDto>(jsonText);
var reverseData = JsonSerializer.Deserialize<UserDto>(jsonText);

record UserInfo(string Id, string Name, string Passwords, string PhoneNumber) : IUserDto;
record UserDto(string Id, string Name) : IUserDto;
interface IUserDto
{
    string Id { get; }
    string Name { get; }
}

dbData는 엔티티이며, 암호와 전화번호가 포함되어 있습니다.
dbData → reserverData과정이 JSON 전송구간이 되며 직렬화 시 인터페이스를 통해 전송하지 않아야 할 속성들은 제거 되게 됩니다.
reverseData는 표현층에서 표현될 데이터이며, 표현에 불필요한 암호와 전화번호가 제거되어 있습니다.

※ 인터페이스만으로 클래스 없이 인스턴스를 생성해주는 라이브러리를 이용하면 DTO 클래스 없이 인터페이스만으로도 DTO 클래스 처럼 사용할 수 있습니다. 아니면, 소스 생성기를 이용해 인터페이스로
DTO 클래스를 자동 생성하게 해서 사용할 수 도 있습니다.