Skip to content

Commit

Permalink
Fetch. new blog posts
Browse files Browse the repository at this point in the history
  • Loading branch information
singhic committed Nov 17, 2024
1 parent 47a3172 commit d5e74ab
Show file tree
Hide file tree
Showing 9 changed files with 736 additions and 706 deletions.
92 changes: 69 additions & 23 deletions blog/puleugo/puleugo1.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,85 @@
---
authors: puleugo
date: Sun, 11 Aug 2024 12:00:07 +0900
date: Mon, 12 Aug 2024 12:00:24 +0900
---

# 티스토리에 마진 넣는법
# [번역] 방금 당신이 작성한 코드는 도메인 로직인가? | What is domain logic?

## 서론

티스토리는 기본적으로 css에 포함된 마진을 무시합니다. 그래서 대부분의 블로거들이 줄바꿈을 광클떄려놔서 가독성이 떨어집니다.
본 글에서는 마진 제거 css인 tt\_article\_useless\_p\_margin 속성을 제거하려고합니다.
* 원문: [What is domain logic?](https://enterprisecraftsmanship.com/posts/what-is-domain-logic/) | Vladimir Khorikov

## 문제 분석
## 도메인 로직 vs 비즈니스 로직?

대충 네트워크 및 동작 흐름 보면 이렇습니다.
우리는 코드를 작성하기 전에 두가지를 생각합니다. **<u>해결하고자 하는 문제</u>와 <u>해결 방안</u>입니다.**

1. 게시글 API 호출 (text/html)
2. useLessPMargin.css API 호출
3. tistory에서 보내줄 html과 css를 로드 완료
4. CSSOM 마운트
5. DOM 마운트
여기서 <u>실생활에서 해결하고자 하는 문제</u>가 바로 **도메인**(a.k.a. Problem Domain, Core Domain)이며 <u>해결방안</u>을 **비즈니스 로직**(a.k.a. Domain Logic, Business Rule, Domain Knowledge)이라고 부릅니다.

## 방법
알고보면 쉽지만 찾아보지 않으면 대화조차 안되는 내용이라 학생 입장에는 슬프다.

jQeury를 사용하여 DOM 마운트 시 CSSOM을 통해 최종적으로 추가된 tt\_article\_useless\_p\_margin 클래스를 제거하였습니다.
![](https://blog.kakaocdn.net/dn/C9mmK/btsI0AKKIUq/K9lQ86u7WQek7vMJkP0Hk1/img.png)

https://enterprisecraftsmanship.com/posts/what-is-domain-logic/

결론은 **도메인 로직과 비즈니스 로직은 동의어**이며 위와 같은 의미라는 것만 알면 된다.

## 도메인 로직

하지만 문제 해결방안(이후 도메인로직)만이 코드에 있으면 너무 좋겠지만 우리들의 코드는 그렇지 않습니다. 예를 들면:

* DB 로직: DB에 도메인 모델을 저장
* 3rd Party API 로직: 외부 서비스를 사용
* UI 로직: UI를 통해 사용자와 상호작용 하는 코드

위 같이 도메인로직이라고 부르기에는 애매모호한 코드도 있을 것입니다. 특히 Transaction Script 아키텍처 패턴을 사용하는 경우에는 더욱 그럴겁니다. *(도메인 모델에게 행위를 안주고 서비스가 전부 처리하는 패턴, DB로직이랑 도메인 로직이 짬뽕된다.) Transaction Script가 단순한 코드에서는 가독성이 좋을지 몰라요.*

그런데 **도메인이 복잡해질 수록 코드 가독성은 떨어지게 돼요.** 더 자주 들어본 안티패턴으로는 [빈약한 도메인 모델](https://martinfowler.com/bliki/AnemicDomainModel.html)이 있어요. 도메인 로직과 이외의 로직을 구분한다면 도메인 모델을 추출하여 코드에서 명확하게 관심사를 분리할 수 있게 돼요. 그렇게되면 DB나 UI같은 세부 사항에 주의를 기울이지 않아도 어떤 도메인을 처리하고자 추론하는 데 필요한 인지적 부하를 줄일 수 있습니다.

그러면 애플리케이션 서비스 예제에서 도메인 로직을 추출해봅시다. **도메인 로직의** **특징**은 <u>비즈니스적인 의미가 있는 결정을 내리는지 여부</u>로 알 수 있습니다. **도메인 모델**은 <u>비즈니스에 중요한 결정</u>을 하고 **그 외의 모든 코드**들은 <u>도메인 모델이 결정을 따라 어떤 작업을 수행</u>하거나 <u>도메인 모델의 결정을 위한 정보를 제공</u>해주는 것에 불과합니다.

## 애플리케이션 서비스 로직에서 도메인 로직 분리하기

### 첫번째 예시: 계좌에서 현금 인출

```
<body>
<!-- ... 기존 블로그 코드 -->
<!-- jQuery 설치 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- 지들 멋대로 margin 삭제해버리는 css 제거 -->
<script type="text/javascript">
$("div").removeClass("tt_article_useless_p_margin")
</script>
</body>
// Application Service
private TakeMoney(amount: number): void {
if(!this.atm.canTakeMoney) {
throw AtmHasNotEnoughMoney('인출 불가');
}
// 수수료 포함 금액
const amountWithComission = this.atm.calculateAmountWithComission(amount);
this.paymentGateway.chargePayment(amountWithComission);
this.atm.takeMoney(amount);
this.repository.save(this.atm);
}
```

위 방식은 애플리케이션 서비스 계층의 일부 코드입니다. 도메인 클래스 Atm이 <u>부과할 금액을 결정</u>하고 .canTakeMoney(), .calculateAmountWithComission()를 통해 <u>결정을 위한 정보를 제공</u>받습니다.

이후 애플리케이션 서비스는 그 결정을 듣고 수행하기만 합니다. paymentGatway 인스턴스를 사용하여 금액을 청구하고 데이터베이스를 업데이트합니다.

### 두번째 예시: 메세지 응답

```
private chatMessageReceived(message: string) {
const event AuctionEvent = AuctionEvent.from(message);
const command: AuctionCommand = this.auctionSniper.process(event);
if (command != AuctionCommand.None()) {
this.chat.sendMessage(command.toString());
}
}
```

이 메서드는 애플리케이션 서비스 계층의 일부이기도 합니다. 여기서 실질적인 도메인 객체는 AuctionSniper입니다. **앱 서비스가 하는 일**은 <u>외부 세계로부터 오는 메세지를 의사 결정자가 이해할 수 있는 형식(AuctionEvent)으로 변환</u>하고 해당 메세지를 전달하고 <u>도메인 클래스의 결정에 따라 처리</u>하는 것입니다.

위 두가지 코드 샘플 중 어느 것도 스스로 결정을 내리지 않으며, 둘 다 도메인 모델에 위임합니다. 이것이 바로 적절한 관심사의 분리의 모습니다. 애플리케이션 서비스 계층은 상당히 많은 코드를 포함할 수 있지만 그 중 어느것도 비즈니스에 중요한 결정을 내리는 것과는 관련이 없어야합니다. **결정을 내릴 수 있는 유일한 객체는 도메인 모델입니다.**

도메인 로직을 추출했다면 다음으로 해야할 작업은 다른 모든 유형의 로직이 적절히 분리되어있는지 확인하는 것입니다. (DB 로직 등)

## 요약

* 도메인 로직(비즈니스 로직, 비즈니스 규칙, 도메인 지식과 동의어)은 비즈니스에 중요한 결정을 내리는 로직이다.
* 다른 모든 유형의 논리(DB, UI, 애플리케이션 로직 등)는 도메인 모델에서 내린 결정을 처리하고, 데이터를 저장하거나, 사용자에게 보여주거나, 외부 서비스에 전달하는 작업을 처리합니다.
* 도메인 로직을 다른 로직과 분리하는 것은 중요하며, 전반적인 코드 베이스를 더 간당하게 유지하는 데에 도움이 됩니다.

Loading

0 comments on commit d5e74ab

Please sign in to comment.