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.
Files changed (161) hide show
  1. package/README.md +203 -1
  2. package/data/2026-03-04_20-54.json +181 -0
  3. package/data/2026-03-04_20-56.json +181 -0
  4. package/data/apex-rulesets/egov.yaml +469 -0
  5. package/data/apex-rulesets/modernize.yaml +687 -0
  6. package/data/apex-rulesets/quality.yaml +1677 -0
  7. package/data/apex-rulesets/rule-schema.yaml +587 -0
  8. package/data/apex-rulesets/secure.yaml +1688 -0
  9. package/data/apex-rulesets/spring.yaml +455 -0
  10. package/data/apex-rulesets/sql-format.yaml +99 -0
  11. package/data/apex-rulesets/sql-oracle.yaml +281 -0
  12. package/data/apex-rulesets/sql.yaml +1660 -0
  13. package/dist/cli/headless.d.ts.map +1 -1
  14. package/dist/cli/headless.js +32 -10
  15. package/dist/cli/headless.js.map +1 -1
  16. package/dist/cli/index.js +31 -3
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/core/agent.d.ts +3 -3
  19. package/dist/core/agent.d.ts.map +1 -1
  20. package/dist/core/agent.js +203 -384
  21. package/dist/core/agent.js.map +1 -1
  22. package/dist/core/commands.d.ts +2 -1
  23. package/dist/core/commands.d.ts.map +1 -1
  24. package/dist/core/commands.js +61 -9
  25. package/dist/core/commands.js.map +1 -1
  26. package/dist/core/config.d.ts +14 -0
  27. package/dist/core/config.d.ts.map +1 -1
  28. package/dist/core/config.js +41 -4
  29. package/dist/core/config.js.map +1 -1
  30. package/dist/core/conversation.d.ts +2 -2
  31. package/dist/core/conversation.d.ts.map +1 -1
  32. package/dist/core/conversation.js.map +1 -1
  33. package/dist/core/intentRouter.d.ts +43 -0
  34. package/dist/core/intentRouter.d.ts.map +1 -0
  35. package/dist/core/intentRouter.js +804 -0
  36. package/dist/core/intentRouter.js.map +1 -0
  37. package/dist/core/llm/anthropic.d.ts +24 -0
  38. package/dist/core/llm/anthropic.d.ts.map +1 -0
  39. package/dist/core/llm/anthropic.js +226 -0
  40. package/dist/core/llm/anthropic.js.map +1 -0
  41. package/dist/core/llm/ollama.d.ts +5 -14
  42. package/dist/core/llm/ollama.d.ts.map +1 -1
  43. package/dist/core/llm/ollama.js +3 -0
  44. package/dist/core/llm/ollama.js.map +1 -1
  45. package/dist/core/llm/types.d.ts +22 -0
  46. package/dist/core/llm/types.d.ts.map +1 -0
  47. package/dist/core/llm/types.js +2 -0
  48. package/dist/core/llm/types.js.map +1 -0
  49. package/dist/core/mcp/client.d.ts +6 -0
  50. package/dist/core/mcp/client.d.ts.map +1 -1
  51. package/dist/core/mcp/client.js +16 -0
  52. package/dist/core/mcp/client.js.map +1 -1
  53. package/dist/core/mcp/init.d.ts +12 -0
  54. package/dist/core/mcp/init.d.ts.map +1 -0
  55. package/dist/core/mcp/init.js +55 -0
  56. package/dist/core/mcp/init.js.map +1 -0
  57. package/dist/core/mcp/logger.d.ts +14 -0
  58. package/dist/core/mcp/logger.d.ts.map +1 -0
  59. package/dist/core/mcp/logger.js +50 -0
  60. package/dist/core/mcp/logger.js.map +1 -0
  61. package/dist/core/tools/analyzePatterns.d.ts +3 -0
  62. package/dist/core/tools/analyzePatterns.d.ts.map +1 -0
  63. package/dist/core/tools/analyzePatterns.js +293 -0
  64. package/dist/core/tools/analyzePatterns.js.map +1 -0
  65. package/dist/core/tools/apexPaths.d.ts +14 -0
  66. package/dist/core/tools/apexPaths.d.ts.map +1 -0
  67. package/dist/core/tools/apexPaths.js +54 -0
  68. package/dist/core/tools/apexPaths.js.map +1 -0
  69. package/dist/core/tools/apexUtils.d.ts +36 -0
  70. package/dist/core/tools/apexUtils.d.ts.map +1 -0
  71. package/dist/core/tools/apexUtils.js +83 -0
  72. package/dist/core/tools/apexUtils.js.map +1 -0
  73. package/dist/core/tools/explainIssue.d.ts +3 -0
  74. package/dist/core/tools/explainIssue.d.ts.map +1 -0
  75. package/dist/core/tools/explainIssue.js +181 -0
  76. package/dist/core/tools/explainIssue.js.map +1 -0
  77. package/dist/core/tools/fixGen.d.ts +3 -0
  78. package/dist/core/tools/fixGen.d.ts.map +1 -0
  79. package/dist/core/tools/fixGen.js +338 -0
  80. package/dist/core/tools/fixGen.js.map +1 -0
  81. package/dist/core/tools/generateImprovements.d.ts +21 -0
  82. package/dist/core/tools/generateImprovements.d.ts.map +1 -0
  83. package/dist/core/tools/generateImprovements.js +602 -0
  84. package/dist/core/tools/generateImprovements.js.map +1 -0
  85. package/dist/core/tools/generateReport.d.ts +3 -0
  86. package/dist/core/tools/generateReport.d.ts.map +1 -0
  87. package/dist/core/tools/generateReport.js +315 -0
  88. package/dist/core/tools/generateReport.js.map +1 -0
  89. package/dist/core/tools/index.d.ts +7 -0
  90. package/dist/core/tools/index.d.ts.map +1 -1
  91. package/dist/core/tools/index.js +62 -23
  92. package/dist/core/tools/index.js.map +1 -1
  93. package/dist/core/tools/recommendProfile.d.ts +3 -0
  94. package/dist/core/tools/recommendProfile.d.ts.map +1 -0
  95. package/dist/core/tools/recommendProfile.js +334 -0
  96. package/dist/core/tools/recommendProfile.js.map +1 -0
  97. package/dist/core/tools/ruleGen.d.ts +3 -0
  98. package/dist/core/tools/ruleGen.d.ts.map +1 -0
  99. package/dist/core/tools/ruleGen.js +1103 -0
  100. package/dist/core/tools/ruleGen.js.map +1 -0
  101. package/dist/core/tools/standards.d.ts.map +1 -1
  102. package/dist/core/tools/standards.js +7 -3
  103. package/dist/core/tools/standards.js.map +1 -1
  104. package/dist/ui/App.d.ts.map +1 -1
  105. package/dist/ui/App.js +86 -35
  106. package/dist/ui/App.js.map +1 -1
  107. package/dist/ui/components/InputBox.d.ts +1 -3
  108. package/dist/ui/components/InputBox.d.ts.map +1 -1
  109. package/dist/ui/components/InputBox.js +146 -5
  110. package/dist/ui/components/InputBox.js.map +1 -1
  111. package/dist/ui/components/MessageList.d.ts +3 -1
  112. package/dist/ui/components/MessageList.d.ts.map +1 -1
  113. package/dist/ui/components/MessageList.js +13 -7
  114. package/dist/ui/components/MessageList.js.map +1 -1
  115. package/dist/ui/components/StatusBar.d.ts +1 -1
  116. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  117. package/dist/ui/components/StatusBar.js +3 -2
  118. package/dist/ui/components/StatusBar.js.map +1 -1
  119. package/dist/ui/components/ToolStatus.d.ts +3 -1
  120. package/dist/ui/components/ToolStatus.d.ts.map +1 -1
  121. package/dist/ui/components/ToolStatus.js +19 -4
  122. package/dist/ui/components/ToolStatus.js.map +1 -1
  123. package/package.json +7 -1
  124. package/demo.gif +0 -0
  125. package/demo.tape +0 -53
  126. package/screenshot.png +0 -0
  127. package/src/cli/banner.ts +0 -38
  128. package/src/cli/headless.ts +0 -63
  129. package/src/cli/index.ts +0 -57
  130. package/src/core/agent.ts +0 -711
  131. package/src/core/commands.ts +0 -118
  132. package/src/core/config.ts +0 -98
  133. package/src/core/conversation.ts +0 -235
  134. package/src/core/llm/ollama.ts +0 -351
  135. package/src/core/mcp/client.ts +0 -143
  136. package/src/core/tools/analyzeAll.ts +0 -482
  137. package/src/core/tools/ast.ts +0 -826
  138. package/src/core/tools/builtIn.ts +0 -221
  139. package/src/core/tools/cache.ts +0 -570
  140. package/src/core/tools/cssAnalysis.ts +0 -324
  141. package/src/core/tools/dependencyAnalysis.ts +0 -363
  142. package/src/core/tools/embeddings.ts +0 -746
  143. package/src/core/tools/frontendAst.ts +0 -802
  144. package/src/core/tools/htmlAnalysis.ts +0 -466
  145. package/src/core/tools/index.ts +0 -160
  146. package/src/core/tools/javaAst.ts +0 -1030
  147. package/src/core/tools/javaQuality.integration.test.ts +0 -537
  148. package/src/core/tools/memory.ts +0 -655
  149. package/src/core/tools/mybatisAnalysis.ts +0 -322
  150. package/src/core/tools/openapiAnalysis.ts +0 -431
  151. package/src/core/tools/pythonAnalysis.ts +0 -477
  152. package/src/core/tools/sqlAnalysis.ts +0 -298
  153. package/src/core/tools/standards.test.ts +0 -186
  154. package/src/core/tools/standards.ts +0 -889
  155. package/src/core/tools/types.ts +0 -38
  156. package/src/ui/App.tsx +0 -334
  157. package/src/ui/components/InputBox.tsx +0 -37
  158. package/src/ui/components/MessageList.tsx +0 -80
  159. package/src/ui/components/StatusBar.tsx +0 -36
  160. package/src/ui/components/ToolStatus.tsx +0 -38
  161. 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 클래스로 변경하세요"