aiportal-java

요약. aiportal-java: 자율 개선 회차 16회, 릴리즈 0건. 최근 릴리즈 없음. 건강 B 14일: 릴리즈 0, 실패 0, 경고 0, 회귀 0

현황

저장소
https://github.com/hkjang/aiportal-java
마지막 회차
2026-09-08 19:17 KST — • 기타 verify failed: 실패한 검증: ./gradlew --quiet test (exit 1)
최근 릴리즈
skipped — skipped
사유
릴리즈 이력이 전혀 없는 저장소. git tag 0개(전체 이력 23커밋), GitHub Release 0개(gh 인증 정상, release list 비어 있음), CHANGELOG/RELEASE/VERSION 파일 및 릴리즈 노트 양식 없음, docs/ 25개 문서에도 릴리즈 절차 없음. 유일한 버전 문자열인 build.gradle:9 version='0.0.1-SNAPSHOT' 은 Spring Initializr 기본값으로 first commit 이후 한 번도 변경된 적 없음. .github/workflows 부재이며 .gitlab-ci.yml 은 전적으로 브랜치 트리거(main/develop -> gradlew clean build -> app.war 복사 -> k8s rollout/podman restart)로 태그에 반응하는 워크플로나 버전별 산출물이 없음. deploy/offline/change-package.sh 는 폐쇄망 GitLab clone 으로 변경분을 옮기는 base->target diff 전송 도구로 릴리즈 패키징이 아님. 태그 형식/버전 체계/노트 위치를 새로 정하는 것은 사람의 판단이라 아무것도 만들지 않음. 저장소 변경 없음(커밋·태그 없음, worktree clean).

회차 이력

일시프로젝트결과
2026-09-08 19:17aiportal-java검증 실패 verify failed: 실패한 검증: ./gradlew --quiet test (exit 1)
4파일 +331/−60 · 테스트 2 — fix(policy): 빈 정책 저장이 무시되는데 성공으로 응답되는 문제 수정
2026-09-08 16:25aiportal-java검증 실패 verify failed: 실패한 검증: ./gradlew --quiet test (exit 126)
4파일 +284/−10 · 테스트 2 — fix(board): 등록·수정·삭제에서도 조회수가 오르는 문제 수정
2026-09-07 09:18aiportal-java검증 실패 verify failed: 실패한 검증: ./gradlew --quiet test (exit 126)
3파일 +160/−23 · 테스트 1 — fix(drm): DRM 복호화 실패가 성공으로 위장되어 암호문이 그대로 처리되는 문제 수정
2026-09-07 00:07aiportal-java검증 실패 verify failed: 실행한 검증 명령이 없음 — 정책(verify) 또는 자동 감지 필요
7파일 +309/−6 · 테스트 3 — fix(tools,authority,statistics): 조회 결과 없음이 500 오류로 응답되는 문제 수정
2026-09-06 12:37aiportal-java검증 실패 verify failed: 실행한 검증 명령이 없음 — 정책(verify) 또는 자동 감지 필요
5파일 +411/−17 · 테스트 2 — fix(athena): 응답 형식이 어긋난 Athena/IAM 응답에서 발생하는 NPE 수정
2026-09-06 12:27aiportal-java검증 실패 verify failed: 실행한 검증 명령이 없음 — 정책(verify) 또는 자동 감지 필요
11파일 +351/−80 · 테스트 6 — refactor(cors): 허용 Origin 목록 이중 관리로 인한 인증 실패 응답 CORS 누락 수정
2026-09-06 02:19aiportal-java검증 실패 verify failed: 실행한 검증 명령이 없음 — 정책(verify) 또는 자동 감지 필요
3파일 +225/−0 · 테스트 1 — fix(error): 잘못된 요청 파라미터가 400 대신 500 으로 응답되는 문제 수정
2026-09-05 00:51aiportal-java병합 완료 merged PR #9, release skipped
2026-09-04 05:56aiportal-java병합 완료 merged PR #8, release skipped
2026-09-03 22:15aiportal-java병합 완료 merged PR #7, release skipped
2026-09-03 13:56aiportal-java병합 완료 merged PR #6, release skipped
2026-09-03 07:56aiportal-java병합 완료 merged PR #5, release skipped
2026-09-03 07:46aiportal-java병합 완료 merged PR #4, release skipped
2026-09-03 01:55aiportal-java병합 완료 merged PR #3, release skipped
2026-09-02 19:35aiportal-java병합 완료 merged PR #2, release skipped
2026-09-02 13:39aiportal-java병합 완료 merged PR #1, release skipped

비용·사용량

최근 30세션
시각프로젝트단계시간비용토큰 입력/출력종료
19:17aiportal-java개선7분42$2.792.5M / 29Ksuccess
16:25aiportal-java개선4분35$1.861.3M / 20Ksuccess
09:18aiportal-java개선8분34$1.991.5M / 22Ksuccess
00:07aiportal-java개선18분48$5.062.2M / 30Ksuccess
12:37aiportal-java개선7분48$2.752.3M / 33Ksuccess
12:27aiportal-java개선7분39$2.321.6M / 33Ksuccess
02:19aiportal-java개선9분55$2.612.5M / 28Ksuccess

아이디어 백로그 — 대기 11 / 전체 12

에이전트가 회차마다 재평가한다. 가치 높고 위험 낮은 대기 항목이 다음 회차 후보다.
아이디어가치/위험/크기상태메모갱신
컨트롤러가 @RequestParam user_id 를 인증 사용자와 대조 없이 신뢰 (IDOR)5/4/L대기AppController·ToolsController·WidgetController 등 10여 곳. ChatController 는 2026-09-02 세션에서 principal 로 덮어쓰도록 고쳐졌다. ToolsController.preview 는 @PathVariable id 만 받고 selectOcrOneInfo 매퍼에도 user_id 필터가 없어 id 를 증가시키며 남의 OCR 원본 파일을 내려받을 수 있다. 프론트 영향 범위가 넓어 엔드포인트를 나눠 여러 세션에 걸쳐 진행할 것2026-09-08
인증 필터의 요청 헤더 전량 INFO 로깅 축소3/2/S대기JwtAuthenticationFilter 가 요청마다 모든 헤더와 profile 을 INFO 로 남긴다. LogMaskUtil 로 마스킹은 하지만 요청량 대비 로그량이 크고 운영 로그에서 실제 오류를 가린다. DEBUG 로 낮추거나 필요한 헤더만 남기는 방안. 미병합 커밋 acc1904 이 같은 파일을 건드렸으므로 병합 후 진행할 것2026-09-08
남은 외부 응답 무검증 접근에 JsonNodeUtil 확대 적용3/2/M대기2026-09-06 세션(커밋 602dfc3, 아직 미병합)에서 JsonNodeUtil 을 만들었으므로 getAthenaCallApi 반환값의 (JsonNode) 무검증 캐스팅, PythonApiCallUtil/RerankModelCallUtil 응답 파싱 등 나머지 경로에도 같은 방식을 적용할 수 있다. 해당 커밋이 main 에 병합된 뒤 진행할 것2026-09-08
MenuAccessAuthorityServiceImpl.update 가 setModifyAuditFields 대신 setCreationAuditFields 호출2/1/S대기137행. 다른 모든 수정 경로는 setModifyAuditFields 를 쓴다. UPDATE SQL 이 creator_id 를 바인딩하지 않아 지금은 무해하지만 modifier_id 가 설정되지 않는다. 이 파일은 미병합 커밋 a2bcb2b 이 건드렸으므로 병합 후 진행할 것2026-09-08
ImgCreate 목록 총건수가 검색어를 무시2/1/S대기ToolsServiceImpl 1293행 countPageImgHistoryList(userId) 는 사용자 id 만 넘기는데 selectPageImgHistoryList 는 key_word 필터를 적용한다(ImgCreateMapper.xml 59-65 vs 75-81). 검색 시 총건수와 실제 목록 건수가 어긋나 페이징이 잘못된다2026-09-08
ValidUtil, ApiCallUtil 단위 테스트 공백 보강2/1/S대기common/util 15개 중 7개에 테스트 존재(2026-09-08 세션에서 SystemPolicyUtilTest 추가). ValidUtil 은 isValidUUID 하나뿐이라 값이 낮고, ApiCallUtil 은 RestClient 를 필드에서 직접 만들어(RestClient.create()) 주입이 불가능해 테스트하려면 생성자 주입으로 바꿔야 한다 — 그 리팩터가 실제 이득2026-09-08
ToolsServiceImpl.decFileDrm 이 DrmUtil 을 new 로 직접 생성해 테스트 불가2/2/S대기ToolsServiceImpl 1063·1109행과 SampleDrmServiceImpl 34행이 매 호출마다 new DrmUtil(drmConfig) 를 만든다. DrmConfig 만 의존하는 무상태 객체이므로 @Bean 하나로 만들어 주입하면 decFileDrm 의 실패 처리를 단위 테스트할 수 있다. 2026-09-07 세션에서는 DrmUtil 자체에 테스트 시임을 넣어 우회했다2026-09-08
CORS 허용 메서드·헤더도 CorsProperties 로 옮기고 필터 오류 응답에 Vary: Origin 추가2/2/S대기2026-09-06 세션(커밋 acc1904, 아직 미병합)에서 Origin 만 설정화했다. WebConfig 의 allowedMethods/allowedHeaders/exposedHeaders 는 아직 하드코딩이고, 필터가 직접 쓰는 오류 응답에는 Vary: Origin 이 없어 캐시가 잘못된 CORS 헤더를 재사용할 여지가 있다. ToolsController.preview 의 @CrossOrigin 하드코딩 Origin 목록(83-107행)도 같은 대상2026-09-08
FileServiceImpl.ocrUpload 의 하드코딩 경로 E:\KCB\doc\ocr 설정화 또는 제거2/2/S대기호출부가 없는 사실상 죽은 코드. 제거 쪽이 깔끔하나 외부 호출 여부 확인 필요2026-09-08
PolicyController 의 정책 저장 본문 구조 검증 부재2/2/S대기POST /policy/extension·/policy/note 가 List<Map<String,Object>> 를 그대로 받아 키 이름·타입을 전혀 검증하지 않는다. 오타난 키('groupp', 'limits')로 저장하면 API 는 success 를 돌려주지만 appCreateCheck 는 그 항목을 무시한다(이번 세션에서 NPE 대신 무제한으로 처리하게 됐으므로 조용히 제한이 풀린다). 전용 DTO + @Valid 로 바꾸면 잘못된 정책 저장을 400 으로 막을 수 있다2026-09-08
decFileDrm 의 도달 불가능한 폴백 분기 제거1/1/S대기ToolsServiceImpl 1081-1083·1127-1129행의 catch(IOException) 안 'if (resultFile != null && resultFile.exists()) return resultFile.getAbsolutePath();' 는 도달할 수 없다. 실패 경로를 읽는 사람을 헷갈리게 하는 죽은 코드2026-09-08
SystemPolicyUtil 의 빈 배열 저장 무시 및 fileLimit 키 불일치3/2/S완료2026-09-08 세션에서 구현(커밋 71c6872). saveExtension/saveNote 를 공통 writePolicyList 로 모아 빈 목록도 저장하고 null 은 BusinessException 으로 거부, 직렬화 실패를 예외로 올림. deleteExtension 은 실제 삭제된 경우에만 저장. getFileLimit()/saveFileLimit() 키 불일치는 심플봇 제한에 위임해 해소. 함께 드러나는 AthenaServiceImpl.appCreateCheck 의 빈 정책 NPE 도 toAppCreateLimits 분리로 수정2026-09-08

원장 (에이전트가 남긴 기록)

2026-09-02

환경 메모

2026-09-02

2026-09-03

2026-09-03

2026-09-03

2026-09-03

2026-09-03

2026-09-04

2026-09-05

2026-09-06

2026-09-06

2026-09-06

2026-09-07

2026-09-08

2026-09-08

← 대시보드 · 교훈 모음