Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: translate code smells documentation pages into korean #767

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
label: Code smells & Issues
position: 4
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
sidebar_position: 4
sidebar_class_name: sidebar-item--wip
pagination_next: reference/index
---

import WIP from '@site/src/shared/ui/wip/tmpl.mdx'

# 크로스 임포트

<WIP ticket="220" />

> 크로스 임포트는 계층이나 추상화가 본래 맡아야 할 책임 이상의 역할을 수행하려 할 때 발생합니다. 이를 방지하기 위해, 방법론은 이러한 크로스 임포트를 해소할 수 있도록 별도의 계층을 정의합니다.

## 참고 자료

- [(스레드) 크로스 임포트가 불가피한 경우에 대한 논의](https://t.me/feature_sliced/4515)
- [(스레드) 엔티티에서 크로스 임포트를 해결하는 방법](https://t.me/feature_sliced/3678)
- [(스레드) 크로스 임포트와 책임의 관계에 대한 논의](https://t.me/feature_sliced/3287)
- [(스레드) 세그먼트 간 임포트 문제를 다룬 논의](https://t.me/feature_sliced/4021)
- [(스레드) 공유된 내부 구조에서 크로스 임포트를 해결하는 방법에 대한 논의](https://t.me/feature_sliced/3618)
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
---
sidebar_position: 2
sidebar_class_name: sidebar-item--wip
---

import WIP from '@site/src/shared/ui/wip/tmpl.mdx'

# 비분절화

<WIP ticket="148" />

## 상황

프로젝트에서는 특정 도메인과 관련된 모듈들이 서로 관련이 있음에도 불구하고, 불필요하게 분산되어 프로젝트 전체에 흩어져 있는 경우가 자주 발생합니다.

```sh
├── components/
| ├── DeliveryCard
| ├── DeliveryChoice
| ├── RegionSelect
| ├── UserAvatar
├── actions/
| ├── delivery.js
| ├── region.js
| ├── user.js
├── epics/
| ├── delivery.js
| ├── region.js
| ├── user.js
├── constants/
| ├── delivery.js
| ├── region.js
| ├── user.js
├── helpers/
| ├── delivery.js
| ├── region.js
| ├── user.js
├── entities/
| ├── delivery/
| | ├── getters.js
| | ├── selectors.js
| ├── region/
| ├── user/
```

## 문제점

이 문제는 최소한 높은 응집성 원칙의 위반과, **변경 축의 과도한 확장(Stretching of the Axis of Changes)** 이라는 형태로 나타납니다.

## 이를 무시할 경우

- 예를 들어, 배송(delivery)과 관련된 로직을 수정하려면 여러 위치에 흩어져 있는 코드를 찾아 수정해야 합니다. 이는 변경이 필요한 범위를 불필요하게 넓혀 **변경 축을 확장** 시키는 결과를 초래합니다.
- 사용자와 관련된 로직을 이해하려면, 프로젝트 전반에 흩어져 있는 **actions, epics, constants, entities, components** 를 모두 찾아 학습해야 합니다. 이는 이들이 한 곳에 모여 있지 않기 때문입니다.
- 암묵적인 연결로 인해 도메인 영역이 비대해지며 통제하기 어려워질 수 있습니다.
- 또한, 이 방식은 프로젝트 디렉토리에 "상수를 위한 상수 생성"과 같은 불필요한 파일을 무분별하게 쌓게 만들어, 문제를 제대로 인지하지 못하게 만듭니다.

## 해결책

특정 도메인 또는 사용자 케이스와 관련된 모든 모듈을 서로 인접하게 배치합니다.

이를 통해 특정 모듈을 학습하거나 수정할 때 필요한 모든 구성 요소가 한곳에 모여 있어, 프로젝트 전체를 뒤질 필요가 없습니다.

> 이러한 접근 방식은 코드베이스의 탐색성과 명확성을 크게 향상시키며, 모듈 간의 관계를 더 직관적으로 이해할 수 있도록 돕습니다.

```diff
- ├── components/
- | ├── DeliveryCard
- | ├── DeliveryChoice
- | ├── RegionSelect
- | ├── UserAvatar
- ├── actions/
- | ├── delivery.js
- | ├── region.js
- | ├── user.js
- ├── epics/{...}
- ├── constants/{...}
- ├── helpers/{...}
├── entities/
| ├── delivery/
+ | | ├── ui/ # ~ components/
+ | | | ├── card.js
+ | | | ├── choice.js
+ | | ├── model/
+ | | | ├── actions.js
+ | | | ├── constants.js
+ | | | ├── epics.js
+ | | | ├── getters.js
+ | | | ├── selectors.js
+ | | ├── lib/ # ~ helpers
| ├── region/
| ├── user/
```

## See also

* [(아티클) 낮은 결합도와 높은 응집도에 대한 명확한 설명](https://enterprisecraftsmanship.com/posts/cohesion-coupling-difference/)
* [(아티클) 낮은 결합도와 높은 응집도, 그리고 디미터의 법칙](https://medium.com/german-gorelkin/low-coupling-high-cohesion-d36369fb1be9)
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
sidebar_position: 3
sidebar_class_name: sidebar-item--wip
sidebar_label: 라우팅
---

import WIP from '@site/src/shared/ui/wip/tmpl.mdx'

# 라우팅

<WIP ticket="169" />

## 상황

페이지에 대한 URL이 페이지 아래 계층에 하드코딩되어 있는 경우가 발생합니다.

```tsx title="entities/post/card"
<Card>
<Card.Title
href={`/post/${data.id}`}
title={data.name}
/>
...
</Card>
```

## 문제점

URL이 책임 범위에 따라 페이지 계층에 집중되지 않고, 하위 계층에 분산되어 관리됩니다.

## 무시할 경우

URL을 변경하려면, 해당 URL(또는 URL과 관련된 리디렉션 로직)이 페이지 계층 외의 여러 하위 계층에 존재할 수 있음을 고려해야 합니다.

결과적으로, 단순한 상품 카드와 같은 요소조차 페이지의 책임 일부를 떠안게 되어, 프로젝트 전반의 로직이 불필요하게 복잡해질 수 있습니다.

## 해결책

URL과 리디렉션 로직은 페이지 레벨과 그 위 계층에서만 처리하도록 결정합니다.

이를 위해, 조립(composition), props 전달, 팩토리 패턴 등을 활용해 URL 정보를 하위 계층에 전달합니다.

## 참고 자료

- [(스레드) 엔티티/피처/위젯에서 라우팅을 "봉합"하면 어떻게 될까요?](https://t.me/feature_sliced/4389)
- [(스레드) 왜 라우트 로직을 페이지에만 섞으면 안 되는가?](https://t.me/feature_sliced/3756)