모든 객체는 문맥에 따른 관점이 투사되어 그 문맥 안에서만 의미 있는 이름을 갖습니다.
그런데, 특정 문맥에서 자주 나타나는 전형적인 이름들이 있습니다.
첫째로 소프트웨어 구조로 인해 명명되는 이름들입니다.
Asp.Net 코어 뿐만 아니라, 많은 웹 프레임워크 들이 채택하는 MVC 구조에서는 특정 부류의 요청을 처리하는 객체에 "***Controller"라는 이름을 붙입니다.
둘째로, UI 를 위한 프레임워크에서는 사용자와 상호 작용하는 시각적 객체를 "***Control"이라고 부릅니다. 버튼, 라벨, 텍스트 입력 등이 있습니다.
셋 째로, 프레임워크의 관점에 따른 객체가 있습니다.
닷넷에서는 의존성 주입기를 "서비스 컨테이너"라고 부릅니다. 그래서, 의존성 주입기에 의해 주입되는 객체를 "서비스"라고 부릅니다.
이 경우에는 객체의 이름에 Service라는 접미어를 잘 붙이지 않습니다.
만약, 의존성 주입기를 "디펜던시 인젝터"라고 불렀으면, 주입되는 객체를 "디펜던시"라고 불렀을 것입니다.
그런데, 서비스는 더 다양한 의미를 갖습니다.
"웹 서비스"를 줄여서 "서비스"라고 부르기도 하는데, 이 경우 보통 외부의 웹 API를 가리킵니다.
일반적인 개념으로는
첫 째, 객체의 외형에 따른 구분
객체는 보통 상태를 저장하는 필드와 행위를 담당하는 메서드로 구성됩니다.
상태를 저장하는 멤버 만으로 이뤄진 객체를 “데이터 모델” 혹은 "데이터 클래스"라고 부르고,
메서드만으로 구성된 객체를 보통 “서비스 객체” 혹은 "서비스 클래스"라고 부릅니다.
서비스 객체는 서비스 자체를 위한 상태를 포함할 수 있지만, 이를 데이터 모델의 멤버라고 보지는 않습니다.
둘 째, 핵심 임무에 관여 여부에 따른 구분입니다.
핵심 임무 실행에 필요한 간접적인 객체를 보통 서비스라고 부릅니다.
자료를 저장하는 게 핵심 임무인 프로젝트에서는 파일/DB 접근하는 임무가 핵심 임무이기 때문에 서비스가 아니지만, 뷰를 담당하는 프로젝트에서는 이 객체들이 서비스로 분류됩니다.
헬퍼는 보통 핵심 임무를 간단하게 처리해주는 혹은 기본 뼈대를 제공하는 객체를 가리킬 수 있습니다.
헬퍼의 범위는 상당히 넓습니다.
예를 들어, Asp.Net Core 프레임워크는 크게 거시적으로 보면 헬퍼입니다.
가장 협소하게는 ~~Builder, ~~~Manager 도 헬퍼입니다.
전자는 복잡한 객체의 설정을 도와주는, 후자는 특정 객체 혹은 상태를 관리해주는 도우미인 것이죠.
유틸리티는 말 그대로 도구입니다.
파일 도구, 그리기 도구 처럼 말이죠. 윈폼 프로젝트에서 폼 디자이너가 도구라고 할 수 있습니다.
유틸리티까지 정의가 필요하다면, 사실 복잡하고, 큰 규모의 프로젝트라고 할 수 있을 것입니다.
마지막으로 Core, Essential, Engine 등의 이름은 보통 도메인의 핵심 객체를 모아 놓은 프로젝트 모듈을 가리킵니다. 이러한 이름의 프로젝트가 존재한다면, 전체 솔루션이 레이어 구조를 갖도록 설계된 경우가 많습니다.
레이어드 아키텍쳐, 클린 아키텍쳐, 엔터프라이즈 아키텍쳐 등에서는 전체 솔루션을 적층적 레이어로 구성하는데, 각 레이어에는 하나 이상의 프로젝트가 존재합니다. 모든 레이어의 가장 아래, 혹은 가장 깊은 곳에 위치한 모듈을 코어 모듈, 도메인 모듈 등으로 부르는데, 보통 하나의 프로젝트입니다.
이러한 레이어 구조에서는 보통 UI를 담당하는 레이어를 가장 바깥 쪽에 두는데, C#에서는 윈폼, Asp.Net Core, WPF, Console 등의 프로젝트가 여기에 해당합니다.