refactor(cmm/fms): 파일 처리(Write - CUD) 시 N+1 문제 해결을 위한 Bulk 연산 적용 #110
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR 본문 (Body)
수정 사유 (Reason for modification)
기존
FileManageDAO의 다중 파일 처리 메서드(insertFileInfs,updateFileInfs,deleteFileInfs)들은 모두 내부적으로 반복문(Loop)을 사용해 파일 건수만큼 개별적인 CUD 쿼리를 호출했습니다. 이로 인해 처리할 파일이 많아질수록 N+1 쿼리 문제가 발생하여, 불필요한 DB 커넥션 및 오버헤드로 성능이 심각하게 저하되었습니다.특히, 기존
updateFileInfs는 실제 '수정' 기능이 아닌 '추가' 기능으로 동작하여 기존 데이터를 수정할 수 없는 기능적 한계도 있었습니다.이번 개선은 MyBatis의
<foreach>를 활용한 Bulk 연산을 도입하여, 단 한 번의 쿼리로 여러 데이터를 동시에 처리함으로써 위 문제들을 모두 해결했습니다.수정된 소스 내용 (Modified source)
1.
FileManageDAO.javainsertFileInfs,updateFileInfs,deleteFileInfs메서드의 내부 로직을 반복문 방식에서 Bulk 쿼리를 호출하는 방식으로 변경했습니다.List<?> fileList)는 그대로 유지하여 기존 서비스와의 호환성을 보장했습니다.2. Mapper XMLs (
EgovFile_SQL_*.xml)ON DUPLICATE KEY UPDATE), **Bulk Delete(WHERE ... IN (...))**를 위한 쿼리 3개를 새로 추가했습니다.3.
FileManageDAOBulkPerformanceTest.javaInsert,Update,Delete각 시나리오별로 데이터 건수를 늘려가며 실행 시간을 측정하여 개선 효과를 직관적으로 보여줍니다.4. 테스트 환경 구성
pom.xml에p6spy의존성을 추가하고,src/test/resources경로에application.properties,schema.sql등 테스트 실행에 필요한 환경 설정 파일들을 추가했습니다.JUnit 테스트 (JUnit tests)
성능 테스트 결과 📈
아래는
FileManageDAOBulkPerformanceTest실행을 통해 측정한 성능 비교 결과입니다. 모든 CUD(등록, 수정, 삭제) 작업에서 데이터가 증가할수록 개선 효과가 극명하게 나타났으며, 10만 건 처리 시 수정 작업은 약 19.5배, 삭제는 약 18.8배의 압도적인 성능 향상을 확인했습니다.[성능 비교] 다중 파일 등록 (Insert)
[성능 비교] 다중 파일 수정 (Update)
[성능 비교] 다중 파일 삭제 (Delete)
테스트 환경 정보 (Test Environment Details)
리뷰어가 결과를 재현할 수 있도록 테스트 환경 정보를 공유합니다.
로컬 테스트 DB 환경 (Docker)
성능 테스트는 Docker를 사용하여 임시 MySQL 8.0 데이터베이스 환경을 구축하여 진행했습니다.
테스트 스키마 (
schema.sql)테스트 설정 (
application.properties)테스트 브라우저 (Test Browser)
이번 수정은 백엔드 로직 개선에 해당하므로 브라우저 테스트는 진행하지 않았습니다.
테스트 스크린샷 또는 캡처 영상 (Test screenshots or captured video)