@ninebone/mcp 0.1.26

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.
Files changed (41) hide show
  1. package/README.kr.md +71 -0
  2. package/README.md +72 -0
  3. package/bak/generate-query.md +28 -0
  4. package/bak/generator-source-mapper.md +123 -0
  5. package/bak/mcp-server.js +498 -0
  6. package/bak/nomenu-navigator.md +16 -0
  7. package/bak/system-brain.md +62 -0
  8. package/bak/table-filter.md +21 -0
  9. package/package.json +33 -0
  10. package/prompts/menu/generate-menu.md +89 -0
  11. package/prompts/source/generate-source-controller.md +120 -0
  12. package/prompts/source/generate-source-mapper.mysql.md +97 -0
  13. package/prompts/source/generate-source-mapper.oracle.md +90 -0
  14. package/prompts/source/generate-source-mapper.postgre.md +89 -0
  15. package/prompts/source/generate-source-service.md +116 -0
  16. package/prompts/source/generate-source-ui-react.md +174 -0
  17. package/prompts/system/generate-source-brain.md +57 -0
  18. package/prompts/system/modify-source-brain.md +50 -0
  19. package/prompts/system/system-brain.md +88 -0
  20. package/src/ai/AIProcessor.js +85 -0
  21. package/src/ai/AIService.js +24 -0
  22. package/src/core/init.js +116 -0
  23. package/src/database/config/database.js +42 -0
  24. package/src/database/core/DatabaseManager.js +115 -0
  25. package/src/database/core/Dialects.js +66 -0
  26. package/src/database/core/PoolManager.js +92 -0
  27. package/src/drivers/mysql.js +0 -0
  28. package/src/index.js +38 -0
  29. package/src/mcp/loaders/promptLoader.js +62 -0
  30. package/src/mcp/mcp-server.js +129 -0
  31. package/src/mcp/tools/generateSourceBrainTool.js +179 -0
  32. package/src/mcp/tools/modifySourceBrainTool.js +283 -0
  33. package/src/mcp/tools/staticTools.js +29 -0
  34. package/src/mcp/tools/systemBrain.js +182 -0
  35. package/src/mcp/utils/mcp-utils.js +30 -0
  36. package/src/mcp-handler.js +131 -0
  37. package/src/services/NoMenuService.js +43 -0
  38. package/src/services/QueryService.js +26 -0
  39. package/src/services/SourceService.js +32 -0
  40. package/src/utils/CustomWsTransport.js +52 -0
  41. package/src/utils/asyncHandler.js +13 -0
package/README.kr.md ADDED
@@ -0,0 +1,71 @@
1
+ cat <<EOF > README.kr.md
2
+ # @nine-lab/nine-mcp ๐Ÿš€
3
+
4
+ [ํ•œ๊ตญ์–ด ๋ฌธ์„œ(Korean)](./README.kr.md) | [English Document](./README.md)
5
+
6
+ ์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ SQL ์ƒ์„ฑ ์—”์ง„(NineChat)๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” **AI ์ „์šฉ DB ์ปค๋„ฅํ„ฐ ์„œ๋น„์Šค**์ž…๋‹ˆ๋‹ค.
7
+
8
+ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ(Schema)๋ฅผ ๋ถ„์„ํ•˜์—ฌ AI๊ฐ€ ์ตœ์ ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ธŒ๋ฆฟ์ง€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋ณด์•ˆ์ด ๊ฒ€์ฆ๋œ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
9
+
10
+ ---
11
+
12
+ ## ๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ
13
+
14
+ * **์ž๋™ ์ดˆ๊ธฐํ™”**: \`nine-mcp init\` ๋ช…๋ น์œผ๋กœ \`.env\` ์„ค์ •๊ณผ AI ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ฆ‰์‹œ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
15
+ * **Multi-DB ์ง€์›**: MySQL, PostgreSQL, MariaDB, Oracle ๋“ฑ ๋‹ค์–‘ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ DB ํ™˜๊ฒฝ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.
16
+ * **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ตœ์ ํ™”**: ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ ์ˆ˜์ •์„ ํ†ตํ•ด ํŠน์ • ํ…Œ์ด๋ธ” ์กฐํšŒ ๊ธˆ์ง€, ํ•„ํ„ฐ๋ง ์กฐ๊ฑด ๊ฐ•์ œ ๋“ฑ ๊ณ ๊ฐ์‚ฌ๋ณ„ ๋งž์ถค ๊ทœ์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
17
+ * **๋ณด์•ˆ ๊ฐ€๋“œ**: ๋‚ด๋ถ€์ ์œผ๋กœ ์˜ค์ง \`SELECT\` ์ฟผ๋ฆฌ๋งŒ ํ—ˆ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€์กฐ ๋ฐ ์œ ์ถœ์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
18
+ * **์šด์˜ ์•ˆ์ •์„ฑ**: BigInt ์ง๋ ฌํ™” ๋ฐ DB๋ณ„ ๊ฒฐ๊ณผ ํฌ๋งท ์ •๊ทœํ™”๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
19
+
20
+ ---
21
+
22
+ ## ๐Ÿ›  ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
23
+
24
+ ### 1. ํŒจํ‚ค์ง€ ์„ค์น˜
25
+ \`\`\`bash
26
+ npm install -g @nine-lab/nine-mcp
27
+ \`\`\`
28
+
29
+ ### 2. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” (์ตœ์ดˆ 1ํšŒ)
30
+ ์„œ๋ฒ„ ์‹คํ–‰ ์ „ DB ์ ‘์† ์ •๋ณด ๋ฐ ํ”„๋กฌํ”„ํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
31
+ \`\`\`bash
32
+ nine-mcp init
33
+ \`\`\`
34
+
35
+ ### 3. ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ (PM2 ๊ถŒ์žฅ)
36
+ ์„œ๋ฒ„์˜ ์•ˆ์ •์ ์ธ ๊ธฐ๋™๊ณผ ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ํŒจํ‚ค์ง€๋ช…๊ณผ ๋™์ผํ•œ **nine-mcp**๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
37
+
38
+ * **์„œ๋ฒ„ ์‹œ์ž‘**:
39
+ \`\`\`bash
40
+ pm2 start nine-mcp --name "nine-mcp"
41
+ \`\`\`
42
+ * **์ƒํƒœ ํ™•์ธ**:
43
+ \`\`\`bash
44
+ pm2 status
45
+ \`\`\`
46
+ * **๋กœ๊ทธ ํ™•์ธ**:
47
+ \`\`\`bash
48
+ pm2 logs nine-mcp
49
+ \`\`\`
50
+ * **์„œ๋ฒ„ ์ค‘์ง€/์žฌ์‹œ์ž‘**:
51
+ \`\`\`bash
52
+ pm2 stop nine-mcp
53
+ pm2 restart nine-mcp
54
+ \`\`\`
55
+
56
+ ---
57
+
58
+ ## ๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
59
+
60
+ ๊ธฐ๋ณธ์ ์œผ๋กœ \`nine-query\` ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๋™๋˜์–ด ๋™์ž‘ํ•˜๋ฉฐ, ์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์„ธ๋ถ€ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
61
+
62
+ * **.env**: DB ์ ‘์† ์ •๋ณด ๋ฐ AI ๋ชจ๋ธ(Gemini) ์„ค์ •๊ฐ’
63
+ * **prompts/table-filter.md**: ์งˆ๋ฌธ์— ์ ํ•ฉํ•œ ํ…Œ์ด๋ธ”์„ ์ฐพ์•„๋‚ด๋Š” AI์˜ ํŒ๋‹จ ๋กœ์ง
64
+ * **prompts/query-generator.md**: ์‹ค์ œ SQL์„ ์ƒ์„ฑํ•˜๋Š” AI์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฐ ๊ทœ์น™
65
+ * **๐Ÿ’ก Tip**: ์ด ํŒŒ์ผ์˜ \`[๊ณ ๊ฐ์‚ฌ ์ „์šฉ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ๋ณด์•ˆ ๊ทœ์น™]\` ์„น์…˜์— "ํŠน์ • ๋ฏผ๊ฐ ํ…Œ์ด๋ธ” ์กฐํšŒ ๊ธˆ์ง€"๋‚˜ "๊ธฐ๋ณธ ์ •๋ ฌ/ํ•„ํ„ฐ๋ง ๊ธฐ์ค€"์„ ๋ช…์‹œํ•˜์—ฌ AI์˜ ๋‹ต๋ณ€์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
66
+
67
+ ---
68
+
69
+ ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค
70
+ MIT ยฉ **nine-lab**
71
+ EOF
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ cat <<EOF > README.md
2
+ # @nine-lab/nine-mcp ๐Ÿš€
3
+
4
+ [ํ•œ๊ตญ์–ด ๋ฌธ์„œ(Korean)](./README.kr.md) | [English Document](./README.md)
5
+
6
+ **NineConnector** is an AI-specialized database connector service that bridges the gap between natural language SQL generation engines (**NineChat**) and your database.
7
+
8
+ It analyzes database schemas to provide AI models with the necessary metadata for optimal query generation and ensures secure data retrieval within a verified environment.
9
+
10
+ ---
11
+
12
+ ## ๐ŸŒŸ Key Features
13
+
14
+ * **Auto-Initialization**: Instantly set up your environment with \`.env\` configurations and AI prompt templates using the \`nine-mcp init\` command.
15
+ * **Multi-DB Support**: Out-of-the-box compatibility with enterprise database environments including **MySQL, PostgreSQL, MariaDB, and Oracle**.
16
+ * **Business Logic Optimization**: Fine-tune AI behavior by customizing prompt files to enforce rules such as table access restrictions or mandatory filtering logic.
17
+ * **Security Guardrail**: Strictly restricts execution to \`SELECT\` queries to prevent unauthorized data modification or leakage.
18
+ * **Operational Stability**: Ensures data consistency through **BigInt serialization** and standardized result formatting across different DB dialects.
19
+
20
+ ---
21
+
22
+ ## ๐Ÿ›  Installation & Quick Start
23
+
24
+ ### 1. Install Package
25
+ Install the package globally to access the CLI commands from anywhere.
26
+ \`\`\`bash
27
+ npm install -g @nine-lab/nine-mcp
28
+ \`\`\`
29
+
30
+ ### 2. Initialize Project (First-time setup)
31
+ Run the initialization command to configure DB connection settings and generate prompt templates.
32
+ \`\`\`bash
33
+ nine-mcp init
34
+ \`\`\`
35
+
36
+ ### 3. Server Execution & Management (PM2 Recommended)
37
+ For production environments, we highly recommend using **PM2** to ensure high availability and efficient log management.
38
+
39
+ * **Start Server**:
40
+ \`\`\`bash
41
+ pm2 start nine-mcp --name "nine-mcp"
42
+ \`\`\`
43
+ * **Check Status**:
44
+ \`\`\`bash
45
+ pm2 status
46
+ \`\`\`
47
+ * **View Logs**:
48
+ \`\`\`bash
49
+ pm2 logs nine-mcp
50
+ \`\`\`
51
+ * **Stop / Restart**:
52
+ \`\`\`bash
53
+ pm2 stop nine-mcp
54
+ pm2 restart nine-mcp
55
+ \`\`\`
56
+
57
+ ---
58
+
59
+ ## ๐Ÿ“‚ Project Structure & Customization
60
+
61
+ Designed to work seamlessly with the \`nine-query\` component, you can control the AI's behavior via the following files:
62
+
63
+ * **.env**: Database credentials and AI model (e.g., Gemini) configurations.
64
+ * **prompts/table-filter.md**: AI logic for identifying relevant tables based on user intent.
65
+ * **prompts/query-generator.md**: Persona and rules for the SQL generation AI.
66
+ * **๐Ÿ’ก Tip**: Use the \`[Custom Business Logic & Security Rules]\` section in this file to enforce specific constraints, such as "Do not access sensitive user tables" or "Always apply a default sort order."
67
+
68
+ ---
69
+
70
+ ## ๐Ÿ“„ License
71
+ MIT ยฉ **nine-lab**
72
+ EOF
@@ -0,0 +1,28 @@
1
+ ### SQL_GENERATE_PROMPT
2
+ ๋‹น์‹ ์€ SQL ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ํ…Œ์ด๋ธ” ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ์ตœ์ ์˜ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
3
+
4
+ [์„ ํƒ๋œ ํ…Œ์ด๋ธ” ์ •๋ณด]
5
+ {detailed_schema}
6
+
7
+ [์‚ฌ์šฉ์ž ์งˆ๋ฌธ]
8
+ "{question}"
9
+
10
+ [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…]
11
+ {db_type}
12
+
13
+ [๊ธฐ๋ณธ ์‘๋‹ต ๊ทœ์น™]
14
+ 1. ๋ฐ˜๋“œ์‹œ JSON ํ˜•์‹์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”.
15
+ 2. SQL์€ {db_type} ๋ฌธ๋ฒ•์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์•„์•ผ ํ•˜๋ฉฐ, ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
16
+ 3. ์ฟผ๋ฆฌ๋ฌธ ์•ˆ์— ๋งˆํฌ๋‹ค์šด ์ฝ”๋“œ ๋ธ”๋ก(```sql)์„ ํฌํ•จํ•˜์ง€ ๋งˆ์„ธ์š”.
17
+
18
+ [๊ณ ๊ฐ์‚ฌ ์ „์šฉ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ ๋ณด์•ˆ ๊ทœ์น™]
19
+ - ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋‹จ์–ด(์˜ˆ: ์ง€๋ช…, ์ƒํ˜ธ๋ช…, ๊ธฐ์ˆ ๋ช…)๋ฅผ ์–ธ๊ธ‰ํ•˜๋ฉฐ ์กฐํšŒ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ,
20
+ ๊ณ ์ •๊ฐ’ ๋น„๊ต(=) ๋Œ€์‹  ๋ฐ˜๋“œ์‹œ 'LIKE %๊ฒ€์ƒ‰์–ด%' ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
21
+ -
22
+ (์—ฌ๊ธฐ์— "ํŠน์ • ํ…Œ์ด๋ธ” ์กฐํšŒ ๊ธˆ์ง€"๋‚˜ "๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€" ๋“ฑ ์ปค์Šคํ…€ ๊ทœ์น™์„ ์ž‘์„ฑํ•˜์„ธ์š”.)
23
+
24
+ [์‘๋‹ต ํฌ๋งท]
25
+ {{
26
+ "sql": "SELECT ... FROM ... WHERE ...",
27
+ "explanation": "์ด ์ฟผ๋ฆฌ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค."
28
+ }}
@@ -0,0 +1,123 @@
1
+ ๋„ˆ๋Š” Spring ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ์—์„œ MyBatis SQL Mapper XML์„ ์ž‘์„ฑํ•˜๋Š” AI์ž…๋‹ˆ๋‹ค.
2
+
3
+ ์ง€๊ธˆ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ **๊ธฐ๋Šฅ ์„ค๋ช…**๊ณผ **ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ์ •๋ณด**๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ์•„๋ž˜ ์กฐ๊ฑด์„ **๋ชจ๋‘ ๋งŒ์กฑ**ํ•˜๋Š” **MyBatis SQL Mapper XML ํŒŒ์ผ(.xml)**์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
4
+
5
+ ---
6
+
7
+ **[์‚ฌ์šฉ์ž ์š”์ฒญ ๊ธฐ๋Šฅ ์„ค๋ช…]**
8
+
9
+
10
+ **[ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ์ •๋ณด (JSON)]**
11
+ {schema_detail}
12
+
13
+ ---
14
+
15
+ **[XML ์ž‘์„ฑ ํ•„์ˆ˜ ์กฐ๊ฑด]**
16
+
17
+ 1. **XML ๊ธฐ๋ณธ ๊ตฌ์กฐ:**
18
+ * `<?xml version="1.0" encoding="UTF-8"?>` ๋ฐ `<!DOCTYPE mapper ...>` ์„ ์–ธ์„ **๋ฐ˜๋“œ์‹œ ํฌํ•จ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
19
+ * ์ „์ฒด XML ์ฝ”๋“œ๋Š” `<mapper namespace="{namespace}" >` ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
20
+ * `namespace` ๊ฐ’์€ `{namespace}` ํ”Œ๋ ˆ์ด์Šคํ™€๋”์— ์ „๋‹ฌ๋œ ๊ฐ’์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
21
+ * **์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ์€ ๊ฐ€์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ, XML ๋‹จ๋…์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.**
22
+
23
+ 2. **ํ•„์ˆ˜ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ:**
24
+ * **`selectList`**: ๋ชฉ๋ก ์กฐํšŒ (ํ•„์ˆ˜: `ORDER BY` ์ ˆ ํฌํ•จ)
25
+ * **`selectOne`**: ๋‹จ์ผ ๊ฑด ์กฐํšŒ (์ฃผ์š” ์ปฌ๋Ÿผ์„ WHERE ์กฐ๊ฑด์— ํฌํ•จ)
26
+ * **`insert`**: ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
27
+ * **`update`**: ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ (์ฃผ์š” ์ปฌ๋Ÿผ์„ WHERE ์กฐ๊ฑด์— ํฌํ•จ)
28
+ * **`delete`**: ๋ฐ์ดํ„ฐ ์‚ญ์ œ (์ฃผ์š” ์ปฌ๋Ÿผ์„ WHERE ์กฐ๊ฑด์— ํฌํ•จ)
29
+
30
+ 3. **SQL ์ž‘์„ฑ ๊ทœ์น™:**
31
+ * SQL์€ ์ œ๊ณต๋œ **ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ(์ปฌ๋Ÿผ๋ช…, ๋ฐ์ดํ„ฐ ํƒ€์ž…)**๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
32
+ * **์ž์ฃผ ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ปฌ๋Ÿผ** (์˜ˆ: ID, ์ด๋ฆ„, ์ƒํƒœ ๋“ฑ)์€ `selectOne`, `update`, `delete` ์ฟผ๋ฆฌ์˜ `WHERE` ์กฐ๊ฑด์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
33
+ * `result_type`์€ **๋ฐ˜๋“œ์‹œ `{result_type}`์œผ๋กœ ์ฒ˜๋ฆฌ**ํ•ฉ๋‹ˆ๋‹ค.
34
+ * `selectList` ์ฟผ๋ฆฌ์—๋Š” ๋™์  WHERE ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด **๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๊ตฌ๋ฌธ์„ ์ฃผ์ž…**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
35
+ ```xml
36
+ <where>
37
+ <if test="_whereClause != null"> AND ${{_whereClause}} </if>
38
+ </where>
39
+ ```
40
+ * `selectList` ์ฟผ๋ฆฌ์—๋Š” **๋ฐ˜๋“œ์‹œ `ORDER BY` ์ ˆ์„ ๋ช…์‹œ**ํ•˜์—ฌ ์ •๋ ฌ ๊ธฐ์ค€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
41
+
42
+ 4. **์ถœ๋ ฅ ํ˜•์‹:**
43
+ * ๊ฒฐ๊ณผ๋Š” **์˜ค์ง ์™„์„ฑ๋œ XML ์ฝ”๋“œ๋งŒ ํ…์ŠคํŠธ๋กœ ์ถœ๋ ฅ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์„ค๋ช… ํ…์ŠคํŠธ๋‚˜ ์ฃผ์„ ์—†์ด)
44
+ * **๋งˆํฌ๋‹ค์šด ์ฝ”๋“œ ๋ธ”๋ก(```xml`)์€ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.**
45
+
46
+ ---
47
+
48
+ **[์ถœ๋ ฅ ์˜ˆ์‹œ]** (AI๋Š” ์ด ํ˜•์‹์— ๋งž์ถฐ XML ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
49
+
50
+ ```xml
51
+ <?xml version="1.0" encoding="UTF-8"?>
52
+ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
53
+ <mapper namespace="com.example.mapper.BoardMapper">
54
+
55
+ <select id="selectList" resultType="`{result_type}`">
56
+ SELECT
57
+ BOARD_ID,
58
+ TITLE,
59
+ CONTENT,
60
+ REG_DATE
61
+ FROM
62
+ TB_BOARD
63
+ <where>
64
+ <if test="_whereClause != null"> AND ${{_whereClause}} </if>
65
+ </where>
66
+ <where>
67
+ <if test="borderId != null"> BOARD_ID = ${{borderId}} </if>
68
+ </where>
69
+ <where>
70
+ <if test="title != null"> TITLE = ${{title}} </if>
71
+ </where>
72
+ <where>
73
+ <if test="content != null"> CONTENT = ${{content}} </if>
74
+ </where>
75
+ <where>
76
+ <if test="regDate != null"> REG_DATE = ${{regDate}} </if>
77
+ </where>
78
+ ORDER BY
79
+ BOARD_ID DESC
80
+ </select>
81
+
82
+ <select id="selectOne" resultType="java.util.Map">
83
+ SELECT
84
+ BOARD_ID,
85
+ TITLE,
86
+ CONTENT,
87
+ REG_DATE
88
+ FROM
89
+ TB_BOARD
90
+ WHERE
91
+ BOARD_ID = #{{boardId}}
92
+ </select>
93
+
94
+ <insert id="insert" parameterType="java.util.Map">
95
+ INSERT INTO TB_BOARD (
96
+ BOARD_ID,
97
+ TITLE,
98
+ CONTENT,
99
+ REG_DATE
100
+ ) VALUES (
101
+ #{{boardId}},
102
+ #{{title}},
103
+ #{{content}},
104
+ NOW()
105
+ )
106
+ </insert>
107
+
108
+ <update id="update" parameterType="java.util.Map">
109
+ UPDATE TB_BOARD
110
+ SET
111
+ TITLE = #{{title}},
112
+ CONTENT = #{{content}}
113
+ WHERE
114
+ BOARD_ID = #{{boardId}}
115
+ </update>
116
+
117
+ <delete id="delete" parameterType="java.util.Map">
118
+ DELETE FROM TB_BOARD
119
+ WHERE
120
+ BOARD_ID = #{{boardId}}
121
+ </delete>
122
+
123
+ </mapper>