diff --git a/src/main/resources/static/payment.html b/src/main/resources/static/payment.html
new file mode 100644
index 00000000..b9050217
--- /dev/null
+++ b/src/main/resources/static/payment.html
@@ -0,0 +1,250 @@
+
+
+
+
+
starlight ํฌ๋ ๋ง ๊ฒฐ์ ํ๊ธฐ (Popup + postMessage)
+
+
+
+
+
+
+
+
starlight ํฌ๋ ๋ง ๊ฒฐ์ ํ๊ธฐ
+
์ํ(์ด์ฉ๊ถ)์ ์ ํํ๊ณ , ํ์
์์ ๊ฒฐ์ ํ postMessage๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ต๋๋ค.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/static/toss/popup.html b/src/main/resources/static/toss/popup.html
new file mode 100644
index 00000000..4fa47efe
--- /dev/null
+++ b/src/main/resources/static/toss/popup.html
@@ -0,0 +1,196 @@
+
+
+
+
+
+
๊ฒฐ์ ์ฒ๋ฆฌ ์ค...
+
+
+
+
+
๊ฒฐ์ ์ฒ๋ฆฌ ์ค...
+
+
์ ์๋ง ๊ธฐ๋ค๋ ค ์ฃผ์ธ์.
+
+
+
+
+
diff --git a/src/test/java/starlight/application/businessplan/util/PlainTextExtractUtilsTest.java b/src/test/java/starlight/application/businessplan/util/PlainTextExtractUtilsTest.java
index 9791ada5..7b8e03ad 100644
--- a/src/test/java/starlight/application/businessplan/util/PlainTextExtractUtilsTest.java
+++ b/src/test/java/starlight/application/businessplan/util/PlainTextExtractUtilsTest.java
@@ -18,7 +18,14 @@ void extractPlainText_fromContentArray() {
"\"content\":[" +
"{\"type\":\"text\",\"value\":\"Hello\"}," +
"{\"type\":\"image\",\"caption\":\"cap\"}," +
- "{\"type\":\"table\",\"columns\":[\"A\",\"B\"],\"rows\":[[\"1\",\"2\"],[\"3\",\"4\"]]}" +
+ "{\"type\":\"table\",\"columns\":[{\"width\":100},{\"width\":200}]," +
+ "\"rows\":[" +
+ "[{\"content\":[{\"type\":\"text\",\"value\":\"1\"}],\"rowspan\":1,\"colspan\":1}," +
+ "{\"content\":[{\"type\":\"text\",\"value\":\"2\"}],\"rowspan\":1,\"colspan\":1}]," +
+ "[{\"content\":[{\"type\":\"text\",\"value\":\"3\"}],\"rowspan\":1,\"colspan\":1}," +
+ "{\"content\":[{\"type\":\"text\",\"value\":\"4\"}],\"rowspan\":1,\"colspan\":1}]" +
+ "]" +
+ "}" +
"]}";
String result = PlainTextExtractUtils.extractPlainText(mapper, json);
@@ -26,7 +33,7 @@ void extractPlainText_fromContentArray() {
assertThat(result).isEqualTo(String.join("\n",
"Hello",
"[์ฌ์ง] cap",
- "[\"A\", \"B\"]",
+ "[2 columns]",
"[\"1\", \"2\"]",
"[\"3\", \"4\"]"));
}
@@ -60,5 +67,48 @@ void extractPlainText_imageWithoutCaption() {
void extractPlainText_invalidJson_throws() {
assertThrows(IllegalArgumentException.class, () -> PlainTextExtractUtils.extractPlainText(mapper, "not-json"));
}
-}
+ @Test
+ @DisplayName("ํ
์ด๋ธ ์
์์ rowspan/colspan (lowercase) ์ง์")
+ void extractPlainText_tableWithLowercaseSpans() {
+ String json = "{" +
+ "\"content\":[" +
+ "{\"type\":\"table\",\"columns\":[{\"width\":100},{\"width\":200}]," +
+ "\"rows\":[" +
+ "[{\"content\":[{\"type\":\"text\",\"value\":\"A\"}],\"rowspan\":2,\"colspan\":1}," +
+ "{\"content\":[{\"type\":\"text\",\"value\":\"B\"}],\"rowspan\":1,\"colspan\":1}]," +
+ "[]" +
+ "]" +
+ "}" +
+ "]}";
+
+ String result = PlainTextExtractUtils.extractPlainText(mapper, json);
+
+ assertThat(result).isEqualTo(String.join("\n",
+ "[2 columns]",
+ "[\"A\", \"B\"]",
+ "[\"\", \"\"]"));
+ }
+
+ @Test
+ @DisplayName("ํ
์ด๋ธ ์
์์ rowSpan/colSpan (camelCase) ์ง์")
+ void extractPlainText_tableWithCamelCaseSpans() {
+ String json = "{" +
+ "\"content\":[" +
+ "{\"type\":\"table\",\"columns\":[{\"width\":100},{\"width\":200}]," +
+ "\"rows\":[" +
+ "[{\"content\":[{\"type\":\"text\",\"value\":\"X\"}],\"rowSpan\":2,\"colSpan\":1}," +
+ "{\"content\":[{\"type\":\"text\",\"value\":\"Y\"}],\"rowSpan\":1,\"colSpan\":1}]," +
+ "[{\"content\":[{\"type\":\"text\",\"value\":\"C\"}],\"rowSpan\":1,\"colSpan\":1}]" +
+ "]" +
+ "}" +
+ "]}";
+
+ String result = PlainTextExtractUtils.extractPlainText(mapper, json);
+
+ assertThat(result).isEqualTo(String.join("\n",
+ "[2 columns]",
+ "[\"X\", \"Y\"]",
+ "[\"\", \"C\"]"));
+ }
+}
diff --git "a/\353\217\204\353\251\224\354\235\270\353\252\250\353\215\270.md" "b/\353\217\204\353\251\224\354\235\270\353\252\250\353\215\270.md"
index c39e7641..8e8e6277 100644
--- "a/\353\217\204\353\251\224\354\235\270\353\252\250\353\215\270.md"
+++ "b/\353\217\204\353\251\224\354\235\270\353\252\250\353\215\270.md"
@@ -1,113 +1,427 @@
# StarLight ๋๋ฉ์ธ ๋ชจ๋ธ
-## ์์๋ก ๋ฃ์ด๋์๊ฑฐ๋ผ์ ๋์ค์ ์์ ํ๋ฉด ๋ ๊ฒ ๊ฐ์์
-
-## ๋๋ฉ์ธ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
-1. ๋ฃ๊ณ ๋ฐฐ์ฐ๊ธฐ
-2. '์ค์ํ ๊ฒ'๋ค ์ฐพ๊ธฐ (๊ฐ๋
์๋ณ)
-3. '์ฐ๊ฒฐ ๊ณ ๋ฆฌ' ์ฐพ๊ธฐ (๊ด๊ณ ์ ์)
-4. '๊ฒ'๋ค์ ์ค๋ช
ํ๊ธฐ (์์ฑ ๋ฐ ๊ธฐ๋ณธ ํ์ ๋ช
์)
-5. ๊ทธ๋ ค๋ณด๊ธฐ (์๊ฐํ)
-6. ์ด์ผ๊ธฐ ํ๊ณ ๋ค๋ฌ๊ธฐ (๋ฐ๋ณต)
-
-## Splearn ๋๋ฉ์ธ
-- ์คํ๋ฐ์ ํ์์ด ๊ฐ์๋ฅผ ์๊ฐํ๋ ์จ๋ผ์ธ ์๋น์ค์ด๋ค.
-- ์คํ๋ฐ์ ์คํ๋ง ํ๋ ์์ํฌ์ ์ฒ ํ์ ๋ฐํ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ์ด์๋๋ฉฐ ๋ฐ์ ํ๋ ํ์ต ์ํ๊ณ๋ฅผ ๋ชฉํ๋ก ํ๋ค.
- ์ด ์ํ๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ํต์ฌ ๊ตฌ์ฑ ์์๋ ํ์ต(์ฑ์ฅ)ํ๋ ํ์์ด๋ค.
- - ๊ทธ๋์ ์ด๋ฆ์ด Spring + Learner = Splearn
- - ์ ์ฌํ ์ด๋ฆ์ผ๋ก ์ธํ๋ฐ์ด ์๋ค.
-- ์คํ๋ฐ์์ ํ๋ํ๊ธฐ ์ํด์๋ ํ์์ผ๋ก ๋ฑ๋กํด์ผ ํ๋ค.
- - ๋ค๋ง, ํ์์ด ๋๊ธฐ ์ ์๋ ์คํ๋ฐ์ ๋ํ ์๊ฐ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ดํด๋ณผ ์ ์๋ค.
- - ๊ฐ์๋ฅผ ์๊ฐํ๊ธฐ ์ํด์๋ ๋ฑ๋ก์ ์๋ฃํ๊ณ ํ๋ ๊ฐ๋ฅํ ํ์์ด ๋์ด์ผ ํ๋ค.
- - ๋ฑ๋ก ์ ์ฒญ์ ํ ๋ค ์ ํด์ง ์๊ฑด์ ์ถฉ์กฑํ๋ฉด ๋ฑ๋ก์ด ์๋ฃ๋๋ค.
- - ๋ฑ๋ก์ ์๋ฃํ ๊ฒฝ์ฐ์ ํ๋กํ ์ฃผ์, ์๊ธฐ ์๊ฐ๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ์์ ํ ์ ์๋ค.
- - ํ๋กํ ์ฃผ์๋ ์ํ๋ฒณ๊ณผ ์ซ์๋ก ๊ตฌ์ฑ๋ 15์๋ฆฌ ์ด๋ด์ ์ค๋ณต๋์ง ์์ ๊ฐ
- - ํํดํ ํ์์ ํ๋กํ ์ฃผ์์ ์๊ธฐ ์๊ฐ๋ ์์ ํ ์ ์๋ค.
- - ๋ฑ๋ก ์๊ฐ, ๋ฑ๋ก ์๋ฃ ์๊ฐ, ํํด ์๊ฐ์ ์ ์ฅํ๋ค.
-- ์ํ๋ ํ์์ ์์ ์ด ๊ฐ์ง ์ง์๊ณผ ๊ฒฝํ์ ๊ฐ์๋ผ๋ ํํ๋ก ๋ค๋ฅธ ํ์์๊ฒ ์ ๊ณตํ๋ ๊ฐ์ฌ๊ฐ ๋ ์๋ ์๋ค.
- - ํ์์ด ์ต์ด๋ก ๊ฐ์ฌ๊ฐ ๋๋ ค๋ฉด ๊ฐ์ฌ ์ ์ฒญ๊ณผ ์น์ธ ๊ณผ์ ์ ๊ฑฐ์น๋๋ก ํ๋ค.
- - ์น์ธ๋ ๊ฐ์ฌ๋ ๊ฐ์๋ฅผ ์์ฑํ๊ณ ๊ฒ์๋ฅผ ๊ฑฐ์ณ ๊ฐ์๋ฅผ ๊ณต๊ฐํ ์ ์๋ค.
- - ๊ณต๊ฐ๋ ๊ฐ์๋ ํ์์๊ฒ ๋
ธ์ถ๋๊ณ , ํ์์ ์ด ๊ฐ์๋ฅผ ์๊ฐํ ์ ์๋ค.
-- ์๊ฐ์ ๊ฐ์๋ฅผ ํ์ตํ๋ ๊ฒ์ ๋งํ๋ค. "๋ด๊ฐ ์๊ฐํ ๊ฐ์๋ a์ด๋ค. ๋๋ b ๊ฐ์ ์๊ฐ์ค์ด๋ค."
- - ์๊ฐ์ ์ํด์๋ ๋จผ์ ์๊ฐ ์ ์ฒญ์ด ํ์ํ๋ค.
- - ์๊ฐ ์ ์ฒญ์ ๊ฐ์์ ์๊ฐ ์๊ฑด์ ๋ฐ๋ผ์ ์ ์ฒญ์ ํด์ผ ํ๊ณ ์ดํ ์ถ๊ฐ ์ ์ฐจ๊ฐ ์๊ตฌ๋ ์ ์๋ค.
- - ์ผ๋ถ ๊ฐ์๋ ์๊ฐ ์ ์ฒญ๊ณผ ๋์์ ์๊ฐ์ด ๊ฐ๋ฅํ๋ค.
- - ์ด๋ค ๊ฐ์๋ ์๊ฐ ์ ์ฒญํ ๊ฐ์๋น ๊ฒฐ์ ๋ฅผ ์๋ฃํด์ผ ์๊ฐ์ด ๊ฐ๋ฅํ๋ค.
- - ๊ฐ์ฌ๋ ๊ฐ์ ์๊ฐ ๊ธฐ๊ฐ์ ์ ํ์ ๋ ์๋ ์๋ค.
-- ๊ฐ์๋ ์์, ๋ฌธ์์ ๊ฐ์ ์ปจํ
์ธ ๋ฅผ ๊ฐ์ง ํ๋ ์ด์์ ์์
์ผ๋ก ๊ตฌ์ฑ ๋๋ค.
- - ์์
์ ๊ฐฏ์๊ฐ ๋ง์ ์ ์๋ค. ๊ทธ๋์ ์์
์ ๋ค์ ์น์
์ผ๋ก ๊ตฌ๋ถํ๋ค.
- - ํ๋์ ๊ฐ์๋ ์ฌ๋ฌ ๊ฐ์ ์น์
๊ณผ ๊ฐ ์น์
์ ์ํ ์์
์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- - ์์
๊ณผ ์น์
์ ํ์ต ์์๋ฅผ ๊ฐ์ง๋ค.
- - ํ์ต ์ง๋๋ ๋งค ์์
๋จ์๋ก ๊ธฐ๋ก๋๋ค.
- - ๊ฐ์์ ๋ชจ๋ ์์
์ ํ์ต์ ๋ง์น๊ณ ์์
์ง๋๊ฐ 100%์ ๋๋ฌํ๋ฉด ๊ฐ์ ์๊ฐ์ ์๋ฃํ ๊ฒ์ด๋ค.
+
+## StarLight ๋๋ฉ์ธ
+- StarLight๋ ์ฐฝ์
์๊ฐ ์ฌ์
๊ณํ์๋ฅผ ์์ฑํ๊ณ , ์ ๋ฌธ๊ฐ์ ํผ๋๋ฐฑ๊ณผ AI ๋ถ์์ ๋ฐ์ ์ ์๋ ์๋น์ค์ด๋ค.
+- ์ฐฝ์
์(Member with MemberType.FOUNDER)๋ ์ฌ์
๊ณํ์๋ฅผ ์์ฑํ ์ ์๋ค.
+- ์ฌ์
๊ณํ์๋ 5๊ฐ์ ์ฃผ์ ์น์
(๊ฐ์, ๋ฌธ์ ์ธ์, ์คํ๊ฐ๋ฅ์ฑ, ์ฑ์ฅ์ ๋ต, ํ์ญ๋)์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ ์น์
์ ์ฌ๋ฌ ์๋ธ ์น์
์ผ๋ก ์ธ๋ถํ๋๋ค.
+- ์์ฑ๋ ์ฌ์
๊ณํ์์ ๋ํด AI๊ฐ ์๋์ผ๋ก ๋ถ์ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ ์ ์๋ค.
+- ์ฐฝ์
์๋ ์ ๋ฌธ๊ฐ์๊ฒ ํผ๋๋ฐฑ์ ์ ์ฒญํ ์ ์์ผ๋ฉฐ, ๋์ผํ ์ฌ์
๊ณํ์์ ๋ํด ๋์ผํ ์ ๋ฌธ๊ฐ์๊ฒ๋ 1ํ๋ง ์ ์ฒญ์ด ๊ฐ๋ฅํ๋ค.
+- ์ ๋ฌธ๊ฐ(Expert)๋ ํผ๋๋ฐฑ ์ ์ฒญ์ ๋ฐ์ผ๋ฉด 7์ผ ์ด๋ด์ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ์ฌ ์ ์ถํด์ผ ํ๋ค.
+- ์ ๋ฌธ๊ฐ ํผ๋๋ฐฑ ์ ์ฒญ์ ๊ฒฐ์ ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, ํ ์คํ์ด๋จผ์ธ ๋ฅผ ํตํด ์ฒ๋ฆฌ๋๋ค.
## ๋๋ฉ์ธ ๋ชจ๋ธ
---
-### [ ํผ๋๋ฐฑ ์ ์ฒญ ์ด๊ทธ๋ฆฌ๊ฑฐํธ ]
+### [ ํ์ ์ด๊ทธ๋ฆฌ๊ฑฐํธ ]
-### ํผ๋๋ฐฑ ์ ์ฒญ(ExpertApplication)
+### ํ์(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 register()`: ํ์ ๋ฑ๋ก: email, nickname, password, passwordEncoder
+- `static create()`: ์ผ๋ฐ ํ์ ์์ฑ (์ด๋ฆ, ์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ํ์ํ์
, ์ธ์ฆ์ ๋ณด, ํ๋กํ์ด๋ฏธ์ง)
+- `static newSocial()`: ์์
๋ก๊ทธ์ธ ํ์ ์์ฑ (์ด๋ฆ, ์ด๋ฉ์ผ, ์ ๊ณต์, ์ ๊ณต์ID, ์ ํ๋ฒํธ, ํ์ํ์
, ํ๋กํ์ด๋ฏธ์ง)
+- `updateProfileImage()`: ํ๋กํ ์ด๋ฏธ์ง ์
๋ฐ์ดํธ
+
#### ๊ท์น
-- ์ฌ์
๊ณํ์ 1๊ฐ๋น ์ฌ๋ฌ ์ ๋ฌธ๊ฐ์๊ฒ ํผ๋๋ฐฑ ์ ์ฒญ์ด ๊ฐ๋ฅํ๋ค.
-- 1๊ฐ์ ์ฌ์
๊ณํ์์ ๋ํด์ ๋์ผํ ์ ๋ฌธ๊ฐ์๊ฒ ์ค๋ณต ์ ์ฒญ ๋ถ๊ฐํ๋ค.(1ํ๋ง ํผ๋๋ฐฑ ์ ์ฒญ์ด ๊ฐ๋ฅํ๋ค)
+- ํ์์ FOUNDER(์ฐฝ์
์) ๋๋ EXPERT(์ ๋ฌธ๊ฐ) ํ์
์ค ํ๋๋ฅผ ๊ฐ์ง๋ค.
+- ์ํํธ ์ญ์ ๋ฅผ ์ง์ํ๋ค.
-### ํ์ ์์ธ(MemberDetail)
+### ์ธ์ฆ ์ ๋ณด(Credential)
_Entity_
+#### ์์ฑ
- `id`: `Long`
-- `profile`: ํ๋กํ ์ฃผ์. ๋ชจ๋ ํ์์ด ๊ณ ์ ํ ํ๋กํ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค
-- `introduction`: ์๊ธฐ ์๊ฐ
-- `registeredAt`: ๋ฑ๋ก ์ผ์
-- `activatedAt`: ๋ฑ๋ก ์๋ฃ ์ผ์
-- `deactivatedAt`: ํํด ์ผ์
-#### ํ์
-- `static create()`: ํ์ ๋ฑ๋ก. ํ์ฌ ์๊ฐ์ ๋ฑ๋ก ์ผ์๋ก ์ ์ฅํ๋ค.
-- `activate()`: ๋ฑ๋ก ์๋ฃ์ ๊ด๋ จ๋ ์์
์ํ. ๋ฑ๋ก ์๋ฃ ์ผ์ ์ ์ฅ.
-- `deactivate()`: ํํด์ ๊ด๋ จ๋ ์์
์์ . ํํด ์ผ์ ์ ์ฅ.
-- `updateInfo()`: ์์ธ ์ ๋ณด ์์
-
-### ํ์ ์ํ(MemberStatus)
+- `password`: `String` - ์ํธํ๋ ๋น๋ฐ๋ฒํธ
+
+#### ํ์
+- `static create()`: ์ธ์ฆ ์ ๋ณด ์์ฑ (์ํธํ๋ ๋น๋ฐ๋ฒํธ)
+
+### ํ์ ํ์
(MemberType)
_Enum_
#### ์์
-- `PENDING`: ๋ฑ๋ก ๋๊ธฐ
-- `ACTIVE`: ๋ฑ๋ก ์๋ฃ
-- `DEACTIVATED`: ํํด
+- `FOUNDER`: ์ฐฝ์
์
+- `EXPERT`: ์ ๋ฌธ๊ฐ
+
+---
+
+### [ ์ ๋ฌธ๊ฐ ์ด๊ทธ๋ฆฌ๊ฑฐํธ ]
+
+### ์ ๋ฌธ๊ฐ(Expert)
+_Aggregate Root_
+#### ์์ฑ
+- `id`: `Long`
+- `name`: `String` - ์ด๋ฆ
+- `email`: `String` - ์ด๋ฉ์ผ
+- `workedPeriod`: `Long` - ๊ฒฝ๋ ฅ ๊ธฐ๊ฐ
+- `profileImageUrl`: `String` - ํ๋กํ ์ด๋ฏธ์ง URL
+- `mentoringPriceWon`: `Integer` - ๋ฉํ ๋ง ๊ฐ๊ฒฉ (์)
+- `careers`: `List
` - ๊ฒฝ๋ ฅ ๋ชฉ๋ก
+- `tags`: `Set` - ํ๊ทธ ๋ชฉ๋ก
+- `categories`: `Set` - ์ ๋ฌธ ๋ถ์ผ ์นดํ
๊ณ ๋ฆฌ
+
+#### ๊ท์น
+- Member์ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๋ณ๋์ ์ํฐํฐ์ด๋ค.
-### DuplicateEmailException
-_Exception_
+### ์ ๋ฌธ๊ฐ ํ๊ทธ ์นดํ
๊ณ ๋ฆฌ(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` - ์ฐ๊ด๋ ์ฌ์
๊ณํ์
-### ๋น๋ฐ๋ฒํธ ์ธ์ฝ๋(PasswordEncoder)
-_Domain Service_
#### ํ์
-- `encode()`: ๋น๋ฐ๋ฒํธ ์ํธํํ๊ธฐ
-- `matches()`: ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋์ง ํ์ธ
+- `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`: ์ต์ข
์๋ฃ
-### ํ๋กํ ์ฃผ์(Profile)
+### ์์ JSON(RawJson)
_Value Object_
#### ์์ฑ
-- `address`: ํ๋กํ ์ฃผ์
+- `value`: `String` - JSON ๋ฌธ์์ด
+
+#### ํ์
+- `static create()`: RawJson ์์ฑ
---
-### Email
-_Value Object_
+### [ ํผ๋๋ฐฑ ์ ์ฒญ ์ด๊ทธ๋ฆฌ๊ฑฐํธ ]
+
+### ํผ๋๋ฐฑ ์ ์ฒญ(ExpertApplication)
+_Aggregate Root_
#### ์์ฑ
-- `address`: ์ด๋ฉ์ผ ์ฃผ์
+- `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` - ๋ฆฌํฌํธ ์์ธ ๋ชฉ๋ก (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` - ๊ฒฐ์ ๊ธฐ๋ก ๋ชฉ๋ก (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 ์์ฑ
+---
\ No newline at end of file
diff --git "a/\354\232\251\354\226\264\354\202\254\354\240\204.md" "b/\354\232\251\354\226\264\354\202\254\354\240\204.md"
index 71f8c9fa..a046a8eb 100644
--- "a/\354\232\251\354\226\264\354\202\254\354\240\204.md"
+++ "b/\354\232\251\354\226\264\354\202\254\354\240\204.md"
@@ -2,6 +2,29 @@
| **ํ๊ตญ์ด** | **์์ด** | **์ค๋ช
** |
|--------|---------|------------------------------------------|
-| ์ฐฝ์
์ | Founder | starLight ์๋น์ค๋ฅผ ์ด์ฉํ๋ ์ฌ์ฉ์๋ก ์ฌ์
๊ณํ์๋ฅผ ์์ฑํ ์ ์๋ค. |
-| ์ ๋ฌธ๊ฐ | Expert | ์ฌ์
๊ณํ์๋ฅผ ๊ฒํ ํ๋ ํ์. ์ ๋ฌธ๊ฐ๋ ํ์๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ค |
+| ์ฐฝ์
์ | Founder | StarLight ์๋น์ค๋ฅผ ์ด์ฉํ๋ ์ฌ์ฉ์๋ก ์ฌ์
๊ณํ์๋ฅผ ์์ฑํ ์ ์๋ค. MemberType.FOUNDER๋ฅผ ๊ฐ์ง ํ์์ด๋ค. |
+| ์ ๋ฌธ๊ฐ | Expert | ์ฌ์
๊ณํ์๋ฅผ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ํ์. Member์ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ๋ณ๋์ ์ํฐํฐ์ด๋ค. |
+| ํ์ | Member | StarLight ์๋น์ค๋ฅผ ์ด์ฉํ๋ ๋ชจ๋ ์ฌ์ฉ์. |
+| ์ฌ์
๊ณํ์ | BusinessPlan | ์ฐฝ์
์๊ฐ ์์ฑํ๋ ์ฌ์
๊ณํ์. 5๊ฐ์ ์ฃผ์ ์น์
(๊ฐ์, ๋ฌธ์ ์ธ์, ์คํ๊ฐ๋ฅ์ฑ, ์ฑ์ฅ์ ๋ต, ํ์ญ๋)์ผ๋ก ๊ตฌ์ฑ๋๋ค. |
+| ์น์
| Section | ์ฌ์
๊ณํ์๋ฅผ ๊ตฌ์ฑํ๋ 5๊ฐ์ ์ฃผ์ ์์ญ. Overview, ProblemRecognition, Feasibility, GrowthTactic, TeamCompetence๊ฐ ์๋ค. |
+| ์๋ธ ์น์
| SubSection | ๊ฐ ์น์
์ ์ธ๋ถ ํญ๋ชฉ. ๋ด์ฉ, ์๋ณธ JSON ๋ฐ์ดํฐ, ์ฒดํฌ๋ฆฌ์คํธ(5๊ฐ ํญ๋ชฉ)๋ฅผ ํฌํจํ๋ค. |
+| ๊ฐ์ | Overview | ์ฌ์
๊ณํ์์ ์ฒซ ๋ฒ์งธ ์น์
. ์ฌ์
์ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ๋ด๋๋ค. |
+| ๋ฌธ์ ์ธ์ | ProblemRecognition | ์ฌ์
๊ณํ์์ ๋ ๋ฒ์งธ ์น์
. ์ฐฝ์
๋ฐฐ๊ฒฝ, ๊ฐ๋ฐ ๋๊ธฐ, ๋ชฉ์ ๋ฐ ํ์์ฑ, ๋ชฉํ์์ฅ ๋ถ์์ ํฌํจํ๋ค. |
+| ์คํ ๊ฐ๋ฅ์ฑ | Feasibility | ์ฌ์
๊ณํ์์ ์ธ ๋ฒ์งธ ์น์
. ์ฌ์
ํ ์ ๋ต, ์์ฅ๋ถ์ ๋ฐ ๊ฒฝ์๋ ฅ ํ๋ณด ๋ฐฉ์์ ํฌํจํ๋ค. |
+| ์ฑ์ฅ ์ ๋ต | GrowthTactic | ์ฌ์
๊ณํ์์ ๋ค ๋ฒ์งธ ์น์
. ๋น์ฆ๋์ค ๋ชจ๋ธ, ์๊ธ์กฐ๋ฌ ๊ณํ, ์์ฅ์ง์
๋ฐ ์ฑ๊ณผ์ฐฝ์ถ ์ ๋ต์ ํฌํจํ๋ค. |
+| ํ ์ญ๋ | TeamCompetence | ์ฌ์
๊ณํ์์ ๋ค์ฏ ๋ฒ์งธ ์น์
. ์ฐฝ์
์์ ์ญ๋, ํ ์ญ๋์ ํฌํจํ๋ค. |
+| ํผ๋๋ฐฑ ์ ์ฒญ | ExpertApplication | ์ฐฝ์
์๊ฐ ํน์ ์ ๋ฌธ๊ฐ์๊ฒ ์์ ์ ์ฌ์
๊ณํ์์ ๋ํ ํผ๋๋ฐฑ์ ์์ฒญํ๋ ์ ์ฒญ. ๋์ผํ ์ฌ์
๊ณํ์์ ๋ํด ๋์ผํ ์ ๋ฌธ๊ฐ์๊ฒ๋ 1ํ๋ง ์ ์ฒญ ๊ฐ๋ฅํ๋ค. |
+| ์ ๋ฌธ๊ฐ ๋ฆฌํฌํธ | ExpertReport | ์ ๋ฌธ๊ฐ๊ฐ ์ฌ์
๊ณํ์์ ๋ํ ํผ๋๋ฐฑ์ ์์ฑํ ๋ฆฌํฌํธ. ์ ์ฒด ์ฝ๋ฉํธ์ ๊ฐ ์น์
๋ณ ์์ธ ์ฝ๋ฉํธ(๊ฐ์ /์ฝ์ )๋ฅผ ํฌํจํ๋ค. 7์ผ์ ํ๊ฐ ๊ธฐํ์ ๊ฐ์ง๋ค. |
+| ๋ฆฌํฌํธ ์์ธ | ExpertReportDetail | ์ ๋ฌธ๊ฐ ๋ฆฌํฌํธ์ ์ธ๋ถ ๋ด์ฉ. ๊ฐ์ (STRENGTH) ๋๋ ์ฝ์ (WEAKNESS) ํ์
์ ์ฝ๋ฉํธ๋ฅผ ํฌํจํ๋ค. |
+| AI ๋ฆฌํฌํธ | AiReport | AI๊ฐ ์ฌ์
๊ณํ์๋ฅผ ๋ถ์ํ์ฌ ์๋์ผ๋ก ์์ฑํ ๋ฆฌํฌํธ. JSON ํํ๋ก ์ ์ฅ๋๋ค. |
+| ์ฃผ๋ฌธ | Orders | ์ ๋ฌธ๊ฐ ํผ๋๋ฐฑ ์ ์ฒญ์ ์ํ ๊ฒฐ์ ์ฃผ๋ฌธ. ํ ์คํ์ด๋จผ์ธ ๋ฅผ ํตํด ๊ฒฐ์ ๋ฅผ ์ฒ๋ฆฌํ๋ค. |
+| ๊ฒฐ์ ๊ธฐ๋ก | PaymentRecords | ์ฃผ๋ฌธ์ ๋ํ ๊ฒฐ์ ์๋ ๋ฐ ์๋ฃ ๊ธฐ๋ก. ์ฌ๋ฌ ๋ฒ์ ๊ฒฐ์ ์๋๋ฅผ ๊ธฐ๋กํ ์ ์๋ค. |
+| ์ฌ์ฉ ํฌ๋ ๋ง | UsageCredit | ์ ๋ฌธ๊ฐ ํผ๋๋ฐฑ ์ ์ฒญ์ ์ฌ์ฉํ๋ ํฌ๋ ๋ง(์ด์ฉ๊ถ). 1ํ๊ถ, 2ํ๊ถ ๋ฑ์ ์ํ์ด ์๋ค. |
+| ์ฌ์
๊ณํ์ ์ํ | PlanStatus | ์ฌ์
๊ณํ์์ ์งํ ์ํ. STARTED(์์๋จ), WRITTEN_COMPLETED(์์ฑ ์๋ฃ), AI_REVIEWED(AI ๋ฆฌ๋ทฐ ์๋ฃ), EXPERT_MATCHED(์ ๋ฌธ๊ฐ ๋งค์นญ ์๋ฃ), FINALIZED(์ต์ข
์๋ฃ)๊ฐ ์๋ค. |
+| ์ ์ถ ์ํ | SubmitStatus | ์ ๋ฌธ๊ฐ ๋ฆฌํฌํธ์ ์ ์ถ ์ํ. PENDING(ํ๊ฐ ์ ), TEMPORARY_SAVED(์์ ์ ์ฅ), SUBMITTED(์ ์ถ ์๋ฃ), EXPIRED(๋ง๋ฃ๋จ)๊ฐ ์๋ค. |
+| ์ฝ๋ฉํธ ํ์
| CommentType | ์ ๋ฌธ๊ฐ ๋ฆฌํฌํธ ์์ธ์ ์ฝ๋ฉํธ ํ์
. STRENGTH(๊ฐ์ ), WEAKNESS(์ฝ์ )์ด ์๋ค. |
+| ์ ๋ฌธ๊ฐ ํ๊ทธ ์นดํ
๊ณ ๋ฆฌ | TagCategory | ์ ๋ฌธ๊ฐ์ ์ ๋ฌธ ๋ถ์ผ ์นดํ
๊ณ ๋ฆฌ. MARKET_BM(์์ฅ์ฑ/BM), TEAM_CAPABILITY(ํ ์ญ๋), PROBLEM_DEFINITION(๋ฌธ์ ์ ์), GROWTH_STRATEGY(์ฑ์ฅ ์ ๋ต), METRIC_DATA(์งํ/๋ฐ์ดํฐ)๊ฐ ์๋ค. |
+| ์ฃผ๋ฌธ ์ํ | OrderStatus | ์ฃผ๋ฌธ์ ๊ฒฐ์ ์ํ. NEW(์ฃผ๋ฌธ ์์ฑ๋จ, ๊ฒฐ์ ์ ), PAID(๊ฒฐ์ ์๋ฃ), CANCELED(์ฃผ๋ฌธ/๊ฒฐ์ ์ทจ์)๊ฐ ์๋ค. |
+| ์ธ์ฆ ์ ๋ณด | Credential | ํ์์ ๋น๋ฐ๋ฒํธ ๋ฑ ์ธ์ฆ ๊ด๋ จ ์ ๋ณด. Member์ 1:1 ๊ด๊ณ์ด๋ค. |
+| ์์ JSON | RawJson | ์๋ณธ ๋ฐ์ดํฐ๋ฅผ JSON ํํ๋ก ์ ์ฅํ๊ธฐ ์ํ ๊ฐ ๊ฐ์ฒด. |