디자인패턴, 프로그래밍 패러다임, 아키텍처

도메인, 어플리케이션 서비스, 엔티티

차가운에스프레소 2023. 3. 7. 17:42

1. 개요: 특정 키워드가 제목인 블로그 글의 배경

- Express에서 NestJS로 스택을 바꾼지 어느덧 몇 달이 흘렀다.

- 자유도가 높은 Express와 달리, NestJS는 자체적으로 권장하는 아키택처에 입각하여 어플리케이션을 개발하도록 유도한다.

- 이에 따라, NestJS에 익숙해지면서 자연스럽게 소프트웨어 아키텍처 지식에 대한 갈증이 생겼다.

- 여러 블로그들을 통해, 일단 필자가 개발 공부를 통해 몇 번 접해본, 또 적용해본 계층형 아키텍처/클린 아키텍처 등에 대해 공부를 해보았다.

- 하지만 역시나 "벽"에 부딪혔다. 블로그들에서 서술한 내용들 중 "도메인", "엔티티"와 같은 용어들에 대한 개념정립이 아직 모호했기 떄문이다. 부끄러운 일이다.

- 그래서 최근에는 한 키워드를 공부하면서 그것의 기반이 되는 배경 지식들까지 함께 공부하려고 노력 중이다.

- 시간이 좀 걸리고, 진도 빠지는 일이지만, 취업을 하게 된다면 필연적으로 거쳐야 될 일이었으리라 생각하고 정리하고 있다.

- 오늘의 주제는 도메인, 어플리케이션 서비스, 엔티티이다.


2. 도메인과 어플리케이션 서비스

1) 도메인

- 개발 블로그들을 읽다보면, "도메인"이란 용어를 많이 목격하게 된다.

- 도메인은 일반적으로는 'URL'이라고 생각하기 쉽고, 실제로 그렇게 쓰이지만, 개발 필드에서는 URL이란 의미보다 더 일반적으로 사용되는 의미가 있다.

바로 "소프트웨어가 해결하고자 하는 문제영역"이다.

- 쉽게 비유해서 소프트웨어가 해결하고자 하는 비즈니스와 동의어라고 생각하면 좋을 듯 하다.

- 예를 들어, 야구팀 관리 소프트웨어도메인은 팀 생성, 선수 영입, 선수 관리, 라인업 생성 등이 있을 수 있겠다.

2) 어플리케이션 서비스

- 한편, 소프트웨어의 소스코드가 모두 도메인에 대한 코드인 것은 아니다.

- 예컨대, DB와 연결해 DB와 상호작용하거나, FE<->BE 간에 요청과 응답 통신을 하는 코드들이 그런 코드들이다.

- 이런 코드들은 도메인과 구분하여 어플리케이션 서비스로 지칭한다고 한다.

- 도메인 코드가 작동 가능하게  지원하는 소프트웨어의 기반구성요소들이라고 이해하면 좋을 듯 하다.


3. 엔티티

- 엔티티는 "존재하는 것 그 자체로서 의미있는 하나의 정보 단위"를 의미하는데, 프로그래밍에서 정말 다양한 맥락적 의미를 가진다.

- 엔티티가 프로그래밍에서 맥락에 따라 다양한 의미로 사용되는 이유는 엔티티의 사전적 어원이 "존재하는 것 그 자체"이기 때문에, 다른 것과 구별되는 그 무언가를 지칭하는 데 일반적으로 활용되기 떄문인 것 같다.

- 엔티티가 가지는 의미에 대한 예시는 다음과 같다.

데이터베이스의 맥락
- 엔티티는 다른 사물과 구별지을 수 있는 어떤 특정 관련성으로 묶일 수 있는 집합을 의미한다.
- 엔티티는 실용적으로 1) 데이터베이스의 테이블, 2) ORM의 맥락에서는 데이터베이스 테이블과 매핑되는 객체라고 생각하면 편하다.

아키텍처의 맥락
- 엔티티는 도메인 엔티티와 영속성 엔티티로 구분될 수 있다.
1) 도메인 엔티티: 다른 도메인과 구별되는 도메인/비즈니스 로직을 포함하고 있는 어떤 것
2) 영속성 엔티티: 데이터베이스 맥락의 엔티티와 동일, 데이터베이스 테이블과 매핑되는 객체  

- 요컨대, 엔티티라는 용어는 사전적인 어원 "다른 사물과 구별되어 존재하는 어떤 것, 하나의 정보 단위"에 초점을 두어 맥락에 따라 의미를 이해하는 것이 중요한 것 같다.


 4. 이 개념들에 대한 이해가 중요한 이유

- 소프트웨어 아키텍처의 가장 근본적인 관심사는 "계층 간의 관심사 분리"이기 떄문이다.

- 위 용어들에 대한 이해가 수반되어야, 클린 아키텍처, 계층형 아키텍처에 대해 이해하기 순조롭다. 


5. 참고자료

- https://linuxism.ustd.ip.or.kr/m/45

 

객체(Object)와 개체(Entity)

객체(Object) 객체지향 프로그래밍에서 객체는, 프로그램 설계 단계에서 최초로 생각해야 할 것으로서, 결국 프로세스에서 유도된 코드 단위들이다. 중간에, 각 객체는 일반화된 객체 클래스로 만

linuxism.ustd.ip.or.kr

- https://velog.io/@eddy_song/domain-logic

 

비즈니스 로직, 도메인 로직이 도대체 뭐지?

🙄 내 앱은 아직 비즈니스가 아닌데요...?

velog.io

- https://velog.io/@yeahg_dev/Domain%EA%B3%BC-Entity%EC%9D%98-%EA%B0%9C%EB%85%90

 

Domain과 Entity의 개념

Domain, Entity + layered architecture에 대해 공부해보자미~

velog.io