더북(TheBook)

데이터 저장소를 위한 리포지토리 클래스 만들기

1.   InMemoryDatabase 프로젝트에 이 실습의 핵심 코드를 담을 CategoryRepository InMemory.cs 파일을 만들고, 다음과 같이 코드를 작성합니다. 실제로 데이터베이스는 사용하지 않고, List<T> 형태의 _categories 컬렉션 개체를 생성한 후 이곳에 데이터를 입력, 조회, 수정, 삭제 등 기능을 구현한 클래스입니다.

//CategoryRepositoryInMemory.cs
using Dul.Data;
using System.Collections.Generic;
using System.Linq;

namespace InMemoryDatabase
{
    public class CategoryRepositoryInMemory : ICategoryRepository
    {
        //인메모리 데이터베이스 역할을 하는 정적 컬렉션 개체 생성
        private static List<Category> _categories = new List<Category>();

        public CategoryRepositoryInMemory()
        {
            //생성자에서 컬렉션 이니셜라이저를 사용하여 데이터 3개로 초기화
            _categories = new List<Category>()
            {
                new Category() { CategoryId = 1, CategoryName = "책" },
                new Category() { CategoryId = 2, CategoryName = "강의" },
                new Category() { CategoryId = 3, CategoryName = "컴퓨터" }
            };
        }

        ///<summary>
        ///입력
        ///</summary>
        public Category Add(Category model)
        {
            //가장 큰 CategoryId에 1 더한 값으로 새로운 CategoryId 생성
            model.CategoryId = _categories.Max(c => c.CategoryId) + 1;
            _categories.Add(model);
            return model;
        }

        ///<summary>
        ///상세
        ///</summary>
        public Category Browse(int id)
        {
            return _categories.Where(c => c.CategoryId == id).SingleOrDefault();
        }

        ///<summary>
        ///삭제
        ///</summary>
        public bool Delete(int id)
        {

            int r = _categories.RemoveAll(c => c.CategoryId == id);
            if (r > 0)
            {
                return true;
            }
            return false;
        }

        ///<summary>
        ///수정
        ///</summary>
        public bool Edit(Category model)
        {
            var result = _categories
                .Where(c => c.CategoryId == model.CategoryId)
                .Select(c => { c.CategoryName = model.CategoryName; return c; })
                .SingleOrDefault();
            if (result != null)
            {
                return true;
            }
            return false;
        }

        ///<summary>
        ///건수
        ///</summary>
        public int Has()
        {
            return _categories.Count;
        }

        ///<summary>
        ///정렬
        ///</summary>
        ///<param name="orderOption">OrderOption 열거형</param>
        ///<returns>읽기 전용(IEnumerable)으로 정렬된 레코드셋</returns>
        public IEnumerable<Category> Ordering(OrderOption orderOption)
        {
            IEnumerable<Category> categories;
        
            switch (orderOption)
            {
                case OrderOption.Ascending:
                  //[a] 확장 메서드 사용
                  categories = _categories.OrderBy(c => c.CategoryName);
                  break;
                case OrderOption.Descending:
                  //[b] 쿼리 식 사용
                  categories = (from category in _categories
                                orderby category.CategoryName descending
                                select category);
                  break;
                default:
                  //[c] 기본값
                  categories = _categories;
                  break;
            }
            
            return categories;
        }

        ///<summary>
        ///페이징
        ///</summary>
        ///<param name="pageNumber">페이지 번호: 1, 2, 3, ...</param>
        ///<param name="pageSize">페이지 크기: 한 페이지당 10개씩 표시</param>
        ///<returns>읽고 쓰기가 가능한(List) 페이징 처리된 레코드셋</returns>
        public List<Category> Paging(int pageNumber = 1, int pageSize = 10)
        {
            return
                _categories
                  .Skip((pageNumber - 1) * pageSize)
                  .Take(pageSize)
                  .ToList();
        }

        ///<summary>
        ///출력
        ///</summary>
        public List<Category> Read()
        {
            return _categories;
        }

        ///<summary>
        ///검색
        ///</summary>
        public List<Category> Search(string query)
        {
            return _categories
                .Where(category => category.CategoryName.Contains(query)).ToList();
        }
    }
}

앞에서 지금까지 배운 내용들을 바탕으로 코드를 작성했고 각 메서드에서 진행하는 코드는 간결하게 표현했기에, 자세한 설명은 앞 소스 코드의 내용 및 주석을 참고하세요.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.