티스토리 뷰
토이프로젝트 진행 중 1000만건의 더미데이터를 생성할 필요가 생겼습니다.
두 가지 아이디어가 떠올랐는데, SQL 프로시저를 사용하는 방법과 faker를 사용하는 방법이었습니다.
뭐가 더 나을지를 생각하다가, 나에게 더 익숙한 방법으로 진행하기로 했습니다.
두 방법에서 속도의 차이도 있지 않을까 싶은데 이건 나중에 테스트를 해보고 업데이트 하겠습니다.
faker 의존성을 추가해 줍니다.
dependencies {
implementation 'net.datafaker:datafaker:1.5.0'
}
파일이 저장될 위치를 지정합니다.
컴파일러 출력에서 위치를 지정할 수 있습니다.
더미데이터를 만들 코드를 작성합니다.
저는 제 토이프로젝트에 필요한 내용대로 컬럼을 작성하였습니다.
csv에서는 컬럼을 쉼표나 공백으로 구분하는데, 저는 제가 좀 더 보기 쉽게 쉼표로 구분하였습니다.
package faker.dummydata;
import net.datafaker.Faker;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class dummy {
public static void main(String[] args) {
System.out.println(" Start time: "+ new Timestamp(System.currentTimeMillis()));
// 지역을 한국어로 변경
Faker faker = new Faker(new Locale("ko-KR"));
List<Product> products = new ArrayList<>();
// 10,000,000개의 더미 데이터 생성
for(long i = 1; i <= 10000000; i++) {
// 제품 ID 생성
Long productId = i;
// 랜덤 이름 생성
String name = faker.commerce().productName();
// 랜덤 주소 생성
String location = faker.address().cityName();
// 이전 내용 참고하여 1에서 100사이의 랜덤한 숫자 부여하여 생성
String around = "주변" + faker.number().numberBetween(1, 100);
String notice = "공지" + faker.number().numberBetween(1, 100);
String base = "기본" + faker.number().numberBetween(1, 100);
// 랜덤 가격 생성 (100 단위 이하의 숫자 제외)
int price = faker.number().numberBetween(20000, 120000) / 100 * 100;
// imgUrl 고정
Long imgUrl = 1L;
// 현재 날짜 생성
Date date = new Date();
DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateToString = simpleDateFormat.format(date);
// 데이터를 products 리스트에 저장
products.add(new Product(productId, name, location, around, notice, base, price, imgUrl, dateToString));
}
String CSV_FILE = "products.csv";
// csv 파일로 만들기
// column을 ,로 구분함
// 맨 첫 row는 컬럼명이 들어가니 따로 지정해주고 \n으로 개행
try (FileWriter writer = new FileWriter(CSV_FILE)) {
writer.append("product_id");
writer.append(",");
writer.append("name");
writer.append(",");
writer.append("location");
writer.append(",");
writer.append("around");
writer.append(",");
writer.append("notice");
writer.append(",");
writer.append("base");
writer.append(",");
writer.append("price");
writer.append(",");
writer.append("imgUrl");
writer.append(",");
writer.append("date");
writer.append("\n");
for (Product product : products) {
writer.append(String.valueOf(product.getProductId()));
writer.append(",");
writer.append(product.getName());
writer.append(",");
writer.append(product.getLocation());
writer.append(",");
writer.append(product.getAround());
writer.append(",");
writer.append(product.getNotice());
writer.append(",");
writer.append(product.getBase());
writer.append(",");
writer.append(String.valueOf(product.getPrice()));
writer.append(",");
writer.append(String.valueOf(product.getImgUrl()));
writer.append(",");
writer.append(product.getDate());
writer.append("\n");
}
System.out.println("Products successfully written to CSV file: " + CSV_FILE);
} catch (IOException e) {
System.out.println(" error time: "+ new Timestamp(System.currentTimeMillis()));
e.printStackTrace();
}
System.out.println(" end time: "+ new Timestamp(System.currentTimeMillis()));
}
}
//getter
class Product {
private Long productId;
private String name;
private String location;
private String around;
private String notice;
private String base;
private int price;
private Long imgUrl;
private String date;
public Product(Long productId, String name, String location, String around, String notice, String base, int price, Long imgUrl, String date) {
this.productId = productId;
this.name = name;
this.location = location;
this.around = around;
this.notice = notice;
this.base = base;
this.price = price;
this.imgUrl = imgUrl;
this.date = date;
}
public Long getProductId() {
return productId;
}
public String getName() {
return name;
}
public String getLocation() {
return location;
}
public String getAround() {
return around;
}
public String getNotice() {
return notice;
}
public String getBase() {
return base;
}
public int getPrice() {
return price;
}
public Long getImgUrl() {
return imgUrl;
}
public String getDate() {
return date;
}
}
만약 이외에 그냥 20자 이내의 랜덤한 String을 얻고 싶다면 이 코드도 활용할 수 있습니다.
String whatEver = faker.lorem().characters(20);
'language > java' 카테고리의 다른 글
java로 chatGPT 실행시키기 (0) | 2023.03.16 |
---|---|
Junit으로 테스트코드를 작성한 과정 (0) | 2023.02.28 |
예외 처리 - 예외 계층 구조 (0) | 2023.02.03 |
예외 처리 - throw / throws (0) | 2023.02.03 |
예외 처리 - Try-Catch문의 흐름 / Finally (0) | 2023.02.01 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Redis
- jmeter토큰
- bankersRounding
- 동적크롤링
- Lock
- CheckedException
- jmeter로그인
- EC2
- jmeter테스트
- index
- 부하테스트시나리오
- CorrectnessAndTheLoopInvariant
- pessimisticlock
- jwt
- Spring
- Java
- jmeter쿠키
- jmeter부하테스트
- 프로그래머스
- jmeter세션
- Redisson
- 대규모더미데이터
- jmeter시나리오
- 토큰
- Python
- 인덱스
- hackerrank
- 스프링faker
- 자바
- 항해
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함