Skip to content

Latest commit

 

History

History
427 lines (351 loc) · 14 KB

File metadata and controls

427 lines (351 loc) · 14 KB

StarLight 도메인 모델

StarLight 도메인

  • StarLight는 창업자가 사업계획서를 작성하고, 전문가의 피드백과 AI 분석을 받을 수 있는 서비스이다.
  • 창업자(Member with MemberType.FOUNDER)는 사업계획서를 작성할 수 있다.
  • 사업계획서는 5개의 주요 섹션(개요, 문제인식, 실현가능성, 성장전략, 팀역량)으로 구성되며, 각 섹션은 여러 서브 섹션으로 세분화된다.
  • 작성된 사업계획서에 대해 AI가 자동으로 분석 리포트를 생성할 수 있다.
  • 창업자는 전문가에게 피드백을 신청할 수 있으며, 동일한 사업계획서에 대해 동일한 전문가에게는 1회만 신청이 가능하다.
  • 전문가(Expert)는 피드백 신청을 받으면 7일 이내에 리포트를 작성하여 제출해야 한다.
  • 전문가 피드백 신청은 결제를 통해 이루어지며, 토스페이먼츠를 통해 처리된다.

도메인 모델


[ 회원 어그리거트 ]

회원(Member)

Aggregate Root

속성

  • id: Long
  • name: String - 이름
  • email: String - 이메일
  • profileImageUrl: String - 프로필 이미지 URL
  • phoneNumber: String - 전화번호
  • memberType: MemberType - 회원 타입 (FOUNDER, EXPERT)
  • credential: Credential - 인증 정보 (1:1 관계)
  • provider: String - 인증 제공자 (starlight, kakao, google 등)
  • providerId: String - 제공자 고유 ID

행위

  • static create(): 일반 회원 생성 (이름, 이메일, 전화번호, 회원타입, 인증정보, 프로필이미지)
  • static newSocial(): 소셜 로그인 회원 생성 (이름, 이메일, 제공자, 제공자ID, 전화번호, 회원타입, 프로필이미지)
  • updateProfileImage(): 프로필 이미지 업데이트

규칙

  • 회원은 FOUNDER(창업자) 또는 EXPERT(전문가) 타입 중 하나를 가진다.
  • 소프트 삭제를 지원한다.

인증 정보(Credential)

Entity

속성

  • id: Long
  • password: String - 암호화된 비밀번호

행위

  • static create(): 인증 정보 생성 (암호화된 비밀번호)

회원 타입(MemberType)

Enum

상수

  • FOUNDER: 창업자
  • EXPERT: 전문가

[ 전문가 어그리거트 ]

전문가(Expert)

Aggregate Root

속성

  • id: Long
  • name: String - 이름
  • email: String - 이메일
  • workedPeriod: Long - 경력 기간
  • profileImageUrl: String - 프로필 이미지 URL
  • mentoringPriceWon: Integer - 멘토링 가격 (원)
  • careers: List<String> - 경력 목록
  • tags: Set<String> - 태그 목록
  • categories: Set<TagCategory> - 전문 분야 카테고리

규칙

  • Member와 독립적으로 존재하는 별도의 엔티티이다.

전문가 태그 카테고리(TagCategory)

Enum

상수

  • MARKET_BM: 시장성/BM
  • TEAM_CAPABILITY: 팀 역량
  • PROBLEM_DEFINITION: 문제 정의
  • GROWTH_STRATEGY: 성장 전략
  • METRIC_DATA: 지표/데이터

[ 사업계획서 어그리거트 ]

사업계획서(BusinessPlan)

Aggregate Root

속성

  • id: Long
  • memberId: Long - 작성자 회원 ID
  • title: String - 제목
  • pdfUrl: String - PDF 파일 URL (선택)
  • planStatus: PlanStatus - 사업계획서 상태
  • overview: Overview - 개요 섹션 (1:1 관계)
  • problemRecognition: ProblemRecognition - 문제 인식 섹션 (1:1 관계)
  • feasibility: Feasibility - 실현 가능성 섹션 (1:1 관계)
  • growthTactic: GrowthTactic - 성장 전략 섹션 (1:1 관계)
  • teamCompetence: TeamCompetence - 팀 역량 섹션 (1:1 관계)

행위

  • static create(): 사업계획서 생성 (제목, 회원ID) - STARTED 상태로 초기화
  • static createWithPdf(): PDF 기반 사업계획서 생성 (제목, 회원ID, PDF URL) - WRITTEN_COMPLETED 상태로 초기화
  • isOwnedBy(): 소유자 확인
  • isPdfBased(): PDF 기반 여부 확인
  • updateTitle(): 제목 업데이트
  • updateStatus(): 상태 업데이트
  • areWritingCompleted(): 모든 서브 섹션이 작성 완료되었는지 확인

규칙

  • 사업계획서 생성 시 5개의 섹션이 자동으로 초기화된다.
  • 모든 서브 섹션이 작성되면 작성 완료로 판단된다.
  • PDF 기반 사업계획서는 별도로 생성 가능하다.

섹션 타입(SectionType)

Enum

상수

  • OVERVIEW: 개요
  • PROBLEM_RECOGNITION: 문제 인식
  • FEASIBILITY: 실현 가능성
  • GROWTH_STRATEGY: 성장 전략
  • TEAM_COMPETENCE: 팀 역량

기본 섹션(BaseSection)

MappedSuperclass (Abstract)

속성

  • id: Long - BusinessPlan과 공유하는 기본키
  • businessPlan: BusinessPlan - 연관된 사업계획서

행위

  • attachBusinessPlan(): 사업계획서 연결
  • putSubSection(): 서브 섹션 추가
  • removeSubSection(): 서브 섹션 제거
  • getSubSectionByType(): 타입별 서브 섹션 조회 (추상 메서드)
  • setSubSectionByType(): 타입별 서브 섹션 설정 (추상 메서드)
  • areAllSubSectionsCreated(): 모든 서브 섹션 생성 여부 (추상 메서드)

개요(Overview)

Entity (extends BaseSection)

속성

  • overviewBasic: SubSection - 기본 개요 서브 섹션 (1:1 관계)

행위

  • static create(): 개요 섹션 생성

문제 인식(ProblemRecognition)

Entity (extends BaseSection)

속성

  • problemBackground: SubSection - 창업 배경 및 개발동기 (1:1 관계)
  • problemPurpose: SubSection - 창업아이템의 목적 및 필요성 (1:1 관계)
  • problemMarket: SubSection - 창업아이템의 목표시장 분석 (1:1 관계)

행위

  • static create(): 문제 인식 섹션 생성

실현 가능성(Feasibility)

Entity (extends BaseSection)

속성

  • feasibilityStrategy: SubSection - 사업화 전략 (1:1 관계)
  • feasibilityMarket: SubSection - 시장분석 및 경쟁력 확보 방안 (1:1 관계)

행위

  • static create(): 실현 가능성 섹션 생성

성장 전략(GrowthTactic)

Entity (extends BaseSection)

속성

  • growthModel: SubSection - 비즈니스 모델 (1:1 관계)
  • growthFunding: SubSection - 자금조달 계획 (1:1 관계)
  • growthEntry: SubSection - 시장진입 및 성과창출 전략 (1:1 관계)

행위

  • static create(): 성장 전략 섹션 생성

팀 역량(TeamCompetence)

Entity (extends BaseSection)

속성

  • teamFounder: SubSection - 창업자의 역량 (1:1 관계)
  • teamMembers: SubSection - 팀 역량 (1:1 관계)

행위

  • static create(): 팀 역량 섹션 생성

서브 섹션(SubSection)

Entity

속성

  • id: Long
  • subSectionType: SubSectionType - 서브 섹션 타입
  • content: String - 내용 (TEXT)
  • rawJson: RawJson - 원본 JSON 데이터 (TEXT)
  • checkFirst: boolean - 체크리스트 1번
  • checkSecond: boolean - 체크리스트 2번
  • checkThird: boolean - 체크리스트 3번
  • checkFourth: boolean - 체크리스트 4번
  • checkFifth: boolean - 체크리스트 5번

행위

  • static create(): 서브 섹션 생성 (타입, 내용, 원본JSON, 체크리스트)
  • update(): 서브 섹션 업데이트 (내용, 원본JSON, 체크리스트)
  • getChecks(): 체크리스트 조회

규칙

  • 체크리스트는 항상 5개의 항목을 가진다.

서브 섹션 타입(SubSectionType)

Enum

상수 (개요)

  • OVERVIEW_BASIC: 개요

상수 (문제 인식)

  • PROBLEM_BACKGROUND: 창업 배경 및 개발동기
  • PROBLEM_PURPOSE: 창업아이템의 목적 및 필요성
  • PROBLEM_MARKET: 창업아이템의 목표시장 분석

상수 (실현 가능성)

  • FEASIBILITY_STRATEGY: 사업화 전략
  • FEASIBILITY_MARKET: 시장분석 및 경쟁력 확보 방안

상수 (성장 전략)

  • GROWTH_MODEL: 비즈니스 모델
  • GROWTH_FUNDING: 자금조달 계획
  • GROWTH_ENTRY: 시장진입 및 성과창출 전략

상수 (팀 역량)

  • TEAM_FOUNDER: 창업자의 역량
  • TEAM_MEMBERS: 팀 역량

사업계획서 상태(PlanStatus)

Enum

상수

  • STARTED: 시작됨
  • WRITTEN_COMPLETED: 작성 완료
  • AI_REVIEWED: AI 리뷰 완료
  • EXPERT_MATCHED: 전문가 매칭 완료
  • FINALIZED: 최종 완료

원시 JSON(RawJson)

Value Object

속성

  • value: String - JSON 문자열

행위

  • static create(): RawJson 생성

[ 피드백 신청 어그리거트 ]

피드백 신청(ExpertApplication)

Aggregate Root

속성

  • id: Long
  • businessPlanId: Long - 사업계획서 ID
  • expertId: Long - 전문가 ID

행위

  • static create(): 피드백 신청 생성 (사업계획서ID, 전문가ID)

규칙

  • 사업계획서 1개당 여러 전문가에게 피드백 신청이 가능하다.
  • 동일한 사업계획서에 대해 동일한 전문가에게는 1회만 피드백 신청이 가능하다 (유니크 제약 조건).

[ 전문가 리포트 어그리거트 ]

전문가 리포트(ExpertReport)

Aggregate Root

속성

  • id: Long
  • expertId: Long - 전문가 ID
  • businessPlanId: Long - 사업계획서 ID
  • expiredAt: LocalDateTime - 만료 일시 (생성 후 7일)
  • token: String - 리포트 접근 토큰 (유니크)
  • viewCount: int - 조회 횟수
  • overallComment: String - 전체 코멘트 (TEXT)
  • submitStatus: SubmitStatus - 제출 상태 (기본값: PENDING)
  • details: List<ExpertReportDetail> - 리포트 상세 목록 (1:N 관계)

행위

  • static create(): 전문가 리포트 생성 (전문가ID, 사업계획서ID, 토큰) - 만료일시는 생성 후 7일
  • isExpired(): 만료 여부 확인
  • syncStatus(): 상태 동기화 (만료 확인 후 EXPIRED로 변경)
  • validateCanEdit(): 수정 가능 여부 검증
  • canEdit(): 수정 가능 여부 확인
  • temporarySave(): 임시 저장
  • submit(): 리포트 제출
  • updateOverallComment(): 전체 코멘트 업데이트
  • updateDetails(): 리포트 상세 목록 업데이트
  • incrementViewCount(): 조회 횟수 증가

규칙

  • 리포트는 생성 후 7일의 평가 기한을 가진다.
  • PENDING, TEMPORARY_SAVED 상태에서만 수정 가능하다.
  • PENDING, TEMPORARY_SAVED 상태에서 제출 가능하며, 제출 시 SUBMITTED 상태로 변경된다.
  • SUBMITTED, EXPIRED 상태에서는 수정 불가하다.
  • expiredAt가 현재 시간보다 이전이면 EXPIRED 상태로 변경된다.
  • 동일한 사업계획서와 전문가 조합에 대해 1개의 리포트만 존재할 수 있다 (유니크 제약 조건).

리포트 상세(ExpertReportDetail)

Entity

속성

  • id: Long
  • commentType: CommentType - 코멘트 타입 (STRENGTH, WEAKNESS)
  • content: String - 내용 (TEXT)

행위

  • static create(): 리포트 상세 생성 (코멘트타입, 내용)
  • update(): 내용 업데이트

제출 상태(SubmitStatus)

Enum

상수

  • PENDING: 평가 전
  • TEMPORARY_SAVED: 임시 저장
  • SUBMITTED: 제출 완료
  • EXPIRED: 만료됨

코멘트 타입(CommentType)

Enum

상수

  • STRENGTH: 강점
  • WEAKNESS: 약점

[ AI 리포트 어그리거트 ]

AI 리포트(AiReport)

Aggregate Root

속성

  • id: Long
  • businessPlanId: Long - 사업계획서 ID
  • rawJson: RawJson - 원본 JSON 데이터 (TEXT)

행위

  • static create(): AI 리포트 생성 (사업계획서ID, 원본JSON)
  • update(): AI 리포트 업데이트 (원본JSON)

규칙

  • 사업계획서가 작성 완료되지 않으면 AI 리포트를 생성할 수 없다.

[ 주문 어그리거트 ]

주문(Orders)

Aggregate Root

속성

  • id: Long
  • orderCode: String - 주문 코드 (유니크)
  • buyerId: Long - 구매자 회원 ID
  • status: OrderStatus - 주문 상태 (기본값: NEW)
  • currency: String - 통화 (기본값: "KRW")
  • price: Long - 주문 금액
  • usageProductCode: String - 사용 상품 코드
  • usageCount: Integer - 이용권 횟수 (1회권, 2회권 등)
  • payments: List<PaymentRecords> - 결제 기록 목록 (1:N 관계)
  • version: Long - 버전 (낙관적 locking)

행위

  • static newUsageOrder(): 이용권 주문 생성 (주문코드, 구매자ID, 금액, 상품타입)
  • validateSameBuyer(): 동일 구매자 확인
  • validateSameProduct(): 동일 상품 확인
  • addPaymentAttempt(): 결제 시도 추가
  • markPaid(): 결제 완료 처리
  • cancel(): 주문/결제 취소
  • getLatestRequestedOrThrow(): 가장 최근 REQUESTED 상태 결제 시도 조회
  • getLatestDoneOrThrow(): 가장 최근 DONE 상태 결제 시도 조회

규칙

  • 이미 결제 완료된 주문에는 결제 시도를 추가할 수 없다.
  • 주문 금액과 결제 금액이 일치해야 한다.
  • NEW 상태에서만 결제 승인이 가능하다.
  • PAID 상태에서만 취소가 가능하다.

결제 기록(PaymentRecords)

Entity

속성

  • id: Long
  • order: Orders - 주문 (N:1 관계)
  • pg: String - PG사 (기본값: "TOSS")
  • paymentKey: String - 결제 키 (유니크)
  • method: String - 결제 수단
  • provider: String - 결제 제공자
  • price: Long - 결제 금액
  • status: String - 결제 상태 (기본값: "REQUESTED")
  • receiptUrl: String - 영수증 URL
  • approvedAt: Instant - 승인 일시
  • createdAt: Instant - 생성 일시

행위

  • static requestedFor(): 결제 요청 생성 (주문, 금액)
  • markDone(): 결제 완료 처리
  • markFailed(): 결제 실패 처리

주문 상태(OrderStatus)

Enum

상수

  • NEW: 주문 생성됨 (결제 전)
  • PAID: 결제 완료
  • CANCELED: 주문/결제 취소

사용 상품 타입(UsageProductType)

Enum

상수

  • 사용 크레딧 상품 타입 (1회권, 2회권 등)

주문 코드(OrderCode)

Value Object

속성

  • value: String - 주문 코드 문자열

행위

  • static of(): OrderCode 생성

금액(Money)

Value Object

속성

  • amount: Long - 금액
  • currency: String - 통화

행위

  • static of(): Money 생성 (금액, 통화)
  • static krw(): 한국 원화 Money 생성