1/22 코드 수정 및 리팩토링, 성능 테스트

AI·2026년 1월 22일

db에러

db 접속 안됨 - 참고 : https://dev-youngjun.tistory.com/260

docker exec -it mysql bash

mysql -u root -p

CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'root';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

해도 안됨

mysql> SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | mysql_native_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
2 rows in set (0.01 sec)

로 떠서 localhost도 mysql_native_password로 변경

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

그래도 안됨
localhost 대신 127.0.0.1로 수정해도 안됨

CREATE USER IF NOT EXISTS 'root'@'172.19.0.1' IDENTIFIED WITH mysql_native_password BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.19.0.1' WITH GRANT OPTION;

+------+------------+-----------------------+
| user | host       | plugin                |
+------+------------+-----------------------+
| root | %          | mysql_native_password |
| root | 172.19.0.1 | mysql_native_password |
| root | localhost  | mysql_native_password |
+------+------------+-----------------------+
3 rows in set (0.00 sec)

전용 계정 만듦

그래도 안되서 도커 컨테이너 다 지우고 다시 진행
docker system prune -a => docker compose up -d --build

이것저것 다 했는데 그런 문제가 아니라 main에 있는 yml 파일에는 로컬 pw로 되어 있었음

※ 참고 : 아이디 비번 전부 root로 설정함

속도 성능 향상

인덱스 생성

-- BillingHistory 테이블
CREATE INDEX idx_bh_month_id ON billing_history(billing_month, billing_id);

-- Line 테이블 (조인 성능 향상)
CREATE INDEX idx_line_due_id ON line(due_date_id, line_id);

멀티 쓰레드 사용

기존 속도 - 1000개에 8.3초
112300개에 11분47초(707초) => 1000개에 6.3초로 약간 더 빨라짐

쿼리문 수정

WHERE b.billing_month = :billingMonth 
	AND b.line_id IN (SELECT l.line_id FROM Line l INNER JOIN dueDate d ON l.due_date_id = d.due_date_id WHERE d.date = :targetDay)

4000건 32.78초 => 1000건 8.19초
쿼리의 중요성을 깨달음. 생각보다 시간이 너무 오래 걸림
배치에서 시간을 잡아먹는게 아니라 Reader에서 시간이 걸리기 때문

FROM BillingHistory b 
INNER JOIN Line l ON b.line_id = l.line_id 
INNER JOIN dueDate d ON l.due_date_id = d.due_date_id
WHERE b.billing_month = :billingMonth AND d.date = :targetDay
SELECT b.billing_id, b.line_id, b.amount, b.billing_month
FROM line l
INNER JOIN due_date d ON l.due_date_id = d.due_date_id
INNER JOIN billing_history b ON l.line_id = b.line_id
WHERE d.date = :targetDay AND b.billing_month = :billingMonth


납기일이 15일인 line을 먼저 필터링(Index Scan)하고, 그 결과에 해당하는 billing_history만 조인해서 가져오기

https://velog.io/@dragonsu/%EC%99%9C-100%EB%A7%8C%EA%B1%B4%EC%9D%98-INSERT-%EB%AC%B8%EC%9D%B4-1000%EA%B1%B4%EC%9D%98-%EB%B0%B0%EC%B9%98-INSERT-%EB%B3%B4%EB%8B%A4-%EC%84%B1%EB%8A%A5%EC%9D%B4-%EB%82%98%EC%81%A0%EA%B9%8C-2-BULK-INSERT-%EC%9E%98-%EC%93%B0%EA%B8%B0

0개의 댓글