본문 바로가기
Java

Java) Faker를 통한 더미데이터 생성

by NH_club 2023. 8. 11.

프로젝트에 쓰일 user 데이터가 필요했다.

현재 프로젝트는 대용량 트래픽, 대용량 데이터을 처리 해보는 목적을 갖고 있다.

그에 맞게 user 데이터가 10만 건이 필요했다.

Mockaroo
더보기

더미데이터를 생성하는 웹 사이트이다.

총 170개의 타입을 지정할 수 있으며, 어떤 식으로 데이터가 생성 되는지 preview를 통해 빠르게 확인할 수 있다.

단 무료버전으로는 1000개의 행만 생성할 수 있었다. 10만 건의 데이터가 필요한 나는 다른 길을 알아봤다.

만약 생성해야 할 데이터가 1000개 이하라면 Mockaroo가 훨씬 직관적이고 편한 방법이다.

Java Faker
더보기

Java Faker는 더미데이터를 생성할 수 있는 외부 라이브러리다.

gradle에 의존성만 부여해 주면 더미데이터를 생성할 수 있었다.

Faker 공부에 할애할 시간이 없었던 터라 GPT에게 작성해달라고 부탁했고, 10만건의 데이터를 얻을 수 있었다.

package com.example.javafaker.generator;

import com.github.javafaker.Faker;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Set;

@Component
public class UserDataGenerator {

    @PostConstruct
    public void generateCsvFile() {
        Faker faker = new Faker();
        Set<String> uniqueValues = new HashSet<>();

        int numberOfUsers = 100000; // 10만건의 데이터를 생성
        String csvFile = "users.csv";

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try (FileWriter writer = new FileWriter(csvFile)) {
            // CSV 헤더 쓰기
            writer.write("created_at,id,updated_at,nickname,user_account_id,password\n");


            for (int i = 1; i <= numberOfUsers; i++) {
                String nickname;
                String userAccountId;

                // nickname 중복 및 길이 확인
                do {
                    nickname = faker.name().username().replace(".", "");
                } while (uniqueValues.contains(nickname) || nickname.length() > 16);
                uniqueValues.add(nickname);

                // userAccountId 중복 및 길이 확인
                do {
                    userAccountId = faker.name().username().replace(".", "");
                } while (uniqueValues.contains(userAccountId) || userAccountId.length() > 16);
                uniqueValues.add(userAccountId);

                // password 길이 확인
                String password;
                do {
                    password = faker.internet().password();
                } while (password.length() > 64);

                // createdAt과 updatedAt에 대한 타임스탬프 생성
                Date createdAt = new Date(System.currentTimeMillis() - faker.number().numberBetween(1, 30) * 24L * 60 * 60 * 1000);
                Date updatedAt = new Date(System.currentTimeMillis() - faker.number().numberBetween(1, 15) * 24L * 60 * 60 * 1000);

                // CSV에 줄 쓰기
                writer.write(dateFormat.format(createdAt) + "," + i + "," + dateFormat.format(updatedAt) + "," + nickname + "," + userAccountId + "," + password + "\n");
            }

            System.out.println("CSV 파일 생성 완료: " + csvFile);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드로 인해 10만건의 user 정보가 담긴 csv 파일을 얻을 수 있었고, 이 csv 파일을 postgreSQL 콘솔창으로 데이터를 넣을 수 있었다.

COPY users FROM 'C:/Users/user/Desktop/javafaker/javafaker/users.csv' WITH CSV HEADER;

아래의 쿼리로 로컬 DB에 정상적으로 데이터가 생성 되었다.

SELECT COUNT(*) FROM users;

'Java' 카테고리의 다른 글

Java) 데몬 쓰레드와 사용자 쓰레드  (0) 2023.09.18
Java) 프로세스와 쓰레드  (0) 2023.09.14
Java) 병목현상 해결 과정  (0) 2023.08.23
JMeter 변수 설정  (0) 2023.08.15
JMeter 성능 테스트  (0) 2023.08.15