추상 팩토리 패턴을 활용한 데이터베이스 접근 계층 구현

팩토리 메서드 패턴은 단일 인스턴스 생성을 위한 우수한 확장성을 제공합니다. 그러나 실제 애플리케이션에서는 단일 제품이 아닌 연관된 제품군을 생성해야 하는 경우가 많으며, 이때 추상 팩토리 패턴이 효과적으로 적용됩니다. 특히 다중 데이터베이스 환경에서의 전환 요구사항을 해결하는 데 적합합니다. **단순 팩토리를 통한 추상 팩토리 개선** 다음은 사용자와 부서 정보를 관리하는 데이터베이스 테이블 구조입니다:
CREATE TABLE Member (
    MemberID INT PRIMARY KEY,
    FullName NVARCHAR(50)
)

CREATE TABLE Organization (
    OrgID INT PRIMARY KEY,
    OrgName NVARCHAR(50)
)
도메인 모델 클래스 구현:
public class Organization {
    public int OrgID { get; set; }
    public string OrgName { get; set; }
}

public class Member {
    public int MemberID { get; set; }
    public string FullName { get; set; }
}
데이터 접근 계층 인터페이스 정의:
public interface IMemberRepository {
    void AddMember(Member member);
    Member RetrieveMember(int id);
}

public interface IOrgRepository {
    void AddOrganization(Organization org);
    Organization RetrieveOrganization(int id);
}
구체적인 데이터베이스 구현체:
public class MySQLMemberRepo : IMemberRepository {
    public void AddMember(Member member) {
        // MySQL 사용자 추가 로직
    }
    
    public Member RetrieveMember(int id) {
        // MySQL 사용자 조회
        return new Member();
    }
}

public class SQLServerMemberRepo : IMemberRepository {
    public void AddMember(Member member) {
        // SQL Server 사용자 추가
    }
    
    public Member RetrieveMember(int id) {
        // SQL Server 사용자 조회
        return new Member();
    }
}
public class MySQLOrgRepo : IOrgRepository {
    public void AddOrganization(Organization org) {
        // MySQL 부서 정보 저장
    }
    
    public Organization RetrieveOrganization(int id) {
        // MySQL 부서 정보 조회
        return new Organization();
    }
}

public class SQLServerOrgRepo : IOrgRepository {
    public void AddOrganization(Organization org) {
        // SQL Server 부서 정보 저장
    }
    
    public Organization RetrieveOrganization(int id) {
        // SQL Server 부서 정보 조회
        return new Organization();
    }
}
통합 팩토리 클래스를 통한 인스턴스 생성:
public class RepositoryFactory {
    private enum DatabaseSystem { MySQL, SQLServer }
    private static readonly DatabaseSystem currentDB = DatabaseSystem.MySQL;

    public static IMemberRepository CreateMemberRepository() {
        switch(currentDB) {
            case DatabaseSystem.MySQL:
                return new MySQLMemberRepo();
            case DatabaseSystem.SQLServer:
                return new SQLServerMemberRepo();
            default:
                throw new NotSupportedException();
        }
    }

    public static IOrgRepository CreateOrganizationRepository() {
        switch(currentDB) {
            case DatabaseSystem.MySQL:
                return new MySQLOrgRepo();
            case DatabaseSystem.SQLServer:
                return new SQLServerOrgRepo();
            default:
                throw new NotSupportedException();
        }
    }
}

태그: 추상 팩토리 패턴 디자인 패턴 데이터 접근 계층 객체 생성 패턴 C#

5월 24일 10:20에 게시됨