@things-factory/integration-headless 8.0.0-beta.9 โ 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/connector/headless-connector.d.ts +14 -0
- package/dist-server/engine/connector/headless-connector.js +54 -0
- package/dist-server/engine/connector/headless-connector.js.map +1 -0
- package/dist-server/engine/connector/headless-pool.d.ts +3 -0
- package/dist-server/engine/connector/headless-pool.js +63 -0
- package/dist-server/engine/connector/headless-pool.js.map +1 -0
- package/dist-server/engine/connector/index.d.ts +1 -0
- package/dist-server/engine/connector/index.js +4 -0
- package/dist-server/engine/connector/index.js.map +1 -0
- package/dist-server/engine/index.d.ts +1 -0
- package/dist-server/engine/index.js +1 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/pdf-capture-util.d.ts +1 -1
- package/dist-server/engine/task/pdf-capture-util.js +3 -3
- package/dist-server/engine/task/pdf-capture-util.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/connector/headless-connector.ja.md +31 -183
- package/helps/integration/connector/headless-connector.ko.md +32 -177
- package/helps/integration/connector/headless-connector.md +31 -178
- package/helps/integration/connector/headless-connector.ms.md +32 -180
- package/helps/integration/connector/headless-connector.zh.md +31 -178
- package/package.json +6 -6
- package/server/engine/connector/headless-connector.ts +68 -0
- package/server/engine/connector/headless-pool.ts +69 -0
- package/server/engine/connector/index.ts +1 -0
- package/server/engine/index.ts +2 -0
- package/server/engine/task/headless-pdf-capture-board.ts +182 -0
- package/server/engine/task/headless-pdf-capture-markdown.ts +47 -0
- package/server/engine/task/headless-pdf-capture.ts +39 -0
- package/server/engine/task/headless-pdf-open.ts +98 -0
- package/server/engine/task/headless-pdf-save.ts +88 -0
- package/server/engine/task/index.ts +9 -0
- package/server/engine/task/pdf-capture-util.ts +331 -0
- package/server/index.ts +3 -0
- package/server/tsconfig.json +10 -0
|
@@ -1,172 +1,57 @@
|
|
|
1
|
-
###
|
|
1
|
+
### ใใใใฌในใใผใซใณใใฏใฟ (Headless Pool Connector)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
่คๆฐใฎใใฉใฆใถใปใใทใงใณใ็ฎก็ใใใปใใทใงใณใฎ็ถญๆใใฏใใญใผใฎๅฆ็ใAPIใใผในใฎใญใฐใคใณใชใฉใซๅฏพๅฟใใฆใใพใใ
|
|
3
|
+
**ใใใใฌในใใผใซใณใใฏใฟ**ใฏใใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎใใผใซใ็ฎก็ใใใใใซ่จญ่จใใใฆใใพใใใใฎใณใใฏใฟใฏใPDFใฎ็ๆใใฆใงใในใฏใฌใคใใณใฐใฎใใใซใ่คๆฐใฎใใใใฌในใใฉใฆใถใปใใทใงใณใๅๆใซๅฎ่กใใๅฟ
่ฆใใใไฝๆฅญใซไพฟๅฉใงใใใใฎใณใใฏใฟใฏใใใใใฎใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎไฝๆใไฝฟ็จใใใใณ็ ดๆฃใๅน็็ใซ็ฎก็ใใพใใ
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
#### ใจใณใใใคใณใ
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
`ใใใใฌในใใผใซใณใใฏใฟ`ใฏ็นๅฎใฎใจใณใใใคใณใใ่ฆๆฑใใพใใใใๆฅ็ถ่จญๅฎใฎไธ็ฐใจใใฆURIใๆไพใงใใพใใใใฎURIใฏ้ๅธธใใฌใผในใใซใใผใจใใฆไฝฟ็จใใใใใผใซใๅ
้จ็ใซๅฎ้ใฎๆฅ็ถใๅฆ็ใใพใใใคใพใใใจใณใใใคใณใใซใฏไปปๆใฎๆๅญๅใๅ
ฅๅใใใใจใใงใใพใใ
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
ไพใใฐใ`https://example.com` ใๅ
ฅๅใใใจใใใฎใฆใงใใตใคใใฎใณใณใใณใใๅๅพใงใใพใใ
|
|
12
|
-
ๅ
้จใณใณใใณใใใPDFใ็ๆใใๅ ดๅใฏใ`localhost` ใไฝฟ็จใงใใพใใ
|
|
9
|
+
#### ใใฉใกใผใฟ
|
|
13
10
|
|
|
14
|
-
|
|
11
|
+
- **min** (ๆฐๅญ):
|
|
12
|
+
- ใใผใซๅ
ใง็ถญๆใใๆๅฐใฎใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎๆฐใๆๅฎใใพใใ
|
|
13
|
+
- ใใใฉใซใๅค: `2`
|
|
14
|
+
- **max** (ๆฐๅญ):
|
|
15
|
+
- ใใผใซใๅฆ็ใงใใๆๅคงใฎใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎๆฐใๆๅฎใใพใใ
|
|
16
|
+
- ใใใฉใซใๅค: `10`
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
ใใใใฎใใฉใกใผใฟใฏใไบๆณใใใไฝๆฅญ่ฒ ่ทใซๅฟใใฆใใผใซใฎใตใคใบใ่ชฟๆดใงใใใใใซใใพใใไพใใฐใใขใใชใฑใผใทใงใณใๅๆใซ่คๆฐใฎใใฉใฆใถใคใณในใฟใณในใ้ ป็นใซๅฟ
่ฆใจใใๅ ดๅใ`max`ๅคใๅขใใใใจใใงใใพใใ
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
| ใใฉใกใผใฟใผ | ใฟใคใ | ่ชฌๆ | ใใใฉใซใๅค |
|
|
21
|
-
| -------------------- | -------- | ----------------------------------------------- | ------------- |
|
|
22
|
-
| `username` | `string` | ใญใฐใคใณID (ใฆใผใถใผๅ) | `""` |
|
|
23
|
-
| `password` | `string` | ใญใฐใคใณ็จใในใฏใผใ | `""` |
|
|
24
|
-
| `loginPagePath` | `string` | ใญใฐใคใณใใผใธใฎใใน (ไพ: `/login`) | `"/login"` |
|
|
25
|
-
| `loginApiUrl` | `string` | ใญใฐใคใณAPIใฎใจใณใใใคใณใ (ๅฟ
่ฆใชๅ ดๅใฎใฟ) | `null` |
|
|
26
|
-
| `usernameSelector` | `string` | ใฆใผใถใผๅๅ
ฅๅๆฌใฎCSSใปใฌใฏใฟใผ | `"#username"` |
|
|
27
|
-
| `passwordSelector` | `string` | ใในใฏใผใๅ
ฅๅๆฌใฎCSSใปใฌใฏใฟใผ | `"#password"` |
|
|
28
|
-
| `submitSelector` | `string` | ใญใฐใคใณใใฟใณใฎCSSใปใฌใฏใฟใผ | `"#submit"` |
|
|
29
|
-
| `successSelector` | `string` | ใญใฐใคใณๆๅใ็ขบ่ชใใใใใฎ่ฆ็ด ใฎCSSใปใฌใฏใฟใผ | `null` |
|
|
30
|
-
| `shadowDomSelectors` | `string` | Shadow DOM ๅ
ใฎ่ฆ็ด ใๆๅฎ (ใซใณใๅบๅใ) | `""` |
|
|
31
|
-
| `timeout` | `number` | ใญใฐใคใณใใใผใธ่ชญใฟ่พผใฟใฎใฟใคใ ใขใฆใๆ้ (ms) | `15000` |
|
|
32
|
-
| `retries` | `number` | ใญใฐใคใณใฎ่ฉฆ่กๅๆฐ | `3` |
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## ๐ 3. `loginApiUrl` ใฎ่ฉณ็ดฐ่ชฌๆ
|
|
37
|
-
|
|
38
|
-
### ๐น `loginApiUrl`ใจใฏ๏ผ
|
|
39
|
-
|
|
40
|
-
`loginApiUrl` ใฏใใฆใงใใตใคใใ **APIใใผในใฎใญใฐใคใณ** ใไฝฟ็จใใๅ ดๅใซ่จญๅฎใใใใฉใกใผใฟใผใงใใ
|
|
41
|
-
ใตใคใใซใใฃใฆใฏใใญใฐใคใณใใผใธใงใใฉใผใ ้ไฟกใใไปฃใใใซใใใใฏใจใณใใฎAPIใ็ดๆฅๅผใณๅบใใฆใญใฐใคใณใใไป็ตใฟใๆใฃใฆใใพใใ
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
### โ
`loginApiUrl` ใ **่จญๅฎใใชใๅ ดๅ (`null`)**
|
|
46
|
-
|
|
47
|
-
ใใฎๅ ดๅใ**HTMLใใฉใผใ ใไฝฟ็จใใใญใฐใคใณๆนๅผ** ใๆก็จใใพใใ
|
|
48
|
-
ใใใใฌในใใฉใฆใถใ่ชๅ็ใซใฆใผใถใผๅใจใในใฏใผใใๅ
ฅๅใใใใฉใผใ ใ้ไฟกใใพใใ
|
|
49
|
-
|
|
50
|
-
#### ๐ ไพ (HTMLใใฉใผใ ใญใฐใคใณ)
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"endpoint": "https://example.com",
|
|
55
|
-
"params": {
|
|
56
|
-
"username": "user123",
|
|
57
|
-
"password": "securepassword",
|
|
58
|
-
"loginPagePath": "/login",
|
|
59
|
-
"usernameSelector": "#username",
|
|
60
|
-
"passwordSelector": "#password",
|
|
61
|
-
"submitSelector": "#submit-button",
|
|
62
|
-
"successSelector": ".dashboard"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
#### ๐ ๅไฝใฎๆตใ:
|
|
68
|
-
|
|
69
|
-
1. `https://example.com/login` ใซ็งปๅ
|
|
70
|
-
2. `#username` ใจ `#password` ใซใญใฐใคใณๆ
ๅ ฑใๅ
ฅๅ
|
|
71
|
-
3. `#submit-button` ใใฏใชใใฏใใฆใใฉใผใ ้ไฟก
|
|
72
|
-
4. `.dashboard` ่ฆ็ด ใฎๆ็กใงใญใฐใคใณๆๅใๅคๆญ
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### โ
`loginApiUrl` ใ **่จญๅฎใใๅ ดๅ**
|
|
77
|
-
|
|
78
|
-
ใใฎๅ ดๅใใตใคใใ **APIใใผในใฎ่ช่จผ** ใไฝฟ็จใใฆใใใใใ`loginApiUrl` ใๆ็คบ็ใซ่จญๅฎใใๅฟ
่ฆใใใใพใใ
|
|
79
|
-
ไพใใฐใใญใฐใคใณAPIใ `/api/auth/login` ใฎๅ ดๅใใใฎURLใๆๅฎใใพใใ
|
|
80
|
-
|
|
81
|
-
#### ๐ ไพ (APIใใผในใฎใญใฐใคใณ)
|
|
82
|
-
|
|
83
|
-
```json
|
|
84
|
-
{
|
|
85
|
-
"endpoint": "https://example.com",
|
|
86
|
-
"params": {
|
|
87
|
-
"username": "user123",
|
|
88
|
-
"password": "securepassword",
|
|
89
|
-
"loginPagePath": "/login",
|
|
90
|
-
"loginApiUrl": "/api/auth/login",
|
|
91
|
-
"usernameSelector": "#username",
|
|
92
|
-
"passwordSelector": "#password",
|
|
93
|
-
"submitSelector": "#submit-button",
|
|
94
|
-
"successSelector": ".dashboard"
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
#### ๐ ๅไฝใฎๆตใ:
|
|
100
|
-
|
|
101
|
-
1. `https://example.com/api/auth/login` ใซ **POSTใชใฏใจในใ** ใ้ไฟก
|
|
102
|
-
2. ใตใผใใผใใใฌในใใณในใๅใๅใใใปใใทใงใณใฎใฏใใญใผใไฟๅญ
|
|
103
|
-
3. ใกใคใณใใผใธใธ็งปๅใใ`.dashboard` ใฎๅญๅจใ็ขบ่ช
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## ๐ 4. ่จญๅฎไพ
|
|
20
|
+
#### ่จญๅฎไพ
|
|
108
21
|
|
|
109
22
|
```json
|
|
110
23
|
{
|
|
111
|
-
"name": "headless-browser-
|
|
24
|
+
"name": "headless-browser-pool",
|
|
112
25
|
"connector": "headless-connector",
|
|
113
|
-
"endpoint": "
|
|
26
|
+
"endpoint": "1",
|
|
114
27
|
"params": {
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"loginPagePath": "/login",
|
|
118
|
-
"loginApiUrl": "/api/auth/login",
|
|
119
|
-
"usernameSelector": "#username",
|
|
120
|
-
"passwordSelector": "#password",
|
|
121
|
-
"submitSelector": "#submit",
|
|
122
|
-
"successSelector": ".dashboard",
|
|
123
|
-
"timeout": 20000,
|
|
124
|
-
"retries": 5
|
|
28
|
+
"min": 5,
|
|
29
|
+
"max": 20
|
|
125
30
|
}
|
|
126
31
|
}
|
|
127
32
|
```
|
|
128
33
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
## ๐ 5. ๆฅ็ถใฎใฉใคใใตใคใฏใซ (Connection Lifecycle)
|
|
34
|
+
ไธ่จใฎไพใงใฏใใใผใซใฏๅฐใชใใจใ5ใคใฎใใใใฌในใใฉใฆใถใคใณในใฟใณในใ็ถญๆใใๅฟ
่ฆใซๅฟใใฆๆๅคง20ใคใณในใฟใณในใพใงๆกๅผตใใใใจใใงใใพใใ
|
|
132
35
|
|
|
133
|
-
|
|
36
|
+
#### ๆฅ็ถใฉใคใใตใคใฏใซ
|
|
134
37
|
|
|
135
|
-
|
|
136
|
-
- ใปใใทใงใณใ็ถญๆใใใฏใใญใผใไฟๅญใใฆๅพ็ถใฎใชใฏใจในใใงๅๅฉ็จใใพใใ
|
|
38
|
+
- **connect**:
|
|
137
39
|
|
|
138
|
-
-
|
|
139
|
-
-
|
|
40
|
+
- ๆฅ็ถใๅๆๅใใ่จญๅฎใใใใใฉใกใผใฟ(`min`ใใใณ`max`)ใซๅพใฃใฆใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎใใผใซใไฝๆใใพใใ
|
|
41
|
+
- ใใผใซใฏใใใใฎใคใณในใฟใณในใฎใฉใคใใตใคใฏใซใ่ชๅ็ใซ็ฎก็ใใๅฟ
่ฆใซๅฟใใฆๆฐใใใคใณในใฟใณในใไฝๆใใๆขๅญใฎใคใณในใฟใณในใๅๅฉ็จใใพใใ
|
|
140
42
|
|
|
141
|
-
|
|
43
|
+
- **disconnect**:
|
|
44
|
+
- ใใใใฌในใใฉใฆใถใใผใซใ็ ดๆฃใใใในใฆใฎใคใณในใฟใณในใ้ฉๅใซ็ตไบใใใชใฝใผในใ่งฃๆพใใใใใใซใใพใใ
|
|
142
45
|
|
|
143
|
-
|
|
46
|
+
#### ไฝฟ็จใทใใชใช
|
|
144
47
|
|
|
145
|
-
|
|
146
|
-
| ---------------------- | -------------------------------------- |
|
|
147
|
-
| `headless-pdf-capture` | HTMLใPDFใซๅคๆใใ |
|
|
148
|
-
| `headless-scrap` | ใฆใงใใใผใธใใ็นๅฎใใผใฟใๆฝๅบใใ |
|
|
149
|
-
| `headless-post` | ใใฉใผใ ๅ
ฅๅใ่ชๅๅใใ้ไฟกใๅฎ่กใใ |
|
|
48
|
+
`ใใใใฌในใใผใซใณใใฏใฟ`ใฏใใใใใฌในใใฉใฆใถ็ฐๅขใงไฝๆฅญใๅฎ่กใใๅฟ
่ฆใใใใทใใชใชใงไธปใซไฝฟ็จใใใพใใไพใใฐใHTMLใณใณใใณใใใPDFใ็ๆใใใใใฆใงใใใผใธใฎในใฏใชใผใณใทใงใใใใญใฃใใใฃใใใใใฆใงใใตใคใใใใใผใฟใในใฏใฌใคใใณใฐใใ้ใซไพฟๅฉใงใใ
|
|
150
49
|
|
|
151
|
-
####
|
|
50
|
+
#### ใตใใผใใใใฟในใฏ
|
|
152
51
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
```json
|
|
156
|
-
{
|
|
157
|
-
"name": "scrape-data",
|
|
158
|
-
"taskType": "headless-scrap",
|
|
159
|
-
"params": {
|
|
160
|
-
"path": "/products",
|
|
161
|
-
"selectors": [
|
|
162
|
-
{ "text": "ๅๅๅ", "value": ".product-title" },
|
|
163
|
-
{ "text": "ไพกๆ ผ", "value": ".product-price" }
|
|
164
|
-
]
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
```
|
|
52
|
+
`ใใใใฌในใใผใซใณใใฏใฟ`ใฏ `headless-pdf` ใใฌใใฃใใฏในใฎไปใใใฟในใฏใใตใใผใใใพใใใใใใฎใฟในใฏใฏใใใฎใณใใฏใฟใ็ฎก็ใใใใใใฌในใใฉใฆใถใคใณในใฟใณในใไฝฟ็จใใพใใ
|
|
168
53
|
|
|
169
|
-
|
|
54
|
+
#### ใฟในใฏใงใฎไฝฟ็จไพ
|
|
170
55
|
|
|
171
56
|
```json
|
|
172
57
|
{
|
|
@@ -181,43 +66,6 @@
|
|
|
181
66
|
}
|
|
182
67
|
```
|
|
183
68
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
```json
|
|
187
|
-
{
|
|
188
|
-
"name": "submit-form",
|
|
189
|
-
"taskType": "headless-post",
|
|
190
|
-
"params": {
|
|
191
|
-
"formPath": "/contact",
|
|
192
|
-
"fields": {
|
|
193
|
-
"#name": "็ฐไธญ ๅคช้",
|
|
194
|
-
"#email": "tanaka@example.com",
|
|
195
|
-
"#message": "ใใใซใกใฏใใใใฏใในใใกใใปใผใธใงใ๏ผ"
|
|
196
|
-
},
|
|
197
|
-
"submitSelector": "#submit-button"
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## ๐ข 7. ่ชฌๆ (Description)
|
|
205
|
-
|
|
206
|
-
**ใใใใฌในใณใใฏใฟใผ** ใฏ **ใฆใงใในใฏใฌใคใใณใฐใ่ชๅใญใฐใคใณใPDF็ๆใใใฉใผใ ้ไฟก** ใชใฉใ
|
|
207
|
-
ๅน็็ใซๅฎ่กใใใใใฎๅผทๅใชใใผใซใงใใ
|
|
208
|
-
**HTMLใใผในใฎใญใฐใคใณ** ใจ **APIใใผในใฎใญใฐใคใณ** ใฎไธกๆนใซๅฏพๅฟใใใใพใใพใชใตใคใใงใฎ่ช่จผๅฆ็ใๅฏ่ฝใงใใ
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
### ๐ ใพใจใ
|
|
213
|
-
|
|
214
|
-
| ๆฉ่ฝ | ่ชฌๆ |
|
|
215
|
-
| ------------------------ | -------------------------------------- |
|
|
216
|
-
| **HTMLใใฉใผใ ใญใฐใคใณ** | ใฆใผใถใผๆไฝใใทใใฅใฌใผใใใฆใญใฐใคใณ |
|
|
217
|
-
| **APIใญใฐใคใณ** | APIใชใฏใจในใใง็ดๆฅใญใฐใคใณ (้ซ้) |
|
|
218
|
-
| **ใปใใทใงใณ็ฎก็** | ใฏใใญใผใไฟๅญใใใปใใทใงใณใ็ถญๆ |
|
|
219
|
-
| **ใฆใงใในใฏใฌใคใใณใฐ** | ๆๅฎใใใณใณใใณใใๆฝๅบใใฆๅๅพ |
|
|
220
|
-
| **PDFๅคๆ** | HTMLใใผใธใPDFใซๅคๆ |
|
|
221
|
-
| **ใใฉใผใ ้ไฟก** | ่ชๅ็ใซใใฉใผใ ๅ
ฅๅ๏ผ้ไฟกใๅฎ่ก |
|
|
69
|
+
#### ่ชฌๆ
|
|
222
70
|
|
|
223
|
-
|
|
71
|
+
**ใใใใฌในใใผใซใณใใฏใฟ**ใฏใPDF็ๆใใฆใงใในใฏใฌใคใใณใฐใชใฉใฎไฝๆฅญใๅน็็ใซๅฎ่กใใใใใซใใใใใฌในใใฉใฆใถใคใณในใฟใณในใฎใใผใซใ็ฎก็ใใ้ซ่ฒ ่ทใชใทใใชใชใงใฎใชใฝใผในๅฉ็จใฎๆ้ฉๅใจๆกๅผตๆงใไฟ่จผใใพใใ
|
|
@@ -1,166 +1,58 @@
|
|
|
1
|
-
###
|
|
1
|
+
### ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ (Headless Pool Connector)
|
|
2
2
|
|
|
3
|
-
**ํค๋๋ฆฌ์ค ์ปค๋ฅํฐ**๋ ํค๋๋ฆฌ์ค
|
|
4
|
-
์ฌ๋ฌ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ธ์
์ ๊ด๋ฆฌํ๋ฉฐ, ์ธ์
์ ์ง, ์ฟ ํค ํ์ฉ, API ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
|
|
3
|
+
**ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ**๋ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค์ ํ(pool)์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. ์ด ์ปค๋ฅํฐ๋ PDF ์์ฑ์ด๋ ์น ์คํฌ๋ํ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์
์ด ๋์์ ํ์ํ ์์
์ ์ํํ ๋ ์ ์ฉํฉ๋๋ค. ์ด ์ปค๋ฅํฐ๋ ์ด ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค์ ์์ฑ, ์ฌ์ฉ ๋ฐ ํ๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
#### ์๋ํฌ์ธํธ
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
`ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ`๋ ํน์ ์๋ํฌ์ธํธ๋ฅผ ์๊ตฌํ์ง ์์ง๋ง, ์ฐ๊ฒฐ ์ค์ ์ ์ผํ์ผ๋ก URI๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด URI๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ด์คํ๋๋ก ์ฌ์ฉ๋๋ฉฐ, ํ์ ๋ด๋ถ์ ์ผ๋ก ์ค์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
|
|
8
|
+
์ฆ, ์ํธํฌ์ธํธ๋ ์์์ ๋ฌธ์์ด์ ์
๋ ฅํ์๋ฉด ๋ฉ๋๋ค.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
์๋ฅผ ๋ค์ด, `https://example.com`๊ณผ ๊ฐ์ ์น์ฌ์ดํธ์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ด๋ถ ์ปจํ
์ธ ๋ก PDF ํ์ผ์ ์์ฑํ๋ ค๋ฉด `localhost`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
|
|
10
|
+
#### ๋งค๊ฐ๋ณ์
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
- **min** (์ซ์):
|
|
13
|
+
- ํ์์ ์ ์งํ ์ต์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค ์๋ฅผ ์ง์ ํฉ๋๋ค.
|
|
14
|
+
- ๊ธฐ๋ณธ๊ฐ: `2`
|
|
15
|
+
- **max** (์ซ์):
|
|
16
|
+
- ํ์ด ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค ์๋ฅผ ์ง์ ํฉ๋๋ค.
|
|
17
|
+
- ๊ธฐ๋ณธ๊ฐ: `10`
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
์ด ๋งค๊ฐ๋ณ์๋ค์ ์์๋๋ ์์
๋ถํ์ ๋ง์ถฐ ํ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฃผ ๋์์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ `max` ๊ฐ์ ๋๋ฆด ์ ์์ต๋๋ค.
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| ๋งค๊ฐ๋ณ์ | ํ์
| ์ค๋ช
| ๊ธฐ๋ณธ๊ฐ |
|
|
20
|
-
| -------------------- | -------- | --------------------------------------------------------------- | ------------- |
|
|
21
|
-
| `username` | `string` | ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ด๋ฆ (์์ด๋) | `""` |
|
|
22
|
-
| `password` | `string` | ๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ | `""` |
|
|
23
|
-
| `loginPagePath` | `string` | ๋ก๊ทธ์ธ ํ์ด์ง์ ๊ฒฝ๋ก (์: `/login`) | `"/login"` |
|
|
24
|
-
| `loginApiUrl` | `string` | ๋ก๊ทธ์ธ API ์๋ํฌ์ธํธ (์์ผ๋ฉด `null`) | `null` |
|
|
25
|
-
| `usernameSelector` | `string` | ๋ก๊ทธ์ธ ํผ์ ์ฌ์ฉ์๋ช
์
๋ ฅ ํ๋ CSS ์ ํ์ | `"#username"` |
|
|
26
|
-
| `passwordSelector` | `string` | ๋ก๊ทธ์ธ ํผ์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ ํ๋ CSS ์ ํ์ | `"#password"` |
|
|
27
|
-
| `submitSelector` | `string` | ๋ก๊ทธ์ธ ๋ฒํผ์ CSS ์ ํ์ | `"#submit"` |
|
|
28
|
-
| `successSelector` | `string` | ๋ก๊ทธ์ธ ์ฑ๊ณต์ ํ๋ณํ ์ ์๋ ์์์ CSS ์ ํ์ | `null` |
|
|
29
|
-
| `shadowDomSelectors` | `string` | Shadow DOM ๋ด๋ถ ์์๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ (์ผํ๋ก ๊ตฌ๋ถ๋ ์ ํ์ ๋ชฉ๋ก) | `""` |
|
|
30
|
-
| `timeout` | `number` | ๋ก๊ทธ์ธ ๋ฐ ํ์ด์ง ๋ก๋ฉ ๋๊ธฐ ์๊ฐ (ms) | `15000` |
|
|
31
|
-
| `retries` | `number` | ๋ก๊ทธ์ธ ์๋ ํ์ | `3` |
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## ๐ 3. `loginApiUrl` ๋งค๊ฐ๋ณ์์ ๋ํ ์์ธ ์ค๋ช
|
|
36
|
-
|
|
37
|
-
### ๐น `loginApiUrl`๋?
|
|
38
|
-
|
|
39
|
-
`loginApiUrl`์ ์น์ฌ์ดํธ์์ ๊ตฌํํ ๋ก๊ทธ์ธ ๋ฐฉ์์ ๋ฐ๋ผ ๋ก๊ทธ์ธ ์๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฐธ๊ณ ํ๋ ์ค์ ์ ๋ณด์
๋๋ค.
|
|
40
|
-
|
|
41
|
-
### โ
`loginApiUrl`์ด **์ค์ ๋์ง ์์ ๊ฒฝ์ฐ (`null`)**
|
|
42
|
-
|
|
43
|
-
**HTML ํผ์ ํตํ ๋ก๊ทธ์ธ ๋ฐฉ์**์ ์ฌ์ฉํ๋ ์น์ฌ์ดํธ์์๋ ๋ณ๋๋ก ์ค์ ํ์ง ์์๋ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ๋ ํ์ด์ง๋ด์ form action์ ์ง์ ์ฐธ์กฐํฉ๋๋ค.
|
|
44
|
-
|
|
45
|
-
1. `loginPagePath`์ ์ง์ ๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
|
|
46
|
-
2. ์ฌ์ฉ์๋ช
๋ฐ ๋น๋ฐ๋ฒํธ ์
๋ ฅ ํ๋์ ๊ฐ์ ์
๋ ฅํฉ๋๋ค.
|
|
47
|
-
3. ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ก๊ทธ์ธ์ ์๋ํฉ๋๋ค.
|
|
48
|
-
4. `successSelector`๋ฅผ ์ฌ์ฉํด ๋ก๊ทธ์ธ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ๋ณํฉ๋๋ค.
|
|
49
|
-
|
|
50
|
-
#### ๐ ์์ ์ค์ (HTML ํผ ๋ก๊ทธ์ธ)
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"endpoint": "https://example.com",
|
|
55
|
-
"params": {
|
|
56
|
-
"username": "user123",
|
|
57
|
-
"password": "securepassword",
|
|
58
|
-
"loginPagePath": "/login",
|
|
59
|
-
"usernameSelector": "#username",
|
|
60
|
-
"passwordSelector": "#password",
|
|
61
|
-
"submitSelector": "#submit-button",
|
|
62
|
-
"successSelector": ".dashboard"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
#### ๐ ๋์ ๊ณผ์
|
|
68
|
-
|
|
69
|
-
1. `https://example.com/login` ํ์ด์ง๋ก ์ด๋
|
|
70
|
-
2. `#username`, `#password` ์
๋ ฅ ํ๋์ ๊ฐ์ ์
๋ ฅ
|
|
71
|
-
3. `#submit-button`์ ํด๋ฆญํ์ฌ ๋ก๊ทธ์ธ ์์ฒญ ์ ์ก
|
|
72
|
-
4. `.dashboard` ์์๊ฐ ๋ํ๋๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ผ๋ก ํ๋จ
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### โ
`loginApiUrl`์ **์ค์ ํ๋ ๊ฒฝ์ฐ**
|
|
77
|
-
|
|
78
|
-
์น์ฌ์ดํธ๊ฐ **API ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ๋ฐฉ์**์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์
๋๋ค. ์ด ๊ฒฝ์ฐ ๋ก๊ทธ์ธ์ ์ํด์ ํธ์ถ๋๋ `loginApiUrl`์ ์ง์ ํ์
ํด์ ์ค์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
|
|
79
|
-
Origin ์๋ฒ๊ฐ ์๋ ๋ณ๋์ SSO ์๋ฒ์ API๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ ์ ์ฒด API URL์ ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
|
|
80
|
-
|
|
81
|
-
#### ๐ ์์ ์ค์ (API ๋ก๊ทธ์ธ ๋ฐฉ์์ ์น์ฌ์ดํธ)
|
|
82
|
-
|
|
83
|
-
```json
|
|
84
|
-
{
|
|
85
|
-
"endpoint": "https://example.com",
|
|
86
|
-
"params": {
|
|
87
|
-
"username": "user123",
|
|
88
|
-
"password": "securepassword",
|
|
89
|
-
"loginPagePath": "/login",
|
|
90
|
-
"loginApiUrl": "/api/auth/login",
|
|
91
|
-
"usernameSelector": "#username",
|
|
92
|
-
"passwordSelector": "#password",
|
|
93
|
-
"submitSelector": "#submit-button",
|
|
94
|
-
"successSelector": ".dashboard"
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## ๐ 4. ์ค์ ์์
|
|
21
|
+
#### ์ค์ ์์
|
|
102
22
|
|
|
103
23
|
```json
|
|
104
24
|
{
|
|
105
|
-
"name": "headless-browser-
|
|
25
|
+
"name": "headless-browser-pool",
|
|
106
26
|
"connector": "headless-connector",
|
|
107
|
-
"endpoint": "
|
|
27
|
+
"endpoint": "1",
|
|
108
28
|
"params": {
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"loginPagePath": "/login",
|
|
112
|
-
"loginApiUrl": "/api/auth/login",
|
|
113
|
-
"usernameSelector": "#username",
|
|
114
|
-
"passwordSelector": "#password",
|
|
115
|
-
"submitSelector": "#submit",
|
|
116
|
-
"successSelector": ".dashboard",
|
|
117
|
-
"timeout": 20000,
|
|
118
|
-
"retries": 5
|
|
29
|
+
"min": 5,
|
|
30
|
+
"max": 20
|
|
119
31
|
}
|
|
120
32
|
}
|
|
121
33
|
```
|
|
122
34
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
## ๐ 5. ์ฐ๊ฒฐ ์๋ช
์ฃผ๊ธฐ (Connection Lifecycle)
|
|
126
|
-
|
|
127
|
-
- **connect**
|
|
35
|
+
์ ์์์์ ํ์ ์ต์ 5๊ฐ์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค๋ฅผ ์ ์งํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ต๋ 20๊ฐ์ ์ธ์คํด์ค๋ก ํ์ฅํ ์ ์์ต๋๋ค.
|
|
128
36
|
|
|
129
|
-
|
|
130
|
-
- ์ธ์
์ด ์ ์ง๋๋ฉฐ, ์ฟ ํค๋ฅผ ์ ์ฅํ์ฌ ์ดํ ์์ฒญ์์ ์ฌ์ฌ์ฉํฉ๋๋ค.
|
|
37
|
+
#### ์ฐ๊ฒฐ ์๋ช
์ฃผ๊ธฐ
|
|
131
38
|
|
|
132
|
-
- **
|
|
133
|
-
- ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์
์ ์ข
๋ฃํ๊ณ ์ฟ ํค๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
|
|
39
|
+
- **connect**:
|
|
134
40
|
|
|
135
|
-
|
|
41
|
+
- ์ฐ๊ฒฐ์ ์ด๊ธฐํํ์ฌ ์ค์ ๋ ๋งค๊ฐ๋ณ์(`min` ๋ฐ `max`)์ ๋ฐ๋ผ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค ํ์ ์์ฑํฉ๋๋ค.
|
|
42
|
+
- ํ์ ์ด๋ฌํ ์ธ์คํด์ค๋ค์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
|
|
136
43
|
|
|
137
|
-
|
|
44
|
+
- **disconnect**:
|
|
45
|
+
- ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ํ์ ํ๊ธฐํ์ฌ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์ ์ ํ ์ข
๋ฃ๋๊ณ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋๋ก ํฉ๋๋ค.
|
|
138
46
|
|
|
139
|
-
|
|
140
|
-
| ---------------------- | -------------------------------------------------------- |
|
|
141
|
-
| `headless-pdf-capture` | HTML์ PDF๋ก ๋ณํํ๋ ์์
|
|
|
142
|
-
| `headless-scrap` | ์น ํ์ด์ง์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ์คํฌ๋ํ ์์
|
|
|
143
|
-
| `headless-post` | ์น์ฌ์ดํธ์์ ํผ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์
๋ ฅํ๊ณ ์ ์ถํ๋ ์์
|
|
|
47
|
+
#### ์ฌ์ฉ ์๋๋ฆฌ์ค
|
|
144
48
|
|
|
145
|
-
|
|
49
|
+
`ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ`๋ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์์
์ ์ํํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, HTML ์ฝํ
์ธ ๋ก๋ถํฐ PDF๋ฅผ ์์ฑํ๊ฑฐ๋, ์น ํ์ด์ง์ ์คํฌ๋ฆฐ์ท์ ์บก์ฒํ๊ฑฐ๋, ์น์ฌ์ดํธ์์ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํํ ๋ ์ ์ฉํฉ๋๋ค.
|
|
146
50
|
|
|
147
|
-
|
|
51
|
+
#### ์ง์ํ๋ ์์
|
|
148
52
|
|
|
149
|
-
|
|
150
|
-
{
|
|
151
|
-
"name": "scrape-data",
|
|
152
|
-
"taskType": "headless-scrap",
|
|
153
|
-
"params": {
|
|
154
|
-
"path": "/products",
|
|
155
|
-
"selectors": [
|
|
156
|
-
{ "text": "Product Name", "value": ".product-title" },
|
|
157
|
-
{ "text": "Price", "value": ".product-price" }
|
|
158
|
-
]
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
```
|
|
53
|
+
`ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ`๋ `headless-pdf` ์ ๋์ฌ๊ฐ ๋ถ์ ์์
์ ์ง์ํฉ๋๋ค. ์ด๋ฌํ ์์
์ ์ด ์ปค๋ฅํฐ๊ฐ ๊ด๋ฆฌํ๋ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
|
|
162
54
|
|
|
163
|
-
|
|
55
|
+
#### ์์
์์์ ์์ ์ฌ์ฉ
|
|
164
56
|
|
|
165
57
|
```json
|
|
166
58
|
{
|
|
@@ -175,43 +67,6 @@ Origin ์๋ฒ๊ฐ ์๋ ๋ณ๋์ SSO ์๋ฒ์ API๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์๋
|
|
|
175
67
|
}
|
|
176
68
|
```
|
|
177
69
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
```json
|
|
181
|
-
{
|
|
182
|
-
"name": "submit-form",
|
|
183
|
-
"taskType": "headless-post",
|
|
184
|
-
"params": {
|
|
185
|
-
"formPath": "/contact",
|
|
186
|
-
"fields": {
|
|
187
|
-
"#name": "John Doe",
|
|
188
|
-
"#email": "john@example.com",
|
|
189
|
-
"#message": "Hello, this is a test message!"
|
|
190
|
-
},
|
|
191
|
-
"submitSelector": "#submit-button"
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## ๐ข 7. ์ค๋ช
(Description)
|
|
199
|
-
|
|
200
|
-
**ํค๋๋ฆฌ์ค ์ปค๋ฅํฐ**๋ **์น ์๋ํ ๋ฐ ์คํฌ๋ํ, PDF ์์ฑ, ํผ ์๋ ์
๋ ฅ ๋ฐ ์ ์ถ** ๋ฑ์ ์ํด
|
|
201
|
-
ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์
์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค.
|
|
202
|
-
ํนํ **HTML ๋ก๊ทธ์ธ ๋ฐฉ์**๊ณผ **API ๋ก๊ทธ์ธ ๋ฐฉ์**์ ๋ชจ๋ ์ง์ํ์ฌ ๋ค์ํ ์น์ฌ์ดํธ์์ ์์ ์ ์ธ ๋ก๊ทธ์ธ์ ์ํํ ์ ์์ต๋๋ค.
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
### ๐ ์์ฝ
|
|
207
|
-
|
|
208
|
-
| ๊ธฐ๋ฅ | ์ค๋ช
|
|
|
209
|
-
| --------------- | ------------------------------------- |
|
|
210
|
-
| **ํผ ๋ก๊ทธ์ธ** | UI๋ฅผ ์ง์ ์กฐ์ํ์ฌ ๋ก๊ทธ์ธ (HTML ๊ธฐ๋ฐ) |
|
|
211
|
-
| **API ๋ก๊ทธ์ธ** | HTTP ์์ฒญ์ ํตํด ์ง์ ๋ก๊ทธ์ธ (๋น ๋ฆ) |
|
|
212
|
-
| **์ธ์
์ ์ง** | ์ฟ ํค๋ฅผ ์ ์ฅํ์ฌ ์ง์์ ์ธ ์ธ์
์ ์ง |
|
|
213
|
-
| **์น ์คํฌ๋ํ** | ๋ฐ์ดํฐ ์ถ์ถ ๋ฐ ์๋ํ ์์
๊ฐ๋ฅ |
|
|
214
|
-
| **PDF ๋ณํ** | HTML์ PDF๋ก ๋ณํ |
|
|
215
|
-
| **ํผ ์ ์ถ** | ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๊ณ ์ ์ถ |
|
|
70
|
+
#### ์ค๋ช
|
|
216
71
|
|
|
217
|
-
|
|
72
|
+
**ํค๋๋ฆฌ์ค ํ ์ปค๋ฅํฐ**๋ PDF ์์ฑ ๋ฐ ์น ์คํฌ๋ํ๊ณผ ๊ฐ์ ์์
์ ์ํํ๊ธฐ ์ํด ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ธ์คํด์ค ํ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ๋์ ์์๊ฐ ์๋ ์๋๋ฆฌ์ค์์ ์์ ํ์ฉ์ ์ต์ ํ์ ํ์ฅ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
|