EntityFrameWork 를 활용하여

DDD의 어댑터 요소인 레파지토리를 구현합니다.


  • Entity : 근본적으로 속성이 아니라, 연속성과 식별성의 맥락에서 정의되는 객체
  • Value Object :  식별성(ID)가 없으며 변경불가능합니다. 
  • Repository : 객체 컬렉션을 흉내내며, 저장,조회,검색 행의를 캡슐화하는 메카니즘
  • AggreGate(집합체) : 데이터 변경을 목적으로 하나의 단위로 다뤄지는 연관 객체의 모음, 일관성 규칙이 경계내에 적용됨)



    <!-- ORM  -->
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.2" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.1" />


Entity 정의

namespace AkkaDotBootApi.Entity.User
{
    public class UserEntity
    {
        public int UserId { get; set; }

        public string Name { get; set; }

        public string Email { get; set; }
    }
}

Entity 는 식별되는 객체로, 어떠한 프레임워크에 종속적일필요 없는  POCO로 정의합니다.

여기서 어떠한 프레임워크에 의존되는 어노테이션이 정의되는 순간 해당 객체는 특정 프레임워크에

종속적이게 됩니다. 


닷넷의 어트리뷰트와 자바의 어노테이션은 같은 유사한 목적을 가지고 있습니다.
간단하게 설명하면,언어수준에서 메타기법으로 클래스에 특정한 설정및 구현을 빌트인하여 구현해야할 코드량을 줄일수있으며
이 기법은 자바웹진영에서 잘활용하고 있어서 먼저 발생한것으로 유일한것으로 알고 있는 개발자분들이 많으나
닷넷 1.0에서 나온 컨셉을 자바 5에서 반영한 케이스로 반대로 영향을 주었습니다.

하지만, 프레임워크에 의존적일 필요없는 객체들까지 어노테이션의 무분별한 사용으로
무거운 객체화가되고 특정기술에 종속을 시키면서

OOP로 다시 돌아가자는 활동의 시작, 어노테이션을 사용하지말자가 아닌

사용할 필요가 없는곳에서 사용하지말자는 이야기입니다.

https://ko.wikipedia.org/wiki/Plain_Old_Java_Object


POCO를 수행하기위해서, Entity객체는 어떠한 어트리뷰트(어노테이션)을 가질필요가 없습니다.

.Net core에서  Fluent API를 활용하여 Entity에 스키마와 관련된 속성들을 Repository에 정의할수 있습니다.

Repository

using AkkaDotBootApi.Config;
using AkkaDotBootApi.Entity.User;
using Microsoft.EntityFrameworkCore;

namespace AkkaDotBootApi.Repositories
{
    interface IUserRepository
    {

    }

    public class UserRepository : DbContext, IUserRepository
    {
        private string database = "webnori";

        protected DbSet<UserEntity> userEntities { get; set; }

        protected AppSettings appSettings { get; set; }

        public UserRepository(AppSettings _appSettings)
        {
            appSettings = _appSettings;
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder
                .Entity<UserEntity>(eb =>
                {
                    eb.HasKey(b => b.UserId)
                        .HasName("PrimaryKey_UserId");

                    eb.ToTable("tb_user");
                });
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string dbOption = "Convert Zero Datetime=true;";
            string dbConnectionString = appSettings.DBConnectionMysql + $"database={database};" + dbOption;            
            optionsBuilder.UseMySql(dbConnectionString);
            base.OnConfiguring(optionsBuilder);
        }
    }
}




  • No labels