본문 바로가기

ASP.NET&C#/ASP.NET MVC

[ASP.NET CORE/MVC] 홈페이지 제작 #4 베이스 컨트롤러 / 싱글톤 패턴을 이용해서 서비스 만들기

[ASP.NET CORE/MVC] 홈페이지 제작 #4 베이스 컨트롤러 / 싱글톤 패턴을 이용해서 서비스 만들기

 

프로젝트 환경

OS : Windows 10

IDE : Visual Studio Code 1.69.1

.Net SDK : 6.0.302

.Net Runtime : .NetCore.App 6.0.7

DataBase : PostgreSQL 14

 

안녕하세요 미나라이 입니다.

 

이번 포스팅에서는 컨트롤러와 서비스에서 공통 처리를 할 수 있는 베이스 컨트롤러와 싱글톤 패턴을 이용해서 베이스 서비스를 만드는 방법에 대해서 간단하게 작성해보려고 합니다.

 

ASP.NET에서는 서비스 대신에 Repository라는 개념을 사용하는데요

 

Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application (9 of 10)

The Contoso University sample web application demonstrates how users can create ASP.NET MVC 4 applications by using the Entity Framework 5 Code First and Visual Studio.

docs.microsoft.com

저는 위 기능을 사용하지 않고 서비스를 이용해서 개발을 진행하였습니다.

작성 배경

컨트롤러

컨트롤러로 통신을 받을 경우에 공통 처리를 하고싶을 때가 있습니다.

예를들어 통신 이력을 남긴다던지 권한 처리를 한다던지 세션처리를 한다던지

이럴 경우에 각 컨트롤러에 해당 처리를 모두 집어넣어야 하는데 공통 모듈이 있다면 한군데에만 선언해도 되겠죠?

서비스

컨트롤러에서 서비스를 호출 할 때 객체를 각각 생성하면 메모리 영역을 계속 생성해주어야 하는데 싱글톤 패턴을 이용해서 객체를 여러번 생성하지 않도록 해주었습니다.

같은 객체를 공유하게 됨으로써 글로벌 변수를 사용하는데 있어 문제가 될 여지도 있지만 서비스에서 글로벌 객체를 사용하지 않는것을 전재로 하였습니다.(만약 서비스에서 글로벌 변수를 사용해야 하는 경우가 생기면 해당 방법은 추천드리지 않습니다.)

 

싱글톤 패턴에 대해서 이해가 잘 되지 않으신 분들은 아래 링크를 참고 해 주세요

 

싱글턴 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

아키텍쳐

공통 컨트롤러

MVC의 컨트롤러를 상속받고 있습니다.

using CinemaProject.Service;
using Microsoft.AspNetCore.Mvc;
using log4net;
namespace CinemaProject.Controllers;

public class BaseController : Controller
{
    private BaseService? baseService;
    private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(BaseController));

    protected BaseController()
    {
    }

    internal T GetService<T>()
    {
        if (baseService == null) baseService = new BaseService();
        return baseService.GetService<T>();
    }
}

공통 컨트롤러를 상속받은 일반 컨트롤러

공통 컨트롤러를 상속받고 있습니다.

using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using CinemaProject.Models;
using log4net;

namespace CinemaProject.Controllers;

public class HomeController : BaseController
{
    private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(HomeController));

    public IActionResult Index()
    {
        return View();
    }
    
    public IActionResult Privacy()
    {
        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

공통 서비스

개별 서비스 객체를 글로벌 변수로 관리하고 있고 생성 및 호출을 담당합니다.

using CinemaProject.Service.Common;
using CinemaProject.Service.Home;
using CinemaProject.Service.User;
using CinemaProject.Service.Test;

namespace CinemaProject.Service;

public class BaseService
{
    private HomeService? homeService;
    private CommonService? commonService;
    private UserService? userService;
    private TestService? testService;

    public T GetService<T>()
    {
        dynamic resultService;
        
        if (typeof(T).Equals(typeof(IHomeService))) resultService = GetHomeService();
        else if (typeof(T).Equals(typeof(ICommonService))) resultService = GetCommonService();
        else if (typeof(T).Equals(typeof(IUserService))) resultService = GetUserService();
        else if (typeof(T).Equals(typeof(ITestService))) resultService = GetTestService();
        else throw new System.Exception("Service Interface Error");

        return resultService;
    }

    private IHomeService GetHomeService()
    {
        if (homeService == null) homeService = new HomeService();
        return homeService;
    }

    private ICommonService GetCommonService()
    {
        if (commonService == null) commonService = new CommonService();
        return commonService;
    }

    private IUserService GetUserService()
    {
        if (userService == null) userService = new UserService();
        return userService;
    }
    
    private ITestService GetTestService()
    {
        if (testService == null) testService = new TestService();
        return testService;
    }
}

일반 서비스(인터페이스)

namespace CinemaProject.Service.Common;
public interface ICommonService
{   
}

일반 서비스(구현부)

namespace CinemaProject.Service.Common;

public class CommonService : ICommonService
{
}

프로젝트 파일 구성

 

728x90
반응형