From fffd7adeb743ad2887acd24a96b76d38a89e75bf Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 13:11:00 +0900
Subject: [PATCH 01/16] =?UTF-8?q?docs(tech):=20=EA=B0=9D=EC=B2=B4=EC=A7=80?=
=?UTF-8?q?=ED=96=A5=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8?=
=?UTF-8?q?=EC=9B=90=EC=B9=99=20=EB=8F=85=EC=84=9C=20=ED=9B=84=EA=B8=B0=20?=
=?UTF-8?q?=EC=9E=91=EC=84=B1=20=EC=8B=9C=EC=9E=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...20\354\235\270\354\233\220\354\271\231.md" | 132 ++++++++++++++++++
1 file changed, 132 insertions(+)
create mode 100644 "apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
new file mode 100644
index 00000000..4dd17823
--- /dev/null
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -0,0 +1,132 @@
+---
+slug: 객체지향-시스템-디자인-원칙
+title: 객체지향 시스템 디자인 원칙 (Simple Object Oriented Design)
+date: 2025-09-14
+authors: [99mini]
+tags: [독서, 객체지향]
+---
+
+[독서] 객체지향 시스템 디자인 원칙 (Simple Object Oriented Design) - 마우리시오 아니체 지음
+
+[교보문고](https://product.kyobobook.co.kr/detail/S000216884277)
+
+
+
+## 서문
+
+프론트엔드 개발자로 공부를 하면서 객체지향 프로그래밍을 적용하여 유자보수와 확장성을 높이는 방법을 고민하게 되었다.
+이 책은 백엔드를 기반으로 하여 (예제 코드가 Java 기반의 pseudo code로 작성되어 있음) 객체지향 시스템 디자인 원칙을 설명하고 있지만, 프론트엔드 개발자에게도 많은 도움이 될 것이라 생각되어 읽게 되었다.
+
+## 책 소개
+
+명확하고 간결한 객체지향 시스템 디자인 원칙을 제시하는 책이다. 6가지 원칙을 통해 유지보수성과 확장성을 높이는 방법을 예제와 함께 설명한다.
+
+- 코드를 작게 유지하는 방법
+- 객체의 일관성을 유지하는 방법
+- 의존성을 적절하게 관리하는 방법
+- 추상화를 이해하고 잘 디자인하는 방법
+- 인프라를 올바르게 처리하고 다루는 방법
+- 잘 모듈화된 디자인을 달성하는 방법
+
+위 6가지 원칙의 세부내용 중 일부 원칙을 요약하며 프론트엔드 개발에 어떻게 적용할 수 있을지 고민해보았다.
+
+## 주요 내용
+
+### 1. 코드를 작게 유지하라
+
+#### 코드를 작은 단위로 나누지 말아야 할 때
+
+> - 둘 이상의 퍼즐 조각이 독립적으로 존재할 수 없을 때. 강제로 분리하면 메서드 시그니처가 복잡해질 수 있다.
+> - 퍼즐 코드 조각이 교체될 가능성이 낮을 때.
+> - 해당 조각만 완전히 따로 떼어 테스트(단위 테스트)할 만한 가치가 없을 때.
+
+코드를 작은 단위로 나누는 것은 유지보수성과 확장성을 높이는 데 도움이 되지만, 지나치게 작은 단위로 나누면 오히려 복잡성을 증가시킬 수 있다. 따라서 코드의 응집도를 고려하여 적절한 크기로 유지하는 것이 중요하다.
+
+---
+
+객체지향, 함수형 프로그래밍 등 다양한 패러다임을 실무에 적용하면서 처음부터 기능을 작은 단위로 나누거나 리펙토링 과정에서 기능을 작은 단위로 분리하는 경우가 많다.
+그러나 작은 단위로 나누는 것이 항상 좋은 것은 아니다. 작은 단위로 나누면 코드의 응집도가 떨어지고, 오히려 복잡성이 증가할 수 있다.
+
+```jsx title="react에서 작은 단위로 나누는 경우"
+// 작은 단위로 나누는 경우
+function UserProfile({ user }) {
+ return (
+
;
+}
+```
+
+위 예제는 UserProfile 컴포넌트를 작은 단위로 나눈 경우이다. 각 컴포넌트가 독립적으로 존재할 수 없고, 교체될 가능성이 낮으며, 단위 테스트할 만한 가치가 없다. 따라서 UserProfile 컴포넌트를 하나의 컴포넌트로 유지하는 것이 더 나을 수 있다.
+
+```jsx title="react에서 작은 단위로 나누지 않는 경우"
+// 작은 단위로 나누지 않는 경우
+function UserProfile({ user }) {
+ return (
+
+
+
{user.name}
+
{user.bio}
+
+ );
+}
+```
+
+그렇다면 언제 작은 단위로 나누는 것이 좋을까?
+
+- 둘 이상의 퍼즐 조각이 독립적으로 존재할 수 있을 때.
+ - UserAvatar 컴포넌트가 다른 곳에서도 재사용될 수 있다면 작은 단위로 나누는 것이 좋다.
+- 퍼즐 코드 조각이 교체될 가능성이 높을 때.
+ - UserAvatar 컴포넌트가 다른 디자인으로 교체될 가능성이 있다면 작은 단위로 나누는 것이 좋다.
+- 해당 조각만 완전히 따로 떼어 테스트(단위 테스트)할 만한 가치가 있을 때.
+ - UserAvatar 컴포넌트가 복잡한 로직을 가지고 있고, 단위 테스트할 필요가 있다면 작은 단위로 나누는 것이 좋다.
+
+```jsx title="react에서 작은 단위로 나누는 경우 (적절한 경우)"
+// 작은 단위로 나누는 경우 (적절한 경우)
+function UserProfile({ user }) {
+ return (
+
+
+
+
+
+
+ );
+}
+function UserAvatar({ avatar }) {
+ const avatarUrl = getAvatarUrl(avatar); // 복잡한 로직
+ const handleAvatarClick = () => {
+ // 단위 테스트할 필요가 있는 로직
+ console.log('Avatar clicked');
+ };
+
+ return (
+
+
+
+
+ );
+}
+```
+
+### 2. 객체의 일관성을 유지하라
+
+#### 항상 일관성을 유지하라
+
+> - 클래스가 스스로 일관성을 책임지게 하라
+> - 전체 작업과 복잡한 일관성 검사를 캡슐화하라
From 505047b16ef6e1e0045e78b9fc7f08221680b725 Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 13:21:39 +0900
Subject: [PATCH 02/16] =?UTF-8?q?docs(blog):=20=EA=B0=9D=EC=B2=B4=20?=
=?UTF-8?q?=EC=9D=BC=EA=B4=80=EC=84=B1=20=EC=9C=A0=EC=A7=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...20\354\235\270\354\233\220\354\271\231.md" | 182 +++++++++++++++++-
1 file changed, 176 insertions(+), 6 deletions(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index 4dd17823..3a69fed6 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -30,11 +30,9 @@ tags: [독서, 객체지향]
위 6가지 원칙의 세부내용 중 일부 원칙을 요약하며 프론트엔드 개발에 어떻게 적용할 수 있을지 고민해보았다.
-## 주요 내용
+## 1. 코드를 작게 유지하라
-### 1. 코드를 작게 유지하라
-
-#### 코드를 작은 단위로 나누지 말아야 할 때
+### 코드를 작은 단위로 나누지 말아야 할 때
> - 둘 이상의 퍼즐 조각이 독립적으로 존재할 수 없을 때. 강제로 분리하면 메서드 시그니처가 복잡해질 수 있다.
> - 퍼즐 코드 조각이 교체될 가능성이 낮을 때.
@@ -124,9 +122,181 @@ function UserAvatar({ avatar }) {
}
```
-### 2. 객체의 일관성을 유지하라
+## 2. 객체의 일관성을 유지하라
-#### 항상 일관성을 유지하라
+### 항상 일관성을 유지하라
> - 클래스가 스스로 일관성을 책임지게 하라
> - 전체 작업과 복잡한 일관성 검사를 캡슐화하라
+
+객체의 상태가 일관성을 유지하도록 하는 것은 매우 중요하다. 객체가 일관성을 유지하지 않으면, 예기치 않은 동작이 발생할 수 있다. 따라서 객체는 스스로 일관성을 책임지도록 설계해야 한다.
+
+클리이언트는 절대 일관성 검사를 책임지지 말아야 하며, 기본적으로 클래스가 일관성을 관리해야 한다. 만약 클랙스에 들어가기에 검사가 너무 복잡하다면, 전체 작업을 서비스 클래스로 이동시키고 클라이언트가 원하는 동작을 위해 그 서비스 클래스를 사용해야 한다. [P.69]
+
+---
+
+```jsx title="잘못된 예시 - 클라이언트가 일관성 검사를 담당"
+// ❌ 잘못된 예시 - 클라이언트가 일관성을 책임짐
+function ShoppingCart() {
+ const [items, setItems] = useState([]);
+ const [total, setTotal] = useState(0);
+
+ const addItem = (item) => {
+ // 클라이언트가 일관성 검사를 담당
+ if (item.price <= 0) {
+ throw new Error('가격은 0보다 커야 합니다');
+ }
+ if (!item.name || item.name.trim() === '') {
+ throw new Error('상품명은 필수입니다');
+ }
+
+ setItems([...items, item]);
+ // 클라이언트가 total 계산도 담당
+ setTotal(total + item.price);
+ };
+
+ return (
+
+ );
+}
+
+function CartSummary({ items, total }: { items: CartItem[]; total: number }) {
+ return (
+
+
장바구니
+
+ {items.map((item, index) => (
+
+ {item.name} - {item.quantity} x {item.price}
+
+ ))}
+
+
총합: {total}
+
+ );
+}
+// ProductList 컴포넌트는 ShoppingCart에 느슨하게 결합됨
+```
From 3f8be0b0f647f63164c5c903146adde5613d2709 Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 14:59:09 +0900
Subject: [PATCH 07/16] =?UTF-8?q?docs(tech):=20=EC=A0=95=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...20\354\235\270\354\233\220\354\271\231.md" | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index 0e5da251..b93fcfa5 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -1625,3 +1625,23 @@ function CartSummary({ items, total }: { items: CartItem[]; total: number }) {
}
// ProductList 컴포넌트는 ShoppingCart에 느슨하게 결합됨
```
+
+## 정리
+
+- **작게 나누기의 기준**은 재사용성·교체 가능성·독립 테스트 가치다. 기준을 충족하지 못하면 과분할을 피한다.
+- **일관성은 객체/도메인이 책임**지고, UI는 의도만 전달한다(불변성·검증·캡슐화).
+- **의존성은 인터페이스와 DI로 주입**하여 유연성과 테스트 용이성을 높인다(하드코딩 금지).
+- **추상화 신호**(반복 수정, 비대한 컴포넌트, if 분기 증가)가 보이면 훅/HOC/도메인 서비스로 **관심사 분리**를 한다.
+- **인프라 코드는 얇게** 만들고 도메인과 **명확히 분리**한다(Repository/Storage/Analytics 등 경계).
+- **모듈화**는 이벤트/상태 관리로 **느슨한 결합**을 달성한다(콜백 의존 최소화).
+
+### 프론트엔드 적용 체크리스트
+
+- [ ] 분리 전, 해당 조각이 재사용/교체/단위 테스트 가치가 있는가?
+- [ ] 도메인 규칙이 컴포넌트가 아닌 서비스/훅에서 보장되는가?
+- [ ] fetch/logger 등 외부 의존성을 DI/Context로 주입했는가?
+- [ ] 로딩·에러·권한 체크 로직을 추상화/공통화했는가?
+- [ ] API·스토리지·분석은 얇은 어댑터로 분리했는가?
+- [ ] 컴포넌트 간 통신을 이벤트/상태로 처리해 결합을 낮췄는가?
+- [ ] 불변성과 타입 안전성(제네릭/인터페이스)을 유지하는가?
+- [ ] 테스트에서 의존성을 손쉽게 대체(모킹)할 수 있는가?
From 147914dc3e79f1cff1172ff1eb51dfd1f547ce47 Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 15:06:07 +0900
Subject: [PATCH 08/16] chore: release v0.4.0
---
apps/frontend/tech/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/frontend/tech/package.json b/apps/frontend/tech/package.json
index 1ad0a684..609a0c49 100644
--- a/apps/frontend/tech/package.json
+++ b/apps/frontend/tech/package.json
@@ -1,6 +1,6 @@
{
"name": "tech",
- "version": "0.3.1",
+ "version": "0.4.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
From f870ce849b17559bd6970afbe9b5e6f93dddc598 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:10:30 +0900
Subject: [PATCH 09/16] =?UTF-8?q?fix:=20=EC=98=A4=ED=83=88=EC=9E=90=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index b93fcfa5..1b1252d5 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -14,7 +14,7 @@ tags: [독서, 객체지향]
## 서문
-프론트엔드 개발자로 공부를 하면서 객체지향 프로그래밍을 적용하여 유자보수와 확장성을 높이는 방법을 고민하게 되었다.
+프론트엔드 개발자로 공부를 하면서 객체지향 프로그래밍을 적용하여 유지보수와 확장성을 높이는 방법을 고민하게 되었다.
이 책은 백엔드를 기반으로 하여 (예제 코드가 Java 기반의 pseudo code로 작성되어 있음) 객체지향 시스템 디자인 원칙을 설명하고 있지만, 프론트엔드 개발자에게도 많은 도움이 될 것이라 생각되어 읽게 되었다.
## 책 소개
From a6e32d1cb58d5e88bc7c81f252ae2999be76bfb4 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:10:48 +0900
Subject: [PATCH 10/16] =?UTF-8?q?fix:=20Update=20apps/frontend/tech/blog/2?=
=?UTF-8?q?025-09-14-=EB=8F=85=EC=84=9C-=EA=B0=9D=EC=B2=B4=EC=A7=80?=
=?UTF-8?q?=ED=96=A5=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8?=
=?UTF-8?q?=EC=9B=90=EC=B9=99.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...24\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index 1b1252d5..dda2c462 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -580,12 +580,12 @@ function UserProfile({ userId }: { userId: string }) {
> - 같은 클래스를 계속 반복적으로 수정하고 있는가?
> - 클래스가 계속 커지고 있는가?
> - 변화를 구현하기 위해 if 문을 계속 사용하는가?
-> - 기존 비지니스 규칙을 시스템의 다른 부분에 결합시키는 과정이 어거지로 이어붙이는 것 같은가?
+> - 기존 비즈니스 규칙을 시스템의 다른 부분에 결합시키는 과정이 억지로 이어붙이는 것 같은가?
>
> [P.136]
리액트 컴포넌트에서 반복적으로 사용되며 하나의 컴포넌트가 비대해지는 사례를 많이 만나볼 수 있다.
-이 경우 추상화를 통해서 컴포넌트를 분리하거나 비지니스 로직을 커스텀 훅으로 분리하는 방법을 사용할 수 있다.
+이 경우 추상화를 통해서 컴포넌트를 분리하거나 비즈니스 로직을 커스텀 훅으로 분리하는 방법을 사용할 수 있다.
혹은 BaseComponent를 만들어 공통된 로직을 처리하고, HOC(고차 컴포넌트)를 활용하여 추상화 할 수도 있다.
---
From a3f36a94ca48af4153747d989566297324f8f410 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:10:58 +0900
Subject: [PATCH 11/16] =?UTF-8?q?Update=20apps/frontend/tech/blog/2025-09-?=
=?UTF-8?q?14-=EB=8F=85=EC=84=9C-=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5?=
=?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8=EC=9B=90?=
=?UTF-8?q?=EC=B9=99.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index dda2c462..5728b847 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -131,7 +131,7 @@ function UserAvatar({ avatar }) {
객체의 상태가 일관성을 유지하도록 하는 것은 매우 중요하다. 객체가 일관성을 유지하지 않으면, 예기치 않은 동작이 발생할 수 있다. 따라서 객체는 스스로 일관성을 책임지도록 설계해야 한다.
-클리이언트는 절대 일관성 검사를 책임지지 말아야 하며, 기본적으로 클래스가 일관성을 관리해야 한다. 만약 클랙스에 들어가기에 검사가 너무 복잡하다면, 전체 작업을 서비스 클래스로 이동시키고 클라이언트가 원하는 동작을 위해 그 서비스 클래스를 사용해야 한다. [P.69]
+클라이언트는 절대 일관성 검사를 책임지지 말아야 하며, 기본적으로 클래스가 일관성을 관리해야 한다. 만약 클래스에 들어가기에 검사가 너무 복잡하다면, 전체 작업을 서비스 클래스로 이동시키고 클라이언트가 원하는 동작을 위해 그 서비스 클래스를 사용해야 한다. [P.69]
---
From bd6b3f16d4fa7344496e282d959e2f2dc29ce1b7 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:11:06 +0900
Subject: [PATCH 12/16] =?UTF-8?q?Update=20apps/frontend/tech/blog/2025-09-?=
=?UTF-8?q?14-=EB=8F=85=EC=84=9C-=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5?=
=?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8=EC=9B=90?=
=?UTF-8?q?=EC=B9=99.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index 5728b847..03de15c8 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -586,7 +586,7 @@ function UserProfile({ userId }: { userId: string }) {
리액트 컴포넌트에서 반복적으로 사용되며 하나의 컴포넌트가 비대해지는 사례를 많이 만나볼 수 있다.
이 경우 추상화를 통해서 컴포넌트를 분리하거나 비즈니스 로직을 커스텀 훅으로 분리하는 방법을 사용할 수 있다.
-혹은 BaseComponent를 만들어 공통된 로직을 처리하고, HOC(고차 컴포넌트)를 활용하여 추상화 할 수도 있다.
+혹은 BaseComponent를 만들어 공통된 로직을 처리하고, HOC(고차 컴포넌트)를 활용하여 추상화할 수도 있다.
---
From 9d4118fea00dc9ec35bb976f34ab697a11dfcda7 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:11:18 +0900
Subject: [PATCH 13/16] =?UTF-8?q?Update=20apps/frontend/tech/blog/2025-09-?=
=?UTF-8?q?14-=EB=8F=85=EC=84=9C-=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5?=
=?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8=EC=9B=90?=
=?UTF-8?q?=EC=B9=99.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index 03de15c8..a02788dc 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -1354,7 +1354,7 @@ function OrderForm() {
### 모듈을 분리하는 방법으로 이벤트를 고려하라
-> 최근 이벤트 기반 아키텍처는 모듈과 서비스를 분리하는 놀라운 방법을 제공하여 인기을 얻고 있다. 이 아이디어는 모듈들이 후출을 통해 결합되는 대신, 무슨 일이 발생했는지 알라니는 이벤트를 발행하고, 관심 있는 모듈이 그 이벤트 스트림을 구독하는 것이다.
+> 최근 이벤트 기반 아키텍처는 모듈과 서비스를 분리하는 놀라운 방법을 제공하여 인기을 얻고 있다. 이 아이디어는 모듈들이 호출을 통해 결합되는 대신, 무슨 일이 발생했는지 알리는 이벤트를 발행하고, 관심 있는 모듈이 그 이벤트 스트림을 구독하는 것이다.
>
> [P.176]
From 612f27e8560fa5d465ebdebf51c210d6a49769f7 Mon Sep 17 00:00:00 2001
From: 99mini <43674669+99mini@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:11:29 +0900
Subject: [PATCH 14/16] =?UTF-8?q?Update=20apps/frontend/tech/blog/2025-09-?=
=?UTF-8?q?14-=EB=8F=85=EC=84=9C-=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5?=
=?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=EB=94=94=EC=9E=90=EC=9D=B8=EC=9B=90?=
=?UTF-8?q?=EC=B9=99.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
...\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index a02788dc..fa339ba9 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -1358,7 +1358,7 @@ function OrderForm() {
>
> [P.176]
-이벤트 기반 아키텍쳐를 프론트엔드에 적용 하는 방법은 여러가지가 있다.
+이벤트 기반 아키텍처를 프론트엔드에 적용하는 방법은 여러가지가 있다.
- 이벤트 버스를 만들어서 컴포넌트 간에 이벤트를 발행하고 구독
- 상태 관리 라이브러리(Redux, Recoil, Zustand 등)의 구독 기능 활용
From 06cecf17514295f54da2333a57477cbf2a84afcf Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 15:15:19 +0900
Subject: [PATCH 15/16] =?UTF-8?q?fix:=20=EC=98=A4=ED=83=88=EC=9E=90=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\224\354\236\220\354\235\270\354\233\220\354\271\231.md" | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md" "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
index fa339ba9..0ccd5ddf 100644
--- "a/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
+++ "b/apps/frontend/tech/blog/2025-09-14-\353\217\205\354\204\234-\352\260\235\354\262\264\354\247\200\355\226\245\354\213\234\354\212\244\355\205\234\353\224\224\354\236\220\354\235\270\354\233\220\354\271\231.md"
@@ -968,11 +968,11 @@ const UserProfile = withProtectedAsyncData(UserProfileComponent, {
### 도메인 코드와 인프라를 분리하라
-> 인프라를 다루는 코드는 도메인 코드와 분리해야 한다. 이런 클래스는 가능한 얇게 작성해야 하며, 비지니스 로직을 포함해서는 안 된다. 이렇게 분리하면 디자인이 깔끔하고 진화하기 쉬우며, 테스트를 쉽게 할 수 있다.
+> 인프라를 다루는 코드는 도메인 코드와 분리해야 한다. 이런 클래스는 가능한 얇게 작성해야 하며, 비즈니스 로직을 포함해서는 안 된다. 이렇게 분리하면 디자인이 깔끔하고 진화하기 쉬우며, 테스트를 쉽게 할 수 있다.
>
> [P.141]
-비지니스 로직이 포함된 클래스 안에 인프라를 다루는 코드를 작성하지 마라. [P.141]
+비즈니스 로직이 포함된 클래스 안에 인프라를 다루는 코드를 작성하지 마라. [P.141]
```tsx title="잘못된 예시 - 도메인 로직과 인프라 코드가 섞임"
// ❌ 잘못된 예시 - 비즈니스 로직과 인프라 코드가 한 곳에
@@ -1354,7 +1354,7 @@ function OrderForm() {
### 모듈을 분리하는 방법으로 이벤트를 고려하라
-> 최근 이벤트 기반 아키텍처는 모듈과 서비스를 분리하는 놀라운 방법을 제공하여 인기을 얻고 있다. 이 아이디어는 모듈들이 호출을 통해 결합되는 대신, 무슨 일이 발생했는지 알리는 이벤트를 발행하고, 관심 있는 모듈이 그 이벤트 스트림을 구독하는 것이다.
+> 최근 이벤트 기반 아키텍처는 모듈과 서비스를 분리하는 놀라운 방법을 제공하여 인기를 얻고 있다. 이 아이디어는 모듈들이 호출을 통해 결합되는 대신, 무슨 일이 발생했는지 알리는 이벤트를 발행하고, 관심 있는 모듈이 그 이벤트 스트림을 구독하는 것이다.
>
> [P.176]
From a47e3b707d30a696ff49f989b86b70458b4ba590 Mon Sep 17 00:00:00 2001
From: ym-mac <0mini9939@gmail.com>
Date: Sun, 14 Sep 2025 15:24:53 +0900
Subject: [PATCH 16/16] fix: broken anchor
---
apps/frontend/tech/blog/tags.yml | 15 +++++++++++++++
apps/frontend/tech/docs/reactjs/virtual-dom.md | 2 +-
.../RESTful.md" | 2 +-
.../IPC.md" | 2 +-
4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/apps/frontend/tech/blog/tags.yml b/apps/frontend/tech/blog/tags.yml
index f04d0771..c9defc4b 100644
--- a/apps/frontend/tech/blog/tags.yml
+++ b/apps/frontend/tech/blog/tags.yml
@@ -97,3 +97,18 @@ ui-ux:
label: 구현
permalink: /구현
description: 구현
+
+독서:
+ label: 독서
+ permalink: /독서
+ description: 기술 서적 독서
+
+객체지향:
+ label: 객체지향
+ permalink: /객체지향
+ description: 객체지향 프로그래밍
+
+oop:
+ label: OOP
+ permalink: /oop
+ description: 객체지향 프로그래밍
diff --git a/apps/frontend/tech/docs/reactjs/virtual-dom.md b/apps/frontend/tech/docs/reactjs/virtual-dom.md
index b9be741b..fef316e4 100644
--- a/apps/frontend/tech/docs/reactjs/virtual-dom.md
+++ b/apps/frontend/tech/docs/reactjs/virtual-dom.md
@@ -20,7 +20,7 @@ DOM 문서는 논리적으로 트리 형태를 가지며 각 노드는 객체를
## Virtual DOM이란?
Virtual DOM(가상 DOM)은 UI 업데이트의 효율성을 극대화하기 위해 실제 DOM(Document Object Model)의 가벼운 복사본을 메모리 상에서 유지 관리하는 기술입니다. DOM 조작이 느린 브라우저 환경에서 성능을 개선하는 데 중요한 역할을 수행합니다. [[2]](#react와-춤을)
-UI의 이상적인 또는 **“가상”** 적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 **“실제”** DOM과 동기화하는 프로그래밍 개념입니다. 이 과정을 *재조정*이라고 합니다. [[3]](#react공식문서-virtual-dom과-internals)
+UI의 이상적인 또는 **“가상”** 적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 **“실제”** DOM과 동기화하는 프로그래밍 개념입니다. 이 과정을 *재조정*이라고 합니다. [[3]](#react-공식-문서---virtual-dom과-internals)
## Virtual DOM의 동작 방식
diff --git "a/apps/frontend/tech/docs/\353\204\244\355\212\270\354\233\214\355\201\254/RESTful.md" "b/apps/frontend/tech/docs/\353\204\244\355\212\270\354\233\214\355\201\254/RESTful.md"
index 59a52f67..5f007f1f 100644
--- "a/apps/frontend/tech/docs/\353\204\244\355\212\270\354\233\214\355\201\254/RESTful.md"
+++ "b/apps/frontend/tech/docs/\353\204\244\355\212\270\354\233\214\355\201\254/RESTful.md"
@@ -11,7 +11,7 @@ RESTFUL 개념
-RESTful 웹 API 구현은 REST(Representational State Transfer) 아키텍처 원칙을 사용하여 클라이언트와 서비스 간에 느슨하게 결합된 상태 비 상태 인터페이스를 달성하는 웹 API입니다. RESTful인 웹 API는 표준 HTTP 프로토콜을 지원하여 리소스에 대한 작업을 수행하고 하이퍼미디어 링크 및 HTTP 작업 상태 코드를 포함하는 리소스의 표현을 반환합니다. [[1]](#microsoft---restful-api)
+RESTful 웹 API 구현은 REST(Representational State Transfer) 아키텍처 원칙을 사용하여 클라이언트와 서비스 간에 느슨하게 결합된 상태 비 상태 인터페이스를 달성하는 웹 API입니다. RESTful인 웹 API는 표준 HTTP 프로토콜을 지원하여 리소스에 대한 작업을 수행하고 하이퍼미디어 링크 및 HTTP 작업 상태 코드를 포함하는 리소스의 표현을 반환합니다. [[1]](#1-microsoft---restful-api)
### RESTful API의 원칙
diff --git "a/apps/frontend/tech/docs/\354\232\264\354\230\201\354\262\264\354\240\234/IPC.md" "b/apps/frontend/tech/docs/\354\232\264\354\230\201\354\262\264\354\240\234/IPC.md"
index f3d5749e..4daf5ded 100644
--- "a/apps/frontend/tech/docs/\354\232\264\354\230\201\354\262\264\354\240\234/IPC.md"
+++ "b/apps/frontend/tech/docs/\354\232\264\354\230\201\354\262\264\354\240\234/IPC.md"
@@ -13,7 +13,7 @@ date: 2025-07-27
-프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다. [[1]](#1-wiki-ipc)
+프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다. [[1]](#1-wiki---ipc)
### 주요 IPC 방식