IMCAT.DEV
로그인 가입
C# 고급 디자인패턴

C# 비즈니스 로직과 데이터 접근 분리

C# 비즈니스 로직과 데이터 접근 분리 — 고급

비즈니스 로직과 데이터 접근 분리

1. 도입 (왜 배워야 하는가)

비즈니스 로직과 데이터 접근을 분리하는 것은 소프트웨어 개발에서 매우 중요한 설계 원칙입니다. 이는 응용 프로그램의 유지 보수성, 확장성 및 테스트 용이성을 크게 향상시킵니다. 비즈니스 로직은 실제 업무 규칙이나 절차를 정의하고, 데이터 접근은 데이터베이스와의 상호작용을 담당합니다. 이 둘을 분리하지 않으면 다음과 같은 문제가 발생할 수 있습니다:

  • 유지보수의 어려움: 비즈니스 로직과 데이터 접근 코드가 혼합되어 있으면, 하나의 변경이 다른 부분에 영향을 미칠 수 있으며, 이는 버그를 유발할 가능성을 높입니다.
  • 테스트의 복잡성: 비즈니스 로직을 독립적으로 테스트하기 어려워져, 코드의 품질을 보장하기 힘들어집니다.
  • 재사용성 저하: 비즈니스 로직과 데이터 접근이 결합되어 있으면, 특정 비즈니스 규칙을 다른 애플리케이션에서 재사용하기가 어렵습니다.
  • 2. 핵심 개념 설명

    2.1 비즈니스 로직

    비즈니스 로직은 소프트웨어가 수행해야 하는 실제 업무 규칙을 정의하는 코드입니다. 예를 들어, 쇼핑몰에서 장바구니 총합 계산하는 로직이 여기에 해당합니다.

    2.2 데이터 접근

    데이터 접근은 데이터베이스와의 상호작용을 처리하는 코드입니다. 예를 들어, 데이터베이스에서 상품 정보를 조회하거나 저장하는 작업이 이에 해당합니다.

    용어정의
    비즈니스 로직실제 업무 규칙이나 절차를 정의하는 코드
    데이터 접근데이터베이스와의 상호작용을 처리하는 코드

    3. 기본 코드 예제

    아래는 비즈니스 로직과 데이터 접근을 분리한 간단한 예제입니다.

    // 데이터 접근 클래스
    public class ProductRepository
    {
        public Product GetProductById(int id)
        {
            // 데이터베이스에서 상품을 조회하는 코드 (예시)
            return new Product { Id = id, Name = "Sample Product", Price = 100 };
        }
    }
    
    // 비즈니스 로직 클래스
    public class ShoppingCart
    {
        private ProductRepository _repository;
    
        public ShoppingCart(ProductRepository repository)
        {
            _repository = repository;
        }
    
        public decimal CalculateTotal(int productId, int quantity)
        {
            var product = _repository.GetProductById(productId);
            return product.Price * quantity;
        }
    }
    
    // 사용 예
    var repository = new ProductRepository();
    var cart = new ShoppingCart(repository);
    var total = cart.CalculateTotal(1, 3);
    
    // 실행 결과: 300
  • ProductRepository 클래스는 데이터베이스에서 상품 정보를 조회하는 역할을 합니다.
  • ShoppingCart 클래스는 비즈니스 로직을 처리하며, 주어진 상품 ID와 수량에 따라 총합을 계산합니다.
  • CalculateTotal 메서드는 상품 정보를 조회한 후, 그 가격에 수량을 곱하여 총합을 반환합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 구현

    쇼핑몰에서 장바구니에 상품을 추가하고 총합을 계산하는 경우, 비즈니스 로직과 데이터 접근을 명확히 분리하여 관리합니다.

    public void AddToCart(int productId, int quantity)
    {
        // 상품을 장바구니에 추가하는 비즈니스 로직
        var product = _repository.GetProductById(productId);
        // 장바구니에 추가 로직...
    }

    예제 2: 사용자 인증

    사용자 인증 로직을 데이터 접근과 분리하여, 예를 들어 다음과 같이 구현할 수 있습니다.

    public class UserAuthentication
    {
        private UserRepository _userRepository;
    
        public UserAuthentication(UserRepository userRepository)
        {
            _userRepository = userRepository;
        }
    
        public bool Authenticate(string username, string password)
        {
            var user = _userRepository.GetUserByUsername(username);
            return user.Password == password;
        }
    }

    5. 흔한 실수와 주의사항

    실수 1: 비즈니스 로직에 데이터 접근 코드 포함

    public decimal CalculateTotal(int productId, int quantity)
    {
        var product = GetProductById(productId); // 잘못된 예
        return product.Price * quantity;
    }

    올바른 코드:

    public decimal CalculateTotal(int productId, int quantity)
    {
        var product = _repository.GetProductById(productId); // 올바른 예
        return product.Price * quantity;
    }

    실수 2: 의존성 주입을 무시

    의존성 주입을 통해 데이터 접근 객체를 주입하지 않으면, 테스트가 어려워집니다.

    var cart = new ShoppingCart(); // 잘못된 예

    올바른 코드:

    var cart = new ShoppingCart(new ProductRepository()); // 올바른 예

    6. 정리

  • 비즈니스 로직과 데이터 접근을 분리하면 유지보수성과 테스트 용이성이 증가합니다.
  • 비즈니스 로직은 실제 업무 규칙을, 데이터 접근은 데이터베이스와의 상호작용을 담당합니다.
  • 의존성 주입을 통해 코드의 재사용성과 테스트 용이성을 높일 수 있습니다.

다음에 학습하면 좋은 주제: 의존성 주입 (Dependency Injection), 디자인 패턴 (예: Repository 패턴, 서비스 패턴).