| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /feature:domain |
| Aliases | /domain:create, /layer:domain |
| Tools | Read, Edit, Write, Glob, Grep |
| Model | sonnet |
| Skills | feature |
/feature:domain โ ์ฑ์ "ํต์ฌ ๊ท์น" ์ค๊ณ ๋ด๋น#
ํ๋ง๋๋ก#
์ฑ์ด ๋ค๋ฃจ๋ ํต์ฌ ๊ฐ๋ (์: ์ฌ์ฉ์, ์ฃผ๋ฌธ)๊ณผ ๊ทธ๊ฒ์ผ๋ก ํ ์ ์๋ ์ผ(์กฐํยท์์ฑ ๋ฑ)์ ์ผ๊ด๋ ํํ๋ก ๋ง๋ค์ด ์ฃผ๋ ์ ๋ด ์ผ๊พผ์ ๋๋ค. ๊ฑด๋ฌผ๋ก ์น๋ฉด ํ๋ฉด ๋์์ธ์ด๋ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์๊ณผ ๋ฌด๊ดํ๊ฒ ๋ณํ์ง ์๋ "์ค๊ณ ์์น"์ ์ ๋ฆฌํด ๋๋ ๋จ๊ณ์์.
๋๊ฐยท์ธ์ ์ฐ๋์#
- ์ ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ ๋ชจ์๊ณผ ๊ท์น์ ์ฒ์ ์ก์ ๋ โ
/feature:domain๋ช ๋ น์ ์ง์ ์คํํ๋ฉด ๋์ํฉ๋๋ค. - ๋ฐฑ์๋๋ถํฐ ์ฑ๊น์ง ํ ๋ฒ์ ๋ง๋๋ ์ ์ฒด ๊ธฐ๋ฅ ์์ฑ(
/feature:create)์ด ์งํ๋ ๋, ๊ทธ ์์ 3๋ฒ์งธ ๋จ๊ณ๋ก ์๋ ํธ์ถ๋ฉ๋๋ค.
๋ฌด์์ ํด์ฃผ๋์#
๊ธฐ๋ฅ ํ๋์ ํ์ํ ๋๋ฉ์ธ ๋ผ๋ ํ์ผ๋ค์ ์ผ์ ํ ๊ท์น์ ๋ง์ถฐ ํ ๋ฒ์ ๋ง๋ค์ด ์ค๋๋ค. ์ค์ ๋ก ์๊ธฐ๋ ๊ฒ:
- Entity โ ํต์ฌ ๊ฐ๋
์ ๋ฐ์ดํฐ ๋ชจ์ (
{entity}.dart๋ฑ) -
Repository Interface โ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ๋ "์ฝ์" ์ ์ (
i_{feature}_repository.dart) -
UseCase โ ์กฐํยท์์ฑ ๊ฐ์ ๊ฐ๋ณ ๋์ (
get_{entity}s_usecase.dart,create_{entity}_usecase.dart๋ฑ) -
Failure / Exception โ ์ค๋ฅ ์ํฉ์ ๋ค๋ฃจ๋ ํ์ผ (
{feature}_failure_messages.dart,{feature}_exception.dart)
์ด ํ์ผ๋ค์ ๋ชจ๋ feature/{location}/{feature_name}/lib/src/domain/ ํด๋ ์๋์ ์ ๋ฆฌ๋์ด ๋ง๋ค์ด์ง๋๋ค.
์ด๋ป๊ฒ ์ฐ๋์#
# ๊ธฐ๋ฅ ์ด๋ฆ๊ณผ ํต์ฌ ๊ฐ๋
(Entity) ์ด๋ฆ์ ์ง์ ํด ๋๋ฉ์ธ ๊ณ์ธต ์์ฑ
/feature:domain
# ๊ฐ์ ์ผ์ ํ๋ ๋ค๋ฅธ ์ด๋ฆ(๋ณ์นญ)์ผ๋ก๋ ํธ์ถ ๊ฐ๋ฅ
/domain:create
/layer:domain
์ ๋ฌํ ์ ์๋ ๊ฐ:
feature_name(ํ์) โ ๊ธฐ๋ฅ ๋ชจ๋ ์ด๋ฆ (snake_case, ์:user_profile)entity_name(ํ์) โ ํต์ฌ ๊ฐ๋ ์ด๋ฆ (PascalCase, ์:UserProfile)-
location(์ ํ) โ ์ด๋์ ๋์ง:application(๊ธฐ๋ณธ๊ฐ) /common/console usecases(์ ํ) โ ๋ง๋ค ๋์ ๋ชฉ๋ก (์ง์ ์ ํ๋ฉด ๊ธฐ๋ณธ CRUD ๋์ ์ ์ฒด ์์ฑ)
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
์ ํด์ง ํจํด๊ณผ ๊ธ์ง ๊ท์น์ ์ง์ผ, ๋๋ฉ์ธ ๊ณ์ธต์ ๊ฐ ์กฐ๊ฐ์ ์ผ๊ด๋๊ฒ ์ฐ์ด๋ ๋๋ค.
- Entity ๋ง๋ค๊ธฐ โ ํต์ฌ ๊ฐ๋ ์ ๋ฐ์ดํฐ ๋ชจ์์ ์ ํ๊ณ , ํ๋ ์์(ID โ ํ์ โ ์ ํ โ ๋ฉํ) ๊ท์น์ ๋ฐ๋ฆ ๋๋ค.
- Repository Interface ๋ง๋ค๊ธฐ โ ๋ฐ์ดํฐ ์ ๊ทผ ์ฝ์์ ์ ์ํ๊ณ , ์ด๋ฆ ์์
I๋ฅผ ๋ถ์ ๋๋ค. - UseCase ๋ง๋ค๊ธฐ โ ์กฐํยท์์ฑ ๊ฐ์ ๋์์ ํ์ค ์ฃผ์ ๋ฐฉ์์ผ๋ก ํ๋์ฉ ๋ง๋ค๊ณ ๋จ์ ํ ์คํธ๋ ํจ๊ป ์์ฑํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ โ Failure / Exception ํ์ผ์ ๋ง๋ค์ด ์คํจ ์ํฉ์ ๋ค๋ฃน๋๋ค.
-
๊ธ์ง ๊ท์น ์ ๊ฒ โ ์๋ ๊ฒฝ๋ก import, UseCase๋ฅผ ๊ฑด๋๋ด ์ง์ ํธ์ถ,
getIt/@injectable์ฌ์ฉ ๋ฑ์ ๋ง์ ์ผ๊ด์ฑ์ ์งํต๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Role#
Consistently generates Entity, Repository Interface, UseCase, and Failure/Exception.
Activation Conditions#
/feature:domainActivated when command is invoked/feature:createorchestration Step 3invoked from
Parameters#
| Parameter | Required | Description |
|---|---|---|
feature_name | โ | Feature module name (snake_case) |
entity_name | โ | Entity name (PascalCase) |
location | โ | application, common, console (default: application) |
usecases | โ | To generate UseCase List (default: CRUD Before์ฒด) |
Generated Files#
feature/{location}/{feature_name}/lib/src/domain/
โโโ entity/
โ โโโ {entity}.dart
โ โโโ {entity}_list_result.dart
โ โโโ entity.dart # export
โโโ repository/
โ โโโ i_{feature}_repository.dart
โ โโโ repository.dart # export
โโโ usecase/
โ โโโ get_{entity}s_usecase.dart
โ โโโ create_{entity}_usecase.dart
โ โโโ usecase.dart # export
โโโ failure/
โ โโโ {feature}_failure_messages.dart
โโโ exception/
โโโ {feature}_exception.dartCore Patterns Summary#
Entity#
Equatableextends,constConstructor- Field ์์: ID โ Required โ Optional (nullable) โ ๋ฉํ(createdAt etc.)
Repository Interface#
Iprefix Required (IFeatureRepository)- Return Type:
Future<Either<Failure, T>>orStream<Either<Failure, T>>(SWR)
UseCase Patterns#
๐ Details: UseCase Pattern
| Pattern | Description |
|---|---|
| Optional Constructor Injection | โ
Standard - UseCase([IRepo? repo]) : _repo = repo ?? ConcreteRepo() |
Prohibited Patterns#
// โ Relative path import prohibited
import '../domain/entity/user.dart';
// โ Repository ์ง์ ํธ์ถ (UseCase ์ฐํ) ๊ธ์ง
final result = await repository.getUser();
// โ getIt usage prohibited
IRepo get repo => getIt<IRepo>();
// โ @injectable ์ด๋
ธํ
์ด์
๊ธ์ง
Checklist#
Common (Required)#
- Entity: Equatable extends + const constructor
- Repository:
Iprefix +Either<Failure, T>Return - Write UseCase unit tests
- Use package imports only
UseCase Patterns#
- โ
Optional Constructor Injection:
const UseCase([IRepo? repo]) : _repo = repo ?? ConcreteRepo() - โ
Test:
UseCase(mockRepo)Direct injection