LogoSkills

domain-layer-agent

Clean Architecture Domain Layer specialist. Used for Entity, UseCase, and Repository interface work

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/feature:domain
Aliases/domain:create, /layer:domain
ToolsRead, Edit, Write, Glob, Grep
Modelsonnet
Skillsfeature

/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 ๋™์ž‘ ์ „์ฒด ์ƒ์„ฑ)

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

์ •ํ•ด์ง„ ํŒจํ„ด๊ณผ ๊ธˆ์ง€ ๊ทœ์น™์„ ์ง€์ผœ, ๋„๋ฉ”์ธ ๊ณ„์ธต์˜ ๊ฐ ์กฐ๊ฐ์„ ์ผ๊ด€๋˜๊ฒŒ ์ฐ์–ด๋ƒ…๋‹ˆ๋‹ค.

  1. Entity ๋งŒ๋“ค๊ธฐ โ€” ํ•ต์‹ฌ ๊ฐœ๋…์˜ ๋ฐ์ดํ„ฐ ๋ชจ์–‘์„ ์ •ํ•˜๊ณ , ํ•„๋“œ ์ˆœ์„œ(ID โ†’ ํ•„์ˆ˜ โ†’ ์„ ํƒ โ†’ ๋ฉ”ํƒ€) ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  2. Repository Interface ๋งŒ๋“ค๊ธฐ โ€” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์•ฝ์†์„ ์ •์˜ํ•˜๊ณ , ์ด๋ฆ„ ์•ž์— I๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
  3. UseCase ๋งŒ๋“ค๊ธฐ โ€” ์กฐํšŒยท์ƒ์„ฑ ๊ฐ™์€ ๋™์ž‘์„ ํ‘œ์ค€ ์ฃผ์ž… ๋ฐฉ์‹์œผ๋กœ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋„ ํ•จ๊ป˜ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ •์˜ โ€” Failure / Exception ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์‹คํŒจ ์ƒํ™ฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  5. ๊ธˆ์ง€ ๊ทœ์น™ ์ ๊ฒ€ โ€” ์ƒ๋Œ€ ๊ฒฝ๋กœ import, UseCase๋ฅผ ๊ฑด๋„ˆ๋›ด ์ง์ ‘ ํ˜ธ์ถœ, getIt/@injectable ์‚ฌ์šฉ ๋“ฑ์„ ๋ง‰์•„ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ต๋‹ˆ๋‹ค.

โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Role#

Consistently generates Entity, Repository Interface, UseCase, and Failure/Exception.


Activation Conditions#

  • /feature:domain Activated when command is invoked
  • /feature:create orchestration Step 3invoked from

Parameters#

ParameterRequiredDescription
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.dart

Core Patterns Summary#

Entity#

  • Equatable extends, const Constructor
  • Field ์ˆœ์„œ: ID โ†’ Required โ†’ Optional (nullable) โ†’ ๋ฉ”ํƒ€(createdAt etc.)

Repository Interface#

  • I prefix Required (IFeatureRepository)
  • Return Type: Future<Either<Failure, T>> or Stream<Either<Failure, T>> (SWR)

UseCase Patterns#

๐Ÿ“š Details: UseCase Pattern

PatternDescription
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: I prefix + 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