activo 0.4.4 → 0.5.0
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/README.md +203 -1
- package/data/2026-03-04_20-54.json +181 -0
- package/data/2026-03-04_20-56.json +181 -0
- package/data/apex-rulesets/egov.yaml +469 -0
- package/data/apex-rulesets/modernize.yaml +687 -0
- package/data/apex-rulesets/quality.yaml +1677 -0
- package/data/apex-rulesets/rule-schema.yaml +587 -0
- package/data/apex-rulesets/secure.yaml +1688 -0
- package/data/apex-rulesets/spring.yaml +455 -0
- package/data/apex-rulesets/sql-format.yaml +99 -0
- package/data/apex-rulesets/sql-oracle.yaml +281 -0
- package/data/apex-rulesets/sql.yaml +1660 -0
- package/dist/cli/headless.d.ts.map +1 -1
- package/dist/cli/headless.js +32 -10
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/index.js +31 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/agent.d.ts +3 -3
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +203 -384
- package/dist/core/agent.js.map +1 -1
- package/dist/core/commands.d.ts +2 -1
- package/dist/core/commands.d.ts.map +1 -1
- package/dist/core/commands.js +61 -9
- package/dist/core/commands.js.map +1 -1
- package/dist/core/config.d.ts +14 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +41 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/conversation.d.ts +2 -2
- package/dist/core/conversation.d.ts.map +1 -1
- package/dist/core/conversation.js.map +1 -1
- package/dist/core/intentRouter.d.ts +43 -0
- package/dist/core/intentRouter.d.ts.map +1 -0
- package/dist/core/intentRouter.js +804 -0
- package/dist/core/intentRouter.js.map +1 -0
- package/dist/core/llm/anthropic.d.ts +24 -0
- package/dist/core/llm/anthropic.d.ts.map +1 -0
- package/dist/core/llm/anthropic.js +226 -0
- package/dist/core/llm/anthropic.js.map +1 -0
- package/dist/core/llm/ollama.d.ts +5 -14
- package/dist/core/llm/ollama.d.ts.map +1 -1
- package/dist/core/llm/ollama.js +3 -0
- package/dist/core/llm/ollama.js.map +1 -1
- package/dist/core/llm/types.d.ts +22 -0
- package/dist/core/llm/types.d.ts.map +1 -0
- package/dist/core/llm/types.js +2 -0
- package/dist/core/llm/types.js.map +1 -0
- package/dist/core/mcp/client.d.ts +6 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +16 -0
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/init.d.ts +12 -0
- package/dist/core/mcp/init.d.ts.map +1 -0
- package/dist/core/mcp/init.js +55 -0
- package/dist/core/mcp/init.js.map +1 -0
- package/dist/core/mcp/logger.d.ts +14 -0
- package/dist/core/mcp/logger.d.ts.map +1 -0
- package/dist/core/mcp/logger.js +50 -0
- package/dist/core/mcp/logger.js.map +1 -0
- package/dist/core/tools/analyzePatterns.d.ts +3 -0
- package/dist/core/tools/analyzePatterns.d.ts.map +1 -0
- package/dist/core/tools/analyzePatterns.js +293 -0
- package/dist/core/tools/analyzePatterns.js.map +1 -0
- package/dist/core/tools/apexPaths.d.ts +14 -0
- package/dist/core/tools/apexPaths.d.ts.map +1 -0
- package/dist/core/tools/apexPaths.js +54 -0
- package/dist/core/tools/apexPaths.js.map +1 -0
- package/dist/core/tools/apexUtils.d.ts +36 -0
- package/dist/core/tools/apexUtils.d.ts.map +1 -0
- package/dist/core/tools/apexUtils.js +83 -0
- package/dist/core/tools/apexUtils.js.map +1 -0
- package/dist/core/tools/explainIssue.d.ts +3 -0
- package/dist/core/tools/explainIssue.d.ts.map +1 -0
- package/dist/core/tools/explainIssue.js +181 -0
- package/dist/core/tools/explainIssue.js.map +1 -0
- package/dist/core/tools/fixGen.d.ts +3 -0
- package/dist/core/tools/fixGen.d.ts.map +1 -0
- package/dist/core/tools/fixGen.js +338 -0
- package/dist/core/tools/fixGen.js.map +1 -0
- package/dist/core/tools/generateImprovements.d.ts +21 -0
- package/dist/core/tools/generateImprovements.d.ts.map +1 -0
- package/dist/core/tools/generateImprovements.js +602 -0
- package/dist/core/tools/generateImprovements.js.map +1 -0
- package/dist/core/tools/generateReport.d.ts +3 -0
- package/dist/core/tools/generateReport.d.ts.map +1 -0
- package/dist/core/tools/generateReport.js +315 -0
- package/dist/core/tools/generateReport.js.map +1 -0
- package/dist/core/tools/index.d.ts +7 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +62 -23
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/recommendProfile.d.ts +3 -0
- package/dist/core/tools/recommendProfile.d.ts.map +1 -0
- package/dist/core/tools/recommendProfile.js +334 -0
- package/dist/core/tools/recommendProfile.js.map +1 -0
- package/dist/core/tools/ruleGen.d.ts +3 -0
- package/dist/core/tools/ruleGen.d.ts.map +1 -0
- package/dist/core/tools/ruleGen.js +1103 -0
- package/dist/core/tools/ruleGen.js.map +1 -0
- package/dist/core/tools/standards.d.ts.map +1 -1
- package/dist/core/tools/standards.js +7 -3
- package/dist/core/tools/standards.js.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +86 -35
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +1 -3
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +146 -5
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/MessageList.d.ts +3 -1
- package/dist/ui/components/MessageList.d.ts.map +1 -1
- package/dist/ui/components/MessageList.js +13 -7
- package/dist/ui/components/MessageList.js.map +1 -1
- package/dist/ui/components/StatusBar.d.ts +1 -1
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +3 -2
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolStatus.d.ts +3 -1
- package/dist/ui/components/ToolStatus.d.ts.map +1 -1
- package/dist/ui/components/ToolStatus.js +19 -4
- package/dist/ui/components/ToolStatus.js.map +1 -1
- package/package.json +7 -1
- package/demo.gif +0 -0
- package/demo.tape +0 -53
- package/screenshot.png +0 -0
- package/src/cli/banner.ts +0 -38
- package/src/cli/headless.ts +0 -63
- package/src/cli/index.ts +0 -57
- package/src/core/agent.ts +0 -711
- package/src/core/commands.ts +0 -118
- package/src/core/config.ts +0 -98
- package/src/core/conversation.ts +0 -235
- package/src/core/llm/ollama.ts +0 -351
- package/src/core/mcp/client.ts +0 -143
- package/src/core/tools/analyzeAll.ts +0 -482
- package/src/core/tools/ast.ts +0 -826
- package/src/core/tools/builtIn.ts +0 -221
- package/src/core/tools/cache.ts +0 -570
- package/src/core/tools/cssAnalysis.ts +0 -324
- package/src/core/tools/dependencyAnalysis.ts +0 -363
- package/src/core/tools/embeddings.ts +0 -746
- package/src/core/tools/frontendAst.ts +0 -802
- package/src/core/tools/htmlAnalysis.ts +0 -466
- package/src/core/tools/index.ts +0 -160
- package/src/core/tools/javaAst.ts +0 -1030
- package/src/core/tools/javaQuality.integration.test.ts +0 -537
- package/src/core/tools/memory.ts +0 -655
- package/src/core/tools/mybatisAnalysis.ts +0 -322
- package/src/core/tools/openapiAnalysis.ts +0 -431
- package/src/core/tools/pythonAnalysis.ts +0 -477
- package/src/core/tools/sqlAnalysis.ts +0 -298
- package/src/core/tools/standards.test.ts +0 -186
- package/src/core/tools/standards.ts +0 -889
- package/src/core/tools/types.ts +0 -38
- package/src/ui/App.tsx +0 -334
- package/src/ui/components/InputBox.tsx +0 -37
- package/src/ui/components/MessageList.tsx +0 -80
- package/src/ui/components/StatusBar.tsx +0 -36
- package/src/ui/components/ToolStatus.tsx +0 -38
- package/tsconfig.json +0 -21
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
# Legacy Modernization Ruleset
|
|
2
|
+
# 레거시 코드 현대화 규칙
|
|
3
|
+
# - 전자정부프레임워크 3.x → 4.x 마이그레이션
|
|
4
|
+
# - javax → jakarta 네임스페이스 마이그레이션
|
|
5
|
+
# - Spring deprecated 클래스 교체
|
|
6
|
+
# - iBatis → MyBatis 마이그레이션
|
|
7
|
+
# - Java API 현대화
|
|
8
|
+
version: "1.0"
|
|
9
|
+
profile: "modernize"
|
|
10
|
+
|
|
11
|
+
languages:
|
|
12
|
+
- language: java
|
|
13
|
+
rules:
|
|
14
|
+
# ==================== 1. 전자정부프레임워크 마이그레이션 ====================
|
|
15
|
+
|
|
16
|
+
- id: "mod-egov-001"
|
|
17
|
+
name: "egovframework.rte 패키지 사용"
|
|
18
|
+
severity: "medium"
|
|
19
|
+
category: "egov-migration"
|
|
20
|
+
description: "egovframework.rte.* 패키지는 전자정부프레임워크 4.0에서 org.egovframe.rte.*로 변경되었습니다. 마이그레이션 시 변경 필요."
|
|
21
|
+
enabled: true
|
|
22
|
+
pattern:
|
|
23
|
+
type: "ast-import"
|
|
24
|
+
import: "^egovframework\\.rte\\."
|
|
25
|
+
custom:
|
|
26
|
+
rule_id: "MOD-EGOV-001"
|
|
27
|
+
fix: "import를 org.egovframe.rte.*로 변경하세요"
|
|
28
|
+
since: "eGovFrame 4.0"
|
|
29
|
+
|
|
30
|
+
- id: "mod-egov-002"
|
|
31
|
+
name: "AbstractServiceImpl 사용 (구버전)"
|
|
32
|
+
severity: "high"
|
|
33
|
+
category: "egov-migration"
|
|
34
|
+
description: "AbstractServiceImpl은 eGovFrame 3.0 이전 클래스입니다. EgovAbstractServiceImpl을 사용하세요."
|
|
35
|
+
enabled: true
|
|
36
|
+
pattern:
|
|
37
|
+
type: "regex"
|
|
38
|
+
regex: "extends\\s+AbstractServiceImpl\\b"
|
|
39
|
+
custom:
|
|
40
|
+
rule_id: "MOD-EGOV-002"
|
|
41
|
+
fix: "EgovAbstractServiceImpl을 상속하세요"
|
|
42
|
+
since: "eGovFrame 3.0"
|
|
43
|
+
|
|
44
|
+
- id: "mod-egov-003"
|
|
45
|
+
name: "EgovAbstractDAO 사용 (iBatis 기반)"
|
|
46
|
+
severity: "high"
|
|
47
|
+
category: "egov-migration"
|
|
48
|
+
description: "EgovAbstractDAO는 iBatis 기반 클래스입니다. MyBatis 기반 EgovAbstractMapper를 사용하세요."
|
|
49
|
+
enabled: false # egov-dao-001과 동일 regex 중복
|
|
50
|
+
pattern:
|
|
51
|
+
type: "regex"
|
|
52
|
+
regex: "extends\\s+EgovAbstractDAO\\b"
|
|
53
|
+
custom:
|
|
54
|
+
rule_id: "MOD-EGOV-003"
|
|
55
|
+
fix: "EgovAbstractMapper를 상속하세요"
|
|
56
|
+
since: "eGovFrame 3.0"
|
|
57
|
+
|
|
58
|
+
- id: "mod-egov-004"
|
|
59
|
+
name: "eGovFrame 구버전 보안 XSD 참조"
|
|
60
|
+
severity: "medium"
|
|
61
|
+
category: "egov-migration"
|
|
62
|
+
description: "eGovFrame 3.x XSD 스키마를 참조하고 있습니다. 4.0 버전으로 업데이트하세요."
|
|
63
|
+
enabled: true
|
|
64
|
+
pattern:
|
|
65
|
+
type: "regex"
|
|
66
|
+
regex: "egov-(security|access|crypto)-[123]\\.[0-9]\\.xsd"
|
|
67
|
+
custom:
|
|
68
|
+
rule_id: "MOD-EGOV-004"
|
|
69
|
+
fix: "egov-security-4.0.xsd, egov-access-4.0.xsd 등으로 변경하세요"
|
|
70
|
+
|
|
71
|
+
- id: "mod-egov-005"
|
|
72
|
+
name: "egovframework 리소스 경로 사용"
|
|
73
|
+
severity: "medium"
|
|
74
|
+
category: "egov-migration"
|
|
75
|
+
description: "classpath:/egovframework/ 경로는 4.0에서 classpath:/org/egovframe/로 변경되었습니다."
|
|
76
|
+
enabled: true
|
|
77
|
+
pattern:
|
|
78
|
+
type: "regex"
|
|
79
|
+
regex: "classpath[*]?:/egovframework/"
|
|
80
|
+
custom:
|
|
81
|
+
rule_id: "MOD-EGOV-005"
|
|
82
|
+
fix: "classpath:/org/egovframe/ 경로로 변경하세요"
|
|
83
|
+
|
|
84
|
+
# ==================== 2. javax → jakarta 마이그레이션 ====================
|
|
85
|
+
|
|
86
|
+
- id: "mod-jakarta-001"
|
|
87
|
+
name: "javax.servlet 사용"
|
|
88
|
+
severity: "medium"
|
|
89
|
+
category: "jakarta-migration"
|
|
90
|
+
description: "javax.servlet은 Spring Boot 3.x/Jakarta EE 9+에서 jakarta.servlet으로 변경되었습니다. Spring Boot 2.x/eGovFrame 3.x에서는 정상."
|
|
91
|
+
enabled: true
|
|
92
|
+
pattern:
|
|
93
|
+
type: "ast-import"
|
|
94
|
+
import: "^javax\\.servlet\\."
|
|
95
|
+
custom:
|
|
96
|
+
rule_id: "MOD-JAKARTA-001"
|
|
97
|
+
fix: "jakarta.servlet 패키지로 변경하세요"
|
|
98
|
+
since: "Jakarta EE 9 / Spring Boot 3.0"
|
|
99
|
+
|
|
100
|
+
- id: "mod-jakarta-002"
|
|
101
|
+
name: "javax.persistence 사용"
|
|
102
|
+
severity: "high"
|
|
103
|
+
category: "jakarta-migration"
|
|
104
|
+
description: "javax.persistence는 Jakarta EE 9+에서 jakarta.persistence로 변경되었습니다."
|
|
105
|
+
enabled: true
|
|
106
|
+
pattern:
|
|
107
|
+
type: "ast-import"
|
|
108
|
+
import: "^javax\\.persistence\\."
|
|
109
|
+
custom:
|
|
110
|
+
rule_id: "MOD-JAKARTA-002"
|
|
111
|
+
fix: "jakarta.persistence 패키지로 변경하세요"
|
|
112
|
+
|
|
113
|
+
- id: "mod-jakarta-003"
|
|
114
|
+
name: "javax.validation 사용"
|
|
115
|
+
severity: "high"
|
|
116
|
+
category: "jakarta-migration"
|
|
117
|
+
description: "javax.validation은 Jakarta EE 9+에서 jakarta.validation으로 변경되었습니다."
|
|
118
|
+
enabled: true
|
|
119
|
+
pattern:
|
|
120
|
+
type: "ast-import"
|
|
121
|
+
import: "^javax\\.validation\\."
|
|
122
|
+
custom:
|
|
123
|
+
rule_id: "MOD-JAKARTA-003"
|
|
124
|
+
fix: "jakarta.validation 패키지로 변경하세요"
|
|
125
|
+
|
|
126
|
+
- id: "mod-jakarta-004"
|
|
127
|
+
name: "javax.inject 사용"
|
|
128
|
+
severity: "high"
|
|
129
|
+
category: "jakarta-migration"
|
|
130
|
+
description: "javax.inject는 Jakarta EE 9+에서 jakarta.inject로 변경되었습니다."
|
|
131
|
+
enabled: true
|
|
132
|
+
pattern:
|
|
133
|
+
type: "ast-import"
|
|
134
|
+
import: "^javax\\.inject\\."
|
|
135
|
+
custom:
|
|
136
|
+
rule_id: "MOD-JAKARTA-004"
|
|
137
|
+
fix: "jakarta.inject 패키지로 변경하세요"
|
|
138
|
+
|
|
139
|
+
- id: "mod-jakarta-005"
|
|
140
|
+
name: "javax.annotation 사용"
|
|
141
|
+
severity: "medium"
|
|
142
|
+
category: "jakarta-migration"
|
|
143
|
+
description: "javax.annotation은 Jakarta EE 9+에서 jakarta.annotation으로 변경되었습니다."
|
|
144
|
+
enabled: true
|
|
145
|
+
pattern:
|
|
146
|
+
type: "ast-import"
|
|
147
|
+
import: "^javax\\.annotation\\."
|
|
148
|
+
custom:
|
|
149
|
+
rule_id: "MOD-JAKARTA-005"
|
|
150
|
+
fix: "jakarta.annotation 패키지로 변경하세요"
|
|
151
|
+
|
|
152
|
+
- id: "mod-jakarta-006"
|
|
153
|
+
name: "javax.mail 사용"
|
|
154
|
+
severity: "medium"
|
|
155
|
+
category: "jakarta-migration"
|
|
156
|
+
description: "javax.mail은 Jakarta EE 9+에서 jakarta.mail로 변경되었습니다."
|
|
157
|
+
enabled: true
|
|
158
|
+
pattern:
|
|
159
|
+
type: "ast-import"
|
|
160
|
+
import: "^javax\\.mail\\."
|
|
161
|
+
custom:
|
|
162
|
+
rule_id: "MOD-JAKARTA-006"
|
|
163
|
+
fix: "jakarta.mail 패키지로 변경하세요"
|
|
164
|
+
|
|
165
|
+
- id: "mod-jakarta-007"
|
|
166
|
+
name: "javax.websocket 사용"
|
|
167
|
+
severity: "medium"
|
|
168
|
+
category: "jakarta-migration"
|
|
169
|
+
description: "javax.websocket은 Jakarta EE 9+에서 jakarta.websocket으로 변경되었습니다."
|
|
170
|
+
enabled: true
|
|
171
|
+
pattern:
|
|
172
|
+
type: "ast-import"
|
|
173
|
+
import: "^javax\\.websocket\\."
|
|
174
|
+
custom:
|
|
175
|
+
rule_id: "MOD-JAKARTA-007"
|
|
176
|
+
fix: "jakarta.websocket 패키지로 변경하세요"
|
|
177
|
+
|
|
178
|
+
- id: "mod-jakarta-008"
|
|
179
|
+
name: "javax.xml.bind (JAXB) 사용"
|
|
180
|
+
severity: "high"
|
|
181
|
+
category: "jakarta-migration"
|
|
182
|
+
description: "javax.xml.bind(JAXB)는 JDK 11에서 제거되었습니다. jakarta.xml.bind 또는 별도 라이브러리를 사용하세요."
|
|
183
|
+
enabled: true
|
|
184
|
+
pattern:
|
|
185
|
+
type: "ast-import"
|
|
186
|
+
import: "^javax\\.xml\\.bind\\."
|
|
187
|
+
custom:
|
|
188
|
+
rule_id: "MOD-JAKARTA-008"
|
|
189
|
+
fix: "jakarta.xml.bind 또는 org.glassfish.jaxb 라이브러리를 사용하세요"
|
|
190
|
+
|
|
191
|
+
- id: "mod-jakarta-009"
|
|
192
|
+
name: "javax.ws.rs (JAX-RS) 사용"
|
|
193
|
+
severity: "medium"
|
|
194
|
+
category: "jakarta-migration"
|
|
195
|
+
description: "javax.ws.rs는 Jakarta EE 9+에서 jakarta.ws.rs로 변경되었습니다."
|
|
196
|
+
enabled: true
|
|
197
|
+
pattern:
|
|
198
|
+
type: "ast-import"
|
|
199
|
+
import: "^javax\\.ws\\.rs\\."
|
|
200
|
+
custom:
|
|
201
|
+
rule_id: "MOD-JAKARTA-009"
|
|
202
|
+
fix: "jakarta.ws.rs 패키지로 변경하세요"
|
|
203
|
+
|
|
204
|
+
- id: "mod-jakarta-010"
|
|
205
|
+
name: "javax.enterprise (CDI) 사용"
|
|
206
|
+
severity: "medium"
|
|
207
|
+
category: "jakarta-migration"
|
|
208
|
+
description: "javax.enterprise는 Jakarta EE 9+에서 jakarta.enterprise로 변경되었습니다."
|
|
209
|
+
enabled: true
|
|
210
|
+
pattern:
|
|
211
|
+
type: "ast-import"
|
|
212
|
+
import: "^javax\\.enterprise\\."
|
|
213
|
+
custom:
|
|
214
|
+
rule_id: "MOD-JAKARTA-010"
|
|
215
|
+
fix: "jakarta.enterprise 패키지로 변경하세요"
|
|
216
|
+
|
|
217
|
+
# ==================== 3. Spring deprecated 클래스 ====================
|
|
218
|
+
|
|
219
|
+
- id: "mod-spring-001"
|
|
220
|
+
name: "WebMvcConfigurerAdapter 사용"
|
|
221
|
+
severity: "high"
|
|
222
|
+
category: "spring-migration"
|
|
223
|
+
description: "WebMvcConfigurerAdapter는 Spring 5.0에서 deprecated되었습니다. WebMvcConfigurer 인터페이스를 직접 implements하세요."
|
|
224
|
+
enabled: true
|
|
225
|
+
pattern:
|
|
226
|
+
type: "regex"
|
|
227
|
+
regex: "extends\\s+WebMvcConfigurerAdapter\\b"
|
|
228
|
+
custom:
|
|
229
|
+
rule_id: "MOD-SPRING-001"
|
|
230
|
+
fix: "implements WebMvcConfigurer로 변경하세요"
|
|
231
|
+
since: "Spring 5.0"
|
|
232
|
+
|
|
233
|
+
- id: "mod-spring-002"
|
|
234
|
+
name: "HandlerInterceptorAdapter 사용"
|
|
235
|
+
severity: "high"
|
|
236
|
+
category: "spring-migration"
|
|
237
|
+
description: "HandlerInterceptorAdapter는 Spring 5.3에서 deprecated되었습니다. HandlerInterceptor 인터페이스를 implements하세요."
|
|
238
|
+
enabled: true
|
|
239
|
+
pattern:
|
|
240
|
+
type: "regex"
|
|
241
|
+
regex: "extends\\s+HandlerInterceptorAdapter\\b"
|
|
242
|
+
custom:
|
|
243
|
+
rule_id: "MOD-SPRING-002"
|
|
244
|
+
fix: "implements HandlerInterceptor로 변경하세요"
|
|
245
|
+
since: "Spring 5.3"
|
|
246
|
+
|
|
247
|
+
- id: "mod-spring-003"
|
|
248
|
+
name: "WebSecurityConfigurerAdapter 사용"
|
|
249
|
+
severity: "high"
|
|
250
|
+
category: "spring-migration"
|
|
251
|
+
description: "WebSecurityConfigurerAdapter는 Spring Security 5.7에서 deprecated되었습니다. SecurityFilterChain Bean 방식을 사용하세요."
|
|
252
|
+
enabled: true
|
|
253
|
+
pattern:
|
|
254
|
+
type: "regex"
|
|
255
|
+
regex: "extends\\s+WebSecurityConfigurerAdapter\\b"
|
|
256
|
+
custom:
|
|
257
|
+
rule_id: "MOD-SPRING-003"
|
|
258
|
+
fix: "@Bean SecurityFilterChain 방식으로 변경하세요"
|
|
259
|
+
since: "Spring Security 5.7"
|
|
260
|
+
|
|
261
|
+
- id: "mod-spring-004"
|
|
262
|
+
name: "DefaultAnnotationHandlerMapping 사용"
|
|
263
|
+
severity: "high"
|
|
264
|
+
category: "spring-migration"
|
|
265
|
+
description: "DefaultAnnotationHandlerMapping은 Spring 3.1에서 deprecated되었습니다."
|
|
266
|
+
enabled: true
|
|
267
|
+
pattern:
|
|
268
|
+
type: "regex"
|
|
269
|
+
regex: "DefaultAnnotationHandlerMapping"
|
|
270
|
+
custom:
|
|
271
|
+
rule_id: "MOD-SPRING-004"
|
|
272
|
+
fix: "RequestMappingHandlerMapping을 사용하세요"
|
|
273
|
+
since: "Spring 3.1"
|
|
274
|
+
|
|
275
|
+
- id: "mod-spring-005"
|
|
276
|
+
name: "AnnotationMethodHandlerAdapter 사용"
|
|
277
|
+
severity: "high"
|
|
278
|
+
category: "spring-migration"
|
|
279
|
+
description: "AnnotationMethodHandlerAdapter는 Spring 3.1에서 deprecated되었습니다."
|
|
280
|
+
enabled: true
|
|
281
|
+
pattern:
|
|
282
|
+
type: "regex"
|
|
283
|
+
regex: "AnnotationMethodHandlerAdapter"
|
|
284
|
+
custom:
|
|
285
|
+
rule_id: "MOD-SPRING-005"
|
|
286
|
+
fix: "RequestMappingHandlerAdapter를 사용하세요"
|
|
287
|
+
since: "Spring 3.1"
|
|
288
|
+
|
|
289
|
+
- id: "mod-spring-006"
|
|
290
|
+
name: "AsyncRestTemplate 사용"
|
|
291
|
+
severity: "medium"
|
|
292
|
+
category: "spring-migration"
|
|
293
|
+
description: "AsyncRestTemplate은 Spring 5.0에서 deprecated되었습니다. WebClient를 사용하세요."
|
|
294
|
+
enabled: true
|
|
295
|
+
pattern:
|
|
296
|
+
type: "regex"
|
|
297
|
+
regex: "AsyncRestTemplate"
|
|
298
|
+
custom:
|
|
299
|
+
rule_id: "MOD-SPRING-006"
|
|
300
|
+
fix: "WebClient 또는 RestClient를 사용하세요"
|
|
301
|
+
since: "Spring 5.0"
|
|
302
|
+
|
|
303
|
+
- id: "mod-spring-007"
|
|
304
|
+
name: "CallableProcessingInterceptorAdapter 사용"
|
|
305
|
+
severity: "medium"
|
|
306
|
+
category: "spring-migration"
|
|
307
|
+
description: "CallableProcessingInterceptorAdapter는 Spring 5.0에서 deprecated되었습니다."
|
|
308
|
+
enabled: true
|
|
309
|
+
pattern:
|
|
310
|
+
type: "regex"
|
|
311
|
+
regex: "extends\\s+CallableProcessingInterceptorAdapter\\b"
|
|
312
|
+
custom:
|
|
313
|
+
rule_id: "MOD-SPRING-007"
|
|
314
|
+
fix: "implements CallableProcessingInterceptor로 변경하세요"
|
|
315
|
+
|
|
316
|
+
- id: "mod-spring-008"
|
|
317
|
+
name: "ChannelInterceptorAdapter 사용"
|
|
318
|
+
severity: "medium"
|
|
319
|
+
category: "spring-migration"
|
|
320
|
+
description: "ChannelInterceptorAdapter는 Spring 5.0에서 deprecated되었습니다."
|
|
321
|
+
enabled: true
|
|
322
|
+
pattern:
|
|
323
|
+
type: "regex"
|
|
324
|
+
regex: "extends\\s+ChannelInterceptorAdapter\\b"
|
|
325
|
+
custom:
|
|
326
|
+
rule_id: "MOD-SPRING-008"
|
|
327
|
+
fix: "implements ChannelInterceptor로 변경하세요"
|
|
328
|
+
|
|
329
|
+
- id: "mod-spring-009"
|
|
330
|
+
name: "@RequestMapping(method=...) 대신 전용 어노테이션 사용"
|
|
331
|
+
severity: "low"
|
|
332
|
+
category: "spring-migration"
|
|
333
|
+
description: "@RequestMapping(method=RequestMethod.GET)은 @GetMapping으로 간결하게 표현할 수 있습니다."
|
|
334
|
+
enabled: true
|
|
335
|
+
pattern:
|
|
336
|
+
type: "regex"
|
|
337
|
+
regex: "@RequestMapping\\s*\\([^)]*method\\s*=\\s*RequestMethod\\.(GET|POST|PUT|DELETE|PATCH)"
|
|
338
|
+
custom:
|
|
339
|
+
rule_id: "MOD-SPRING-009"
|
|
340
|
+
fix: "@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping을 사용하세요"
|
|
341
|
+
since: "Spring 4.3"
|
|
342
|
+
|
|
343
|
+
- id: "mod-spring-010"
|
|
344
|
+
name: "new ModelAndView() 사용"
|
|
345
|
+
severity: "low"
|
|
346
|
+
category: "spring-migration"
|
|
347
|
+
description: "ModelAndView 객체 직접 생성 방식은 레거시입니다. String 반환 + Model 파라미터 또는 ResponseEntity를 사용하세요."
|
|
348
|
+
enabled: true
|
|
349
|
+
pattern:
|
|
350
|
+
type: "regex"
|
|
351
|
+
regex: "new\\s+ModelAndView\\s*\\("
|
|
352
|
+
custom:
|
|
353
|
+
rule_id: "MOD-SPRING-010"
|
|
354
|
+
fix: "메서드 반환 타입을 String으로 하고 Model 파라미터를 사용하세요"
|
|
355
|
+
|
|
356
|
+
# ==================== 4. iBatis → MyBatis 마이그레이션 ====================
|
|
357
|
+
|
|
358
|
+
- id: "mod-ibatis-001"
|
|
359
|
+
name: "getSqlMapClient() 호출"
|
|
360
|
+
severity: "critical"
|
|
361
|
+
category: "ibatis-migration"
|
|
362
|
+
description: "getSqlMapClient()은 iBatis 전용 메서드입니다. MyBatis의 getSqlSession()을 사용하세요."
|
|
363
|
+
enabled: true
|
|
364
|
+
pattern:
|
|
365
|
+
type: "regex"
|
|
366
|
+
regex: "getSqlMapClient\\s*\\("
|
|
367
|
+
custom:
|
|
368
|
+
rule_id: "MOD-IBATIS-001"
|
|
369
|
+
fix: "getSqlSession() 또는 Mapper 인터페이스를 사용하세요"
|
|
370
|
+
|
|
371
|
+
- id: "mod-ibatis-002"
|
|
372
|
+
name: "SqlMapClientDaoSupport 사용"
|
|
373
|
+
severity: "critical"
|
|
374
|
+
category: "ibatis-migration"
|
|
375
|
+
description: "SqlMapClientDaoSupport는 iBatis 기반 클래스입니다. MyBatis의 SqlSessionDaoSupport 또는 EgovAbstractMapper를 사용하세요."
|
|
376
|
+
enabled: true
|
|
377
|
+
pattern:
|
|
378
|
+
type: "regex"
|
|
379
|
+
regex: "extends\\s+SqlMapClientDaoSupport\\b"
|
|
380
|
+
custom:
|
|
381
|
+
rule_id: "MOD-IBATIS-002"
|
|
382
|
+
fix: "SqlSessionDaoSupport 또는 EgovAbstractMapper를 상속하세요"
|
|
383
|
+
|
|
384
|
+
- id: "mod-ibatis-003"
|
|
385
|
+
name: "queryForObject() 사용 (iBatis)"
|
|
386
|
+
severity: "high"
|
|
387
|
+
category: "ibatis-migration"
|
|
388
|
+
description: "queryForObject()는 iBatis 메서드입니다. MyBatis의 selectOne()을 사용하세요."
|
|
389
|
+
enabled: true
|
|
390
|
+
pattern:
|
|
391
|
+
type: "regex"
|
|
392
|
+
regex: "\\.queryForObject\\s*\\("
|
|
393
|
+
custom:
|
|
394
|
+
rule_id: "MOD-IBATIS-003"
|
|
395
|
+
fix: "selectOne() 또는 Mapper 인터페이스 메서드를 사용하세요"
|
|
396
|
+
|
|
397
|
+
- id: "mod-ibatis-004"
|
|
398
|
+
name: "queryForList() 사용 (iBatis)"
|
|
399
|
+
severity: "high"
|
|
400
|
+
category: "ibatis-migration"
|
|
401
|
+
description: "queryForList()는 iBatis 메서드입니다. MyBatis의 selectList()를 사용하세요."
|
|
402
|
+
enabled: true
|
|
403
|
+
pattern:
|
|
404
|
+
type: "regex"
|
|
405
|
+
regex: "\\.queryForList\\s*\\("
|
|
406
|
+
custom:
|
|
407
|
+
rule_id: "MOD-IBATIS-004"
|
|
408
|
+
fix: "selectList() 또는 Mapper 인터페이스 메서드를 사용하세요"
|
|
409
|
+
|
|
410
|
+
- id: "mod-ibatis-005"
|
|
411
|
+
name: "sqlMapClient 변수 참조"
|
|
412
|
+
severity: "high"
|
|
413
|
+
category: "ibatis-migration"
|
|
414
|
+
description: "sqlMapClient는 iBatis 관련 객체입니다. MyBatis의 SqlSession 또는 Mapper를 사용하세요."
|
|
415
|
+
enabled: true
|
|
416
|
+
pattern:
|
|
417
|
+
type: "regex"
|
|
418
|
+
regex: "\\bsqlMapClient\\b"
|
|
419
|
+
custom:
|
|
420
|
+
rule_id: "MOD-IBATIS-005"
|
|
421
|
+
fix: "SqlSession 또는 Mapper 인터페이스를 사용하세요"
|
|
422
|
+
|
|
423
|
+
- id: "mod-ibatis-006"
|
|
424
|
+
name: "iBatis sqlMap import"
|
|
425
|
+
severity: "high"
|
|
426
|
+
category: "ibatis-migration"
|
|
427
|
+
description: "com.ibatis.* 패키지는 iBatis 전용입니다. MyBatis(org.apache.ibatis)로 마이그레이션하세요."
|
|
428
|
+
enabled: true
|
|
429
|
+
pattern:
|
|
430
|
+
type: "ast-import"
|
|
431
|
+
import: "^com\\.ibatis\\."
|
|
432
|
+
custom:
|
|
433
|
+
rule_id: "MOD-IBATIS-006"
|
|
434
|
+
fix: "org.apache.ibatis.* 또는 MyBatis Mapper 인터페이스를 사용하세요"
|
|
435
|
+
|
|
436
|
+
- id: "mod-ibatis-007"
|
|
437
|
+
name: "iBatis queryForInt/queryForLong 사용"
|
|
438
|
+
severity: "high"
|
|
439
|
+
category: "ibatis-migration"
|
|
440
|
+
description: "queryForInt()/queryForLong()은 iBatis 메서드이며 Spring에서도 deprecated되었습니다."
|
|
441
|
+
enabled: true
|
|
442
|
+
pattern:
|
|
443
|
+
type: "regex"
|
|
444
|
+
regex: "\\.queryFor(Int|Long)\\s*\\("
|
|
445
|
+
custom:
|
|
446
|
+
rule_id: "MOD-IBATIS-007"
|
|
447
|
+
fix: "queryForObject(sql, Integer.class) 또는 selectOne() + 타입 캐스팅을 사용하세요"
|
|
448
|
+
|
|
449
|
+
- id: "mod-ibatis-008"
|
|
450
|
+
name: "SimpleTriggerBean/CronTriggerBean 사용"
|
|
451
|
+
severity: "medium"
|
|
452
|
+
category: "ibatis-migration"
|
|
453
|
+
description: "SimpleTriggerBean/CronTriggerBean은 deprecated된 Quartz 설정 클래스입니다."
|
|
454
|
+
enabled: true
|
|
455
|
+
pattern:
|
|
456
|
+
type: "regex"
|
|
457
|
+
regex: "(Simple|Cron)TriggerBean\\b"
|
|
458
|
+
custom:
|
|
459
|
+
rule_id: "MOD-IBATIS-008"
|
|
460
|
+
fix: "SimpleTriggerFactoryBean / CronTriggerFactoryBean을 사용하세요"
|
|
461
|
+
|
|
462
|
+
# ==================== 5. Java API 현대화 ====================
|
|
463
|
+
|
|
464
|
+
- id: "mod-java-001"
|
|
465
|
+
name: "new Date() 사용"
|
|
466
|
+
severity: "low"
|
|
467
|
+
category: "java-modernize"
|
|
468
|
+
description: "new Date()는 레거시 API입니다. Java 8+ java.time API를 사용하세요."
|
|
469
|
+
enabled: true
|
|
470
|
+
pattern:
|
|
471
|
+
type: "regex"
|
|
472
|
+
regex: "new\\s+Date\\s*\\(\\s*\\)"
|
|
473
|
+
custom:
|
|
474
|
+
rule_id: "MOD-JAVA-001"
|
|
475
|
+
fix: "LocalDateTime.now() 또는 Instant.now()를 사용하세요"
|
|
476
|
+
|
|
477
|
+
- id: "mod-java-002"
|
|
478
|
+
name: "static SimpleDateFormat (스레드 안전 위반)"
|
|
479
|
+
severity: "high"
|
|
480
|
+
category: "java-modernize"
|
|
481
|
+
description: "SimpleDateFormat을 static으로 선언하면 멀티스레드 환경에서 오류가 발생합니다."
|
|
482
|
+
enabled: false # quality-legacy-008과 동일 regex 중복
|
|
483
|
+
pattern:
|
|
484
|
+
type: "regex"
|
|
485
|
+
regex: "static\\s+.*SimpleDateFormat\\s+\\w+"
|
|
486
|
+
custom:
|
|
487
|
+
rule_id: "MOD-JAVA-002"
|
|
488
|
+
fix: "DateTimeFormatter(thread-safe)를 사용하세요"
|
|
489
|
+
|
|
490
|
+
- id: "mod-java-003"
|
|
491
|
+
name: "Calendar.getInstance() 사용"
|
|
492
|
+
severity: "low"
|
|
493
|
+
category: "java-modernize"
|
|
494
|
+
description: "Calendar는 레거시 API입니다. Java 8+ java.time API를 사용하세요."
|
|
495
|
+
enabled: true
|
|
496
|
+
pattern:
|
|
497
|
+
type: "regex"
|
|
498
|
+
regex: "Calendar\\.getInstance\\s*\\("
|
|
499
|
+
custom:
|
|
500
|
+
rule_id: "MOD-JAVA-003"
|
|
501
|
+
fix: "LocalDate.now(), LocalDateTime.now() 등을 사용하세요"
|
|
502
|
+
|
|
503
|
+
- id: "mod-java-004"
|
|
504
|
+
name: "Vector 사용"
|
|
505
|
+
severity: "medium"
|
|
506
|
+
category: "java-modernize"
|
|
507
|
+
description: "Vector는 synchronized로 인해 불필요한 오버헤드가 있습니다. ArrayList 또는 CopyOnWriteArrayList를 사용하세요."
|
|
508
|
+
enabled: false # quality-legacy-001과 동일 regex 중복
|
|
509
|
+
pattern:
|
|
510
|
+
type: "regex"
|
|
511
|
+
regex: "new\\s+Vector\\s*[<(]"
|
|
512
|
+
custom:
|
|
513
|
+
rule_id: "MOD-JAVA-004"
|
|
514
|
+
fix: "ArrayList(단일스레드) 또는 CopyOnWriteArrayList(멀티스레드)를 사용하세요"
|
|
515
|
+
|
|
516
|
+
- id: "mod-java-005"
|
|
517
|
+
name: "Hashtable 사용"
|
|
518
|
+
severity: "medium"
|
|
519
|
+
category: "java-modernize"
|
|
520
|
+
description: "Hashtable은 synchronized로 인해 불필요한 오버헤드가 있고 null을 허용하지 않습니다."
|
|
521
|
+
enabled: false # quality-legacy-002와 동일 regex 중복
|
|
522
|
+
pattern:
|
|
523
|
+
type: "regex"
|
|
524
|
+
regex: "new\\s+Hashtable\\s*[<(]"
|
|
525
|
+
custom:
|
|
526
|
+
rule_id: "MOD-JAVA-005"
|
|
527
|
+
fix: "HashMap(단일스레드) 또는 ConcurrentHashMap(멀티스레드)를 사용하세요"
|
|
528
|
+
|
|
529
|
+
- id: "mod-java-006"
|
|
530
|
+
name: "StringTokenizer 사용"
|
|
531
|
+
severity: "low"
|
|
532
|
+
category: "java-modernize"
|
|
533
|
+
description: "StringTokenizer는 레거시 클래스입니다. String.split() 또는 Pattern을 사용하세요."
|
|
534
|
+
enabled: false # quality-legacy-003과 동일 regex 중복
|
|
535
|
+
pattern:
|
|
536
|
+
type: "regex"
|
|
537
|
+
regex: "new\\s+StringTokenizer\\s*\\("
|
|
538
|
+
custom:
|
|
539
|
+
rule_id: "MOD-JAVA-006"
|
|
540
|
+
fix: "String.split() 또는 java.util.regex.Pattern을 사용하세요"
|
|
541
|
+
|
|
542
|
+
- id: "mod-java-007"
|
|
543
|
+
name: "log4j 1.x 직접 사용"
|
|
544
|
+
severity: "high"
|
|
545
|
+
category: "java-modernize"
|
|
546
|
+
description: "Apache Log4j 1.x는 EOL이며 보안 취약점이 있습니다. SLF4J + Logback을 사용하세요."
|
|
547
|
+
enabled: false # quality-legacy-006과 동일 regex 중복
|
|
548
|
+
pattern:
|
|
549
|
+
type: "ast-import"
|
|
550
|
+
import: "^org\\.apache\\.log4j\\."
|
|
551
|
+
custom:
|
|
552
|
+
rule_id: "MOD-JAVA-007"
|
|
553
|
+
fix: "org.slf4j.Logger + Logback을 사용하세요"
|
|
554
|
+
|
|
555
|
+
- id: "mod-java-008"
|
|
556
|
+
name: "HSSFWorkbook 사용 (Excel 97-2003 전용)"
|
|
557
|
+
severity: "medium"
|
|
558
|
+
category: "java-modernize"
|
|
559
|
+
description: "HSSFWorkbook은 .xls(97-2003) 전용입니다. SXSSFWorkbook(.xlsx)을 사용하면 대용량도 처리 가능합니다."
|
|
560
|
+
enabled: false # quality-legacy-004와 동일 regex 중복
|
|
561
|
+
pattern:
|
|
562
|
+
type: "regex"
|
|
563
|
+
regex: "new\\s+HSSFWorkbook\\s*\\("
|
|
564
|
+
custom:
|
|
565
|
+
rule_id: "MOD-JAVA-008"
|
|
566
|
+
fix: "SXSSFWorkbook(대용량) 또는 XSSFWorkbook(.xlsx)을 사용하세요"
|
|
567
|
+
|
|
568
|
+
- id: "mod-java-009"
|
|
569
|
+
name: "commons-lang 구버전 사용"
|
|
570
|
+
severity: "medium"
|
|
571
|
+
category: "java-modernize"
|
|
572
|
+
description: "org.apache.commons.lang은 EOL입니다. commons-lang3을 사용하세요."
|
|
573
|
+
enabled: false # quality-ast-005와 동일 regex 중복
|
|
574
|
+
pattern:
|
|
575
|
+
type: "ast-import"
|
|
576
|
+
import: "^org\\.apache\\.commons\\.lang\\."
|
|
577
|
+
custom:
|
|
578
|
+
rule_id: "MOD-JAVA-009"
|
|
579
|
+
fix: "org.apache.commons.lang3 패키지로 마이그레이션하세요"
|
|
580
|
+
|
|
581
|
+
- id: "mod-java-010"
|
|
582
|
+
name: "sun.* 내부 API 사용"
|
|
583
|
+
severity: "high"
|
|
584
|
+
category: "java-modernize"
|
|
585
|
+
description: "sun.* 패키지는 JDK 내부 API로 JDK 버전 간 호환성이 보장되지 않습니다."
|
|
586
|
+
enabled: false # quality-ast-006과 동일 regex 중복
|
|
587
|
+
pattern:
|
|
588
|
+
type: "ast-import"
|
|
589
|
+
import: "^sun\\."
|
|
590
|
+
custom:
|
|
591
|
+
rule_id: "MOD-JAVA-010"
|
|
592
|
+
fix: "공식 Java API 또는 표준 라이브러리를 사용하세요"
|
|
593
|
+
|
|
594
|
+
- id: "mod-java-011"
|
|
595
|
+
name: "BeanUtils.copyProperties() 사용"
|
|
596
|
+
severity: "low"
|
|
597
|
+
category: "java-modernize"
|
|
598
|
+
description: "BeanUtils.copyProperties()는 리플렉션 기반이라 성능이 낮고 타입 안전하지 않습니다."
|
|
599
|
+
enabled: false # quality-legacy-007과 동일 regex 중복
|
|
600
|
+
pattern:
|
|
601
|
+
type: "regex"
|
|
602
|
+
regex: "BeanUtils\\.copyProperties\\s*\\("
|
|
603
|
+
custom:
|
|
604
|
+
rule_id: "MOD-JAVA-011"
|
|
605
|
+
fix: "MapStruct(컴파일타임 매핑) 또는 명시적 setter 호출을 사용하세요"
|
|
606
|
+
|
|
607
|
+
- id: "mod-java-012"
|
|
608
|
+
name: "Enumeration 사용"
|
|
609
|
+
severity: "low"
|
|
610
|
+
category: "java-modernize"
|
|
611
|
+
description: "Enumeration은 레거시 인터페이스입니다. Iterator 또는 Stream을 사용하세요."
|
|
612
|
+
enabled: false # quality-legacy-005와 동일 regex 중복
|
|
613
|
+
pattern:
|
|
614
|
+
type: "regex"
|
|
615
|
+
regex: "\\bEnumeration\\s*<"
|
|
616
|
+
custom:
|
|
617
|
+
rule_id: "MOD-JAVA-012"
|
|
618
|
+
fix: "Iterator 또는 Stream API를 사용하세요"
|
|
619
|
+
|
|
620
|
+
- language: xml
|
|
621
|
+
rules:
|
|
622
|
+
# ==================== 6. XML 설정 현대화 ====================
|
|
623
|
+
|
|
624
|
+
- id: "mod-xml-001"
|
|
625
|
+
name: "iBatis sqlMap XML 설정"
|
|
626
|
+
severity: "high"
|
|
627
|
+
category: "ibatis-migration"
|
|
628
|
+
description: "<sqlMap> 태그는 iBatis 설정입니다. MyBatis의 <mapper> 태그로 변경하세요."
|
|
629
|
+
enabled: true
|
|
630
|
+
pattern:
|
|
631
|
+
type: "regex"
|
|
632
|
+
regex: "<sqlMap\\b"
|
|
633
|
+
custom:
|
|
634
|
+
rule_id: "MOD-XML-001"
|
|
635
|
+
fix: "<mapper namespace=\"...\">로 변경하세요"
|
|
636
|
+
|
|
637
|
+
- id: "mod-xml-002"
|
|
638
|
+
name: "iBatis isNotNull/isEqual 태그"
|
|
639
|
+
severity: "high"
|
|
640
|
+
category: "ibatis-migration"
|
|
641
|
+
description: "<isNotNull>, <isEqual> 등은 iBatis 동적 SQL 태그입니다. MyBatis의 <if test=\"...\">로 변경하세요."
|
|
642
|
+
enabled: true
|
|
643
|
+
pattern:
|
|
644
|
+
type: "regex"
|
|
645
|
+
regex: "<(isNotNull|isNotEmpty|isNull|isEmpty|isEqual|isNotEqual|isGreaterThan|isLessThan)\\b"
|
|
646
|
+
custom:
|
|
647
|
+
rule_id: "MOD-XML-002"
|
|
648
|
+
fix: "<if test=\"...\"> 또는 <choose>/<when> 으로 변경하세요"
|
|
649
|
+
|
|
650
|
+
- id: "mod-xml-003"
|
|
651
|
+
name: "iBatis iterate 태그"
|
|
652
|
+
severity: "high"
|
|
653
|
+
category: "ibatis-migration"
|
|
654
|
+
description: "<iterate>는 iBatis 태그입니다. MyBatis의 <foreach>로 변경하세요."
|
|
655
|
+
enabled: true
|
|
656
|
+
pattern:
|
|
657
|
+
type: "regex"
|
|
658
|
+
regex: "<iterate\\b"
|
|
659
|
+
custom:
|
|
660
|
+
rule_id: "MOD-XML-003"
|
|
661
|
+
fix: "<foreach collection=\"list\" item=\"item\" ...>으로 변경하세요"
|
|
662
|
+
|
|
663
|
+
- id: "mod-xml-004"
|
|
664
|
+
name: "iBatis #variable# 파라미터 구문"
|
|
665
|
+
severity: "high"
|
|
666
|
+
category: "ibatis-migration"
|
|
667
|
+
description: "#variable# 구문은 iBatis 파라미터 바인딩입니다. MyBatis의 #{variable}로 변경하세요."
|
|
668
|
+
enabled: true
|
|
669
|
+
pattern:
|
|
670
|
+
type: "regex"
|
|
671
|
+
regex: "#[a-zA-Z_][a-zA-Z0-9_]*#"
|
|
672
|
+
custom:
|
|
673
|
+
rule_id: "MOD-XML-004"
|
|
674
|
+
fix: "#{variable} 형식으로 변경하세요"
|
|
675
|
+
|
|
676
|
+
- id: "mod-xml-005"
|
|
677
|
+
name: "Spring bean XML 설정에서 deprecated 클래스 참조"
|
|
678
|
+
severity: "medium"
|
|
679
|
+
category: "spring-migration"
|
|
680
|
+
description: "Spring XML 설정에서 deprecated된 클래스가 참조되고 있습니다."
|
|
681
|
+
enabled: true
|
|
682
|
+
pattern:
|
|
683
|
+
type: "regex"
|
|
684
|
+
regex: "class=\"org\\.springframework\\.(web\\.servlet\\.mvc\\.annotation\\.(AnnotationMethodHandlerAdapter|DefaultAnnotationHandlerMapping)|scheduling\\.quartz\\.(Simple|Cron)TriggerBean)"
|
|
685
|
+
custom:
|
|
686
|
+
rule_id: "MOD-XML-005"
|
|
687
|
+
fix: "최신 Spring 클래스로 변경하세요"
|