بنقرة واحدة
design-patterns
프로젝트의 디자인 패턴과 아키텍처 규칙. 코드 작성, 리팩토링, 새 모듈 생성, 구조 결정 시 반드시 참조. 새 파일을 만들기 전에 이 스킬을 먼저 읽을 것.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
프로젝트의 디자인 패턴과 아키텍처 규칙. 코드 작성, 리팩토링, 새 모듈 생성, 구조 결정 시 반드시 참조. 새 파일을 만들기 전에 이 스킬을 먼저 읽을 것.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
프로젝트 구조와 모듈 간 관계. 새 모듈 추가, 디렉토리 생성, 파일 배치 결정 시 참조.
코딩 컨벤션과 스타일 가이드. 코드 작성, 리뷰, 수정 시 반드시 참조. 네이밍, 포맷팅, import 순서, 주석 규칙 등.
에러 처리 패턴과 규칙. 예외 처리, 에러 클래스, 로깅, 재시도 로직 작성 시 참조.
기존 코드베이스에서 유사 패턴이나 구현을 찾을 때 사용. 새 코드 작성 전에 기존 코드를 먼저 검색하여 일관성 유지.
테스트 작성 전략과 규칙. 테스트 코드 작성, 테스트 실행, 커버리지 확인 시 참조. 테스트 100% 통과가 목표.
| name | design-patterns |
| description | 프로젝트의 디자인 패턴과 아키텍처 규칙. 코드 작성, 리팩토링, 새 모듈 생성, 구조 결정 시 반드시 참조. 새 파일을 만들기 전에 이 스킬을 먼저 읽을 것. |
모든 코드는 다음 레이어 구조를 따른다. 의존성은 반드시 안쪽으로만.
Controller/API (진입점)
↓ 호출만
Service (비즈니스 로직)
↓ 호출만
Repository (데이터 접근)
↓ 호출만
Domain (엔티티, 값 객체)
Domain: 순수 데이터 구조. 외부 의존성 없음.
# domain/user.py
@dataclass
class User:
id: str
name: str
email: str
created_at: datetime
Repository: 데이터 접근 인터페이스 + 구현. 반드시 인터페이스(Protocol/ABC) 정의.
# repository/user_repository.py
class UserRepository(Protocol):
async def find_by_id(self, user_id: str) -> User | None: ...
async def save(self, user: User) -> User: ...
async def delete(self, user_id: str) -> bool: ...
# repository/impl/user_repository_impl.py
class UserRepositoryImpl:
def __init__(self, db: Database):
self._db = db
async def find_by_id(self, user_id: str) -> User | None:
...
Service: 비즈니스 로직. Repository를 주입받아 사용. 절대로 DB 직접 접근 금지.
# service/user_service.py
class UserService:
def __init__(self, user_repo: UserRepository):
self._user_repo = user_repo
async def get_user(self, user_id: str) -> User:
user = await self._user_repo.find_by_id(user_id)
if not user:
raise UserNotFoundError(user_id)
return user
Controller/API: 진입점. 요청 파싱 → Service 호출 → 응답 포맷팅만.
# controller/user_controller.py
class UserController:
def __init__(self, user_service: UserService):
self._user_service = user_service
async def get_user(self, request: Request) -> Response:
user_id = request.path_params["user_id"]
user = await self._user_service.get_user(user_id)
return Response(UserDTO.from_domain(user))
모든 의존성은 생성자 주입. 전역 상태 금지.
레이어 간 데이터 전달은 반드시 DTO. Domain 객체를 외부에 직접 노출 금지.
비즈니스 에러는 예외 대신 Result 패턴 사용 권장.
@dataclass
class Result(Generic[T]):
success: bool
data: T | None = None
error: str | None = None
@classmethod
def ok(cls, data: T) -> "Result[T]":
return cls(success=True, data=data)
@classmethod
def fail(cls, error: str) -> "Result[T]":
return cls(success=False, error=error)
복잡한 객체 생성은 Factory 사용.
동일 인터페이스, 다른 구현이 필요한 경우 Strategy.