인덱스와 조회 성능 테스트라면,
100 만건의 Post 글을 어떻게 만들어 놓을까?
가장 간편하게 시작하자 싶었지만 최소 작성자인 User 필요
Post random data 생성하기
JPA auto ddl 로 먼저 구현 후 테스트 데이터 생성 하려 하니 문제가 많았다.
별도의 프로젝트로 JDBC 이용한 테스트 데이터를 생성해서 저장하게 했다.
(DataSource 설정을 여러개 두자니, 그렇게 쓸거 같진 않고, 모듈화 하자니, 애플리케이션 테스트도 아니고, batch 랑 같이 쓰기도 어색하고 .... 그렇지만 결국 나중에 그냥 추가해볼 수도 있을 거 같다. ㅎㅎ)
- JPA 에서는 @MappedSuperclass 로 BaseEntity 로 인해 엔티티 타임 기준 객체생성만 가능
- AOP 동작이 테스트 케이스 위한 엔티티 생성시 X, 특히 날짜 등 임의 데이터가 안된다.
- bulk insert는 MySQL의 식별자 전략 때문에 미지원
- 임의 데이터 생성해서 csv 파일 제공 사이트
- 무료로 만 건 정도, csv 파일 내 날짜 등 생성 타입하고 달라짐
- workbench import 기능이 매우 단순해서 쉬운 만큼 정정은 클릭으로는 X
- Oracle 토드 때 다양한 방식이 있어서 WorkBench도 있을까 싶지만, 쓸 일이 없었던 만큼 stop, 다른 방식으로 해야 그나마 끝날 거 같다.
- JDBC
- JPA 엔티티와 별개의 객체 타입 생성해서 임의 데이터를 보다 자유롭게 넣을 수 있다.
- JPA로 auto ddl로 생성해 놓은 테이블은 문제가 생길 수 있다.
- bulk insert 시 외래키 제약 조건으로 문제 발생
- 외래키 없는 테이블로 생성 후 bulk 데이터 넣고, 외래키 생성😅
SET foreign_key_checks=0
로 일시적 체크 해제
Instancio
: 랜덤하게 타입별 값 넣어줄 라이브러리
- 메서드 종류가 적어 간편하게 사용하기 쉬움, 자바 만으로 데이터 지정 쉬움
- JDBC의 BeanPropertySqlParameterSource 는 타입, 컬럼명 등 문제 생겨서 취소 → MapSqlParameterSource
- Insert SQL 문에
:
빼먹는 오타로 백만건에 컬럼명이 데이터로 들어갔었다. 코드 개선하기 😑
Data 구성
Post 작성글 작성자, 날짜 기준 목록 조회
인덱스 추가 한다면
작성자 분포도 , 날짜 기간 다양
FK 사용자는 10명으로 적게 생성
- 작성자 기준 검색시 unique 값 개수 적은 것과 늘어난 경우 비교하기 위해
- 생각보다 member_id 가 굉장히 균일하게 들어갔다.
- 나중에 늘어난 사용자 추가시 사용자 많고, post 수는 적게 하면 빈도 차이는 날 것이다.
- 컬럼명 user_id 로 바꿔야 겠다. ㅎㅎ
- updated_at 을 created_at 이후로 하려고 범위를 시작기간을 뒤로 했는데 미래 날짜가 많이 나왔다 ㅎㅎ 테스트상 updated_at 쓸 일 없으니 skip
테스트 생성 시간: 7.1540994
DB bulk insert 시간: 45.8880974
p.s. 역시 이번에도 쉽겠지, 간단하겠지... 싶었지만, 삽질 많았다. 이 글은 .. 사라질지도 ㅎㅎㅎㅎ