[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라는 개념을 사용하는데요
저는 위 기능을 사용하지 않고 서비스를 이용해서 개발을 진행하였습니다.
작성 배경
컨트롤러
컨트롤러로 통신을 받을 경우에 공통 처리를 하고싶을 때가 있습니다.
예를들어 통신 이력을 남긴다던지 권한 처리를 한다던지 세션처리를 한다던지
이럴 경우에 각 컨트롤러에 해당 처리를 모두 집어넣어야 하는데 공통 모듈이 있다면 한군데에만 선언해도 되겠죠?
서비스
컨트롤러에서 서비스를 호출 할 때 객체를 각각 생성하면 메모리 영역을 계속 생성해주어야 하는데 싱글톤 패턴을 이용해서 객체를 여러번 생성하지 않도록 해주었습니다.
같은 객체를 공유하게 됨으로써 글로벌 변수를 사용하는데 있어 문제가 될 여지도 있지만 서비스에서 글로벌 객체를 사용하지 않는것을 전재로 하였습니다.(만약 서비스에서 글로벌 변수를 사용해야 하는 경우가 생기면 해당 방법은 추천드리지 않습니다.)
싱글톤 패턴에 대해서 이해가 잘 되지 않으신 분들은 아래 링크를 참고 해 주세요
아키텍쳐
공통 컨트롤러
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
{
}
프로젝트 파일 구성
'ASP.NET&C# > ASP.NET MVC' 카테고리의 다른 글
[ASP.NET CORE/MVC] 홈페이지 제작 #3 파일 읽기로 간단하게 init파일 모듈 만들기(프로퍼티 파일) (0) | 2022.08.13 |
---|---|
[ASP.NET CORE/MVC] 홈페이지 제작 #2 Log4net설정하기 (0) | 2022.07.24 |
[ASP.NET CORE/MVC] 홈페이지 제작 #1 개발 환경 구축 (0) | 2022.07.24 |
[ASP.NET/MVC CORE] #15 세션으로 로그인 페이지를 구현 (0) | 2021.12.26 |
[ASP.NET/MVC CORE] #14 MIME 맵핑하기 (0) | 2021.12.21 |