-
1. SQL 문을 활용한 대량 더미 데이터 생성
1-1. PostgreSQL 예시
- generate_series, random(), uuid_generate_v4() 함수 활용
- 랜덤 데이터 생성과 날짜 처리에 강력한 기능 제공
-- 1000명의 사용자 데이터를 생성 INSERT INTO p_user (id, username, email, password, created_at) SELECT uuid_generate_v4(), -- 랜덤 UUID 'user_' || generate_series(1, 1000), -- user_1, user_2, ... 'user_' || generate_series(1, 1000) || '@example.com', -- 이메일 'password123', NOW() - (random() * interval '365 days') -- 과거 1년 내 생성일 FROM generate_series(1, 1000); -- 1000개의 리뷰 데이터를 생성 INSERT INTO p_review (id, review_content, review_rating, user_id, created_at) SELECT uuid_generate_v4(), -- 랜덤 UUID 'Review #' || generate_series(1, 1000), -- 리뷰 내용 floor(random() * 5 + 1)::smallint, -- 1~5점 랜덤 (SELECT id FROM p_user OFFSET floor(random() * 1000) LIMIT 1), -- 랜덤 사용자 ID NOW() - (random() * interval '30 days') -- 과거 한 달 내 생성일 FROM generate_series(1, 1000);
1-2. SQL 스크립트 예시 - PostgreSQL
DO $$ DECLARE user_count INTEGER := 1000; review_count INTEGER := 1000; i INTEGER; BEGIN -- 사용자 데이터 생성 FOR i IN 1..user_count LOOP INSERT INTO p_user (id, username, email, password, created_at) VALUES ( uuid_generate_v4(), 'user_' || i, 'user_' || i || '@example.com', 'password123', NOW() - (random() * interval '365 days') ); END LOOP; -- 리뷰 데이터 생성 FOR i IN 1..review_count LOOP INSERT INTO p_review (id, review_content, review_rating, user_id, created_at) VALUES ( uuid_generate_v4(), 'Review #' || i, floor(random() * 5 + 1)::smallint, (SELECT id FROM p_user OFFSET floor(random() * user_count) LIMIT 1), NOW() - (random() * interval '30 days') ); END LOOP; END $$;
2. Spring Boot를 활용한 더미 데이터 생성
2.1 @PostConstruct 활용
- 특징: 주로 @Service나 @Component 클래스에서 작성, 애플리케이션 실행 시 한 번만 실행되는 초기화 코드
- 장점: 코드 내에서 동적으로 데이터를 생성 가능하며 설정이 간단
- 제약: 트랜잭션이 적용되지 않고 애플리케이션 시작 시간이 지연될 수 있음
@Component @RequiredArgsConstructor public class DummyDataInitializer { private final UserRepository userRepository; private final ReviewRepository reviewRepository; @PostConstruct public void init() { User user = new User(UUID.randomUUID(), "user1", "user1@example.com", "password123"); userRepository.save(user); Review review = new Review("Great service!", (short) 5, user); reviewRepository.save(review); } }
2.2 CommandLineRunner 활용
- 특징: 애플리케이션 시작 시 실행되는 run 메서드에서 초기화 작업
- 장점: 특정 로직을 분리하여 구성 가능하며 초기화 작업이 명확, 트랜잭션 적용 가능
- 단점: 애플리케이션 전체를 실행해야 데이터가 삽입
@Component @RequiredArgsConstructor public class DummyDataRunner implements CommandLineRunner { private final UserRepository userRepository; @Override public void run(String... args) { User user = new User(UUID.randomUUID(), "user1", "user1@example.com", "password123"); userRepository.save(user); } }
2.3 @EventListener(ApplicationReadyEvent.class) 활용
- 특징: Spring 컨텍스트 초기화 완료 후 실행되므로 트랜잭션 사용 가능
- 장점: 완벽히 초기화된 상태에서 실행됨
- 단점: 전체 애플리케이션이 실행된 이후 작동하므로 테스트 자동화에는 적합하지 않음
@Component @RequiredArgsConstructor public class DummyDataInitializer { private final UserRepository userRepository; @EventListener(ApplicationReadyEvent.class) @Transactional public void init() { User user = new User(UUID.randomUUID(), "user1", "user1@example.com", "password123"); userRepository.save(user); } }
3. 외부 라이브러리 활용
3.1 Faker 라이브러리
- 특징: 다양한 동적 데이터를 랜덤으로 생성할 수 있는 Java 라이브러리
- 장점: 이름, 이메일, 주소 등 다양한 데이터를 실제 데이터와 유사하게 생성 가능
- 단점: 외부 라이브러리에 의존하며 랜덤성으로 인해 특정 요구 조건에 맞는 데이터 생성이 어려울 수 있음
https://www.datafaker.net/documentation/getting-started/
Getting started - Datafaker
www.datafaker.net
@Component @RequiredArgsConstructor public class DummyDataGenerator { private final UserRepository userRepository; private final Faker faker = new Faker(); @EventListener(ApplicationReadyEvent.class) public void init() { for (int i = 0; i < 1000; i++) { User user = new User(UUID.randomUUID(), faker.name().username(), faker.internet().emailAddress(), "password123"); userRepository.save(user); } } }
Gradle 의존성 추가:
dependencies { implementation 'net.datafaker:datafaker:2.4.2' }
4. 데이터베이스 도구 및 플랫폼 활용
4-1. Mockaroo
Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel
Mock your back-end API and start coding your UI today. It's hard to put together a meaningful UI prototype without making real requests to an API. By making real requests, you'll uncover problems with application flow, timing, and API design early, improvi
mockaroo.com
- 특징: 웹 기반의 더미 데이터 생성 도구
- 사용법: Mockaroo에서 데이터 구조 정의 -> SQL 스크립트로 다운로드 -> 데이터베이스에 실행
- 단점: 한 번에 만들 수 있는 데이터가 1000개로 한정(이후 유료), 여러 테이블 간의 관계를 직접적으로 나타낼 수 없다보니 정확한 데이터를 생성하는데 어려움이 있음
4-2. pg_bulkload (PostgreSQL)
- 특징: PostgreSQL의 대량 데이터 입력을 빠르게 처리.
- 사용법: 데이터를 CSV 파일로 준비한 뒤, pg_bulkload 명령어로 대량 입력.
csv 파일 예시
id,username,email,password,created_at 1,user_1,user1@example.com,password123,2024-11-01 2,user_2,user2@example.com,password123,2024-11-02
pg_bulkload 설정 파일 작성: bulkload.conf 파일 생성
INPUT = '/path/to/your/file.csv' OUTPUT = 'p_user' DELIMITER = ','
'BE > 기타' 카테고리의 다른 글
PostgreSQL 설치 (MacOS) / DB 및 유저 생성 + 인텔리제이 연결 (0) 2024.11.07