- StarLight는 창업자가 사업계획서를 작성하고, 전문가의 피드백과 AI 분석을 받을 수 있는 서비스이다.
- 창업자(Member with MemberType.FOUNDER)는 사업계획서를 작성할 수 있다.
- 사업계획서는 5개의 주요 섹션(개요, 문제인식, 실현가능성, 성장전략, 팀역량)으로 구성되며, 각 섹션은 여러 서브 섹션으로 세분화된다.
- 작성된 사업계획서에 대해 AI가 자동으로 분석 리포트를 생성할 수 있다.
- 창업자는 전문가에게 피드백을 신청할 수 있으며, 동일한 사업계획서에 대해 동일한 전문가에게는 1회만 신청이 가능하다.
- 전문가(Expert)는 피드백 신청을 받으면 7일 이내에 리포트를 작성하여 제출해야 한다.
- 전문가 피드백 신청은 결제를 통해 이루어지며, 토스페이먼츠를 통해 처리된다.
Aggregate Root
id:Longname:String- 이름email:String- 이메일profileImageUrl:String- 프로필 이미지 URLphoneNumber: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(전문가) 타입 중 하나를 가진다.
- 소프트 삭제를 지원한다.
Entity
id:Longpassword:String- 암호화된 비밀번호
static create(): 인증 정보 생성 (암호화된 비밀번호)
Enum
FOUNDER: 창업자EXPERT: 전문가
Aggregate Root
id:Longname:String- 이름email:String- 이메일workedPeriod:Long- 경력 기간profileImageUrl:String- 프로필 이미지 URLmentoringPriceWon:Integer- 멘토링 가격 (원)careers:List<String>- 경력 목록tags:Set<String>- 태그 목록categories:Set<TagCategory>- 전문 분야 카테고리
- Member와 독립적으로 존재하는 별도의 엔티티이다.
Enum
MARKET_BM: 시장성/BMTEAM_CAPABILITY: 팀 역량PROBLEM_DEFINITION: 문제 정의GROWTH_STRATEGY: 성장 전략METRIC_DATA: 지표/데이터
Aggregate Root
id:LongmemberId:Long- 작성자 회원 IDtitle: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 기반 사업계획서는 별도로 생성 가능하다.
Enum
OVERVIEW: 개요PROBLEM_RECOGNITION: 문제 인식FEASIBILITY: 실현 가능성GROWTH_STRATEGY: 성장 전략TEAM_COMPETENCE: 팀 역량
MappedSuperclass (Abstract)
id:Long- BusinessPlan과 공유하는 기본키businessPlan:BusinessPlan- 연관된 사업계획서
attachBusinessPlan(): 사업계획서 연결putSubSection(): 서브 섹션 추가removeSubSection(): 서브 섹션 제거getSubSectionByType(): 타입별 서브 섹션 조회 (추상 메서드)setSubSectionByType(): 타입별 서브 섹션 설정 (추상 메서드)areAllSubSectionsCreated(): 모든 서브 섹션 생성 여부 (추상 메서드)
Entity (extends BaseSection)
overviewBasic:SubSection- 기본 개요 서브 섹션 (1:1 관계)
static create(): 개요 섹션 생성
Entity (extends BaseSection)
problemBackground:SubSection- 창업 배경 및 개발동기 (1:1 관계)problemPurpose:SubSection- 창업아이템의 목적 및 필요성 (1:1 관계)problemMarket:SubSection- 창업아이템의 목표시장 분석 (1:1 관계)
static create(): 문제 인식 섹션 생성
Entity (extends BaseSection)
feasibilityStrategy:SubSection- 사업화 전략 (1:1 관계)feasibilityMarket:SubSection- 시장분석 및 경쟁력 확보 방안 (1:1 관계)
static create(): 실현 가능성 섹션 생성
Entity (extends BaseSection)
growthModel:SubSection- 비즈니스 모델 (1:1 관계)growthFunding:SubSection- 자금조달 계획 (1:1 관계)growthEntry:SubSection- 시장진입 및 성과창출 전략 (1:1 관계)
static create(): 성장 전략 섹션 생성
Entity (extends BaseSection)
teamFounder:SubSection- 창업자의 역량 (1:1 관계)teamMembers:SubSection- 팀 역량 (1:1 관계)
static create(): 팀 역량 섹션 생성
Entity
id:LongsubSectionType: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개의 항목을 가진다.
Enum
OVERVIEW_BASIC: 개요
PROBLEM_BACKGROUND: 창업 배경 및 개발동기PROBLEM_PURPOSE: 창업아이템의 목적 및 필요성PROBLEM_MARKET: 창업아이템의 목표시장 분석
FEASIBILITY_STRATEGY: 사업화 전략FEASIBILITY_MARKET: 시장분석 및 경쟁력 확보 방안
GROWTH_MODEL: 비즈니스 모델GROWTH_FUNDING: 자금조달 계획GROWTH_ENTRY: 시장진입 및 성과창출 전략
TEAM_FOUNDER: 창업자의 역량TEAM_MEMBERS: 팀 역량
Enum
STARTED: 시작됨WRITTEN_COMPLETED: 작성 완료AI_REVIEWED: AI 리뷰 완료EXPERT_MATCHED: 전문가 매칭 완료FINALIZED: 최종 완료
Value Object
value:String- JSON 문자열
static create(): RawJson 생성
Aggregate Root
id:LongbusinessPlanId:Long- 사업계획서 IDexpertId:Long- 전문가 ID
static create(): 피드백 신청 생성 (사업계획서ID, 전문가ID)
- 사업계획서 1개당 여러 전문가에게 피드백 신청이 가능하다.
- 동일한 사업계획서에 대해 동일한 전문가에게는 1회만 피드백 신청이 가능하다 (유니크 제약 조건).
Aggregate Root
id:LongexpertId:Long- 전문가 IDbusinessPlanId:Long- 사업계획서 IDexpiredAt: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개의 리포트만 존재할 수 있다 (유니크 제약 조건).
Entity
id:LongcommentType:CommentType- 코멘트 타입 (STRENGTH, WEAKNESS)content:String- 내용 (TEXT)
static create(): 리포트 상세 생성 (코멘트타입, 내용)update(): 내용 업데이트
Enum
PENDING: 평가 전TEMPORARY_SAVED: 임시 저장SUBMITTED: 제출 완료EXPIRED: 만료됨
Enum
STRENGTH: 강점WEAKNESS: 약점
Aggregate Root
id:LongbusinessPlanId:Long- 사업계획서 IDrawJson:RawJson- 원본 JSON 데이터 (TEXT)
static create(): AI 리포트 생성 (사업계획서ID, 원본JSON)update(): AI 리포트 업데이트 (원본JSON)
- 사업계획서가 작성 완료되지 않으면 AI 리포트를 생성할 수 없다.
Aggregate Root
id:LongorderCode:String- 주문 코드 (유니크)buyerId:Long- 구매자 회원 IDstatus: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 상태에서만 취소가 가능하다.
Entity
id:Longorder:Orders- 주문 (N:1 관계)pg:String- PG사 (기본값: "TOSS")paymentKey:String- 결제 키 (유니크)method:String- 결제 수단provider:String- 결제 제공자price:Long- 결제 금액status:String- 결제 상태 (기본값: "REQUESTED")receiptUrl:String- 영수증 URLapprovedAt:Instant- 승인 일시createdAt:Instant- 생성 일시
static requestedFor(): 결제 요청 생성 (주문, 금액)markDone(): 결제 완료 처리markFailed(): 결제 실패 처리
Enum
NEW: 주문 생성됨 (결제 전)PAID: 결제 완료CANCELED: 주문/결제 취소
Enum
- 사용 크레딧 상품 타입 (1회권, 2회권 등)
Value Object
value:String- 주문 코드 문자열
static of(): OrderCode 생성
Value Object
amount:Long- 금액currency:String- 통화
static of(): Money 생성 (금액, 통화)static krw(): 한국 원화 Money 생성