ABOUT ME

Today
Yesterday
Total
  • 더미데이터 생성
    BE/기타 2024. 11. 15. 21:50

     

     

    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

    https://mockaroo.com

     

    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 = ','
Designed by Tistory.