1. 개요
이 예제에서는 다양한 목적으로 모의 데이터를 생성하는 문제에 접근하는 방법을 배웁니다. Datafaker 를 사용하는 방법을 배우고 몇 가지 예를 검토합니다.
2. 연혁
Datafaker는 Javafaker 용 최신 포크입니다 . Java 8로 이전되고 개선되어 라이브러리의 성능 이 향상 되었습니다. 그러나 현재 API는 거의 동일하게 유지되었습니다. 따라서 이전에 사용한 Javafaker는 Datafaker로 마이그레이션하는 데 문제가 없습니다. Java Faker 기사 에 제공된 모든 예제 는 Datafaker 1.6.0 버전에서 작동합니다 .
현재 Datafaker API는 Javafaker와 호환됩니다. 따라서 이 기사에서는 차이점과 개선 사항에만 집중할 것입니다.
먼저 프로젝트에 Datafaker Maven 의존성을 추가해 보겠습니다.
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>1.6.0</version>
</dependency>
3. 제공자
Datafaker의 가장 중요한 부분 중 하나는 제공자 입니다. 이것은 데이터 생성을 보다 편리하게 해주는 특수 클래스 세트입니다. 이러한 클래스는 올바른 데이터가 있는 yml 파일 에 의해 백업된다는 점에 유의하는 것이 중요합니다 . Faker 메서드 및 표현식은 이러한 파일을 직접 또는 간접적으로 사용하여 데이터를 생성합니다. 다음 섹션에서는 이러한 메서드와 지시문의 작업에 더 익숙해집니다.
4. 데이터 생성을 위한 추가 패턴
Datafaker와 Javafaker는 제공된 패턴을 기반으로 값 생성을 지원합니다. Datafaker는 templatify, exemplify, options, date, csv 및 json 지시문 과 함께 추가 기능을 도입 했습니다.
4.1. 템플릿화
templatify 지시문은 여러 인수를 취합니다 . 첫 번째는 기본 S 스트링 입니다. 두 번째는 주어진 문자열에서 대체될 문자입니다. 나머지는 무작위로 선택되는 교체 옵션입니다.
public class Templatify {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("Expression: " + getExpression());
System.out.println("Expression with a placeholder: " + getExpressionWithPlaceholder());
}
static String getExpression() {
return faker.expression("#{templatify 'test','t','j','r'}");
}
static String getExpressionWithPlaceholder() {
return faker.expression("#{templatify '#ight', '#', 'f', 'l', 'm', 'n'}");
}
}
자리 표시자 없이 기본 문자열을 사용할 수 있지만 지정된 문자열의 모든 항목을 대체하므로 바람직하지 않은 결과가 생성될 수 있습니다. 기본 문자열의 특정 위치에만 나타나는 문자인 자리 표시자를 도입할 수 있습니다. 위의 경우 결과는 다음과 같습니다.
Expression: resj
Expression with a placeholder: night
랜덤의 캐릭터를 배치할 수 있는 장소가 여러 개 있는 경우 매번 무작위로 지정됩니다. 교체를 위해 문자열을 사용하는 것이 가능하지만 문서에서는 이를 명시적으로 언급하지 않습니다. 따라서 주의해서 사용하는 것이 좋습니다.
4.2. 예시하다
이 지시문은 제공된 예제를 기반으로 랜덤의 값을 생성합니다. 소문자 또는 대문자를 해당 값으로 바꿉니다. 숫자도 마찬가지입니다. 특수 문자는 그대로 유지되어 형식이 지정된 문자열을 만드는 데 도움이 됩니다.
public class Examplify {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("Expression: " + getExpression());
System.out.println("Number expression: " + getNumberExpression());
}
static String getExpression() {
return faker.expression("#{examplify 'Cat in the Hat'}");
}
static String getNumberExpression() {
return faker.expression("#{examplify '123-123-123'}");
}
}
출력의 예:
Expression: Lvo lw ero Qkd
Number expression: 707-657-434
4.3. 정규화
이것은 형식화된 S 문자열 값을 생성하는 보다 유연한 방법입니다. regexify 지시문을 표현식으로 사용하거나 Faker 객체 에서 직접 regexify 메소드를 호출 할 수 있습니다 .
public class Regexify {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("Expression: " + getExpression());
System.out.println("Regexify with a method: " + getMethodExpression());
}
static String getExpression() {
return faker.expression("#{regexify '(hello|bye|hey)'}");
}
static String getMethodExpression() {
return faker.regexify("[A-D]{4,10}");
}
}
가능한 출력:
Expression: bye
Regexify with a method: DCCC
4.4. 옵션
options.option 지시문을 사용하면 제공된 List에서 임의로 옵션을 선택할 수 있습니다. 이 기능은 regexify 를 통해 달성할 수 있지만 일반적인 경우이므로 별도의 지시문이 의미가 있습니다.
public class Option {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("First expression: " + getFirstExpression());
System.out.println("Second expression: " + getSecondExpression());
System.out.println("Third expression: " + getThirdExpression());
}
static String getFirstExpression() {
return faker.expression("#{options.option 'Hi','Hello','Hey'}");
}
static String getSecondExpression() {
return faker.expression("#{options.option '1','2','3','4','*'}");
}
static String getThirdExpression() {
return faker.expression("#{regexify '(Hi|Hello|Hey)'}");
}
}
위 코드의 출력:
First expression: Hey
Second expression: 4
Third expression: Hello
옵션 수가 너무 많으면 무작위 값에 대한 사용자 지정 공급자를 만드는 것이 좋습니다.
4.5. CSV
이 지시문은 이름을 기반으로 CSV 형식의 데이터를 생성합니다. 그러나 이 지시문을 사용하는 데 혼동이 있을 수 있습니다. 내부적으로는 서명이 완전히 다른 두 개의 오버로드된 메서드가 이 지시문을 처리하기 때문입니다.
public class Csv {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("First expression:\n" + getFirstExpression());
System.out.println("Second expression:\n" + getSecondExpression());
}
static String getFirstExpression() {
String firstExpressionString
= "#{csv '4','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}";
return faker.expression(firstExpressionString);
}
static String getSecondExpression() {
String secondExpressionString
= "#{csv ',','\"','true','4','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}";
return faker.expression(secondExpressionString);
}
}
위의 지시문은 #{Name.first_name} 및 #{Name.last_name } 표현식을 사용하고 있습니다. 다음 섹션에서는 이러한 표현의 사용법을 설명합니다.
표현식에서 csv 지시문 뒤의 값 은 언급된 메서드의 매개변수에 매핑됩니다. 이러한 방법에 대한 설명서는 추가 정보를 제공합니다. 그러나 때때로 이러한 지시문을 구문 분석하는 데 문제가 발생할 수 있으며 이 경우 메서드를 직접 사용하는 것이 좋습니다. 위의 코드는 다음과 같은 출력을 생성합니다.
First expression:
"name_column","last_name_column"
"Riley","Spinka"
"Lindsay","O'Conner"
"Sid","Rogahn"
"Prince","Wiegand"
Second expression:
"name_column","last_name_column"
"Jen","Schinner"
"Valeria","Walter"
"Mikki","Effertz"
"Deon","Bergnaum"
이것은 프로그래밍 방식으로 응용 프로그램 외부에서 사용할 모의 데이터를 생성하는 좋은 방법입니다.
4.6. JSON
또 다른 인기 있고 자주 사용되는 형식은 JSON입니다. Datafaker를 사용하면 표현식을 사용하여 JSON 형식으로 데이터를 생성할 수 있습니다.
public class Json {
private static final Faker faker = new Faker();
public static void main(String[] args) {
System.out.println(getExpression());
}
static String getExpression() {
return faker.expression(
"#{json 'person'," + "'#{json ''first_name'',''#{Name.first_name}'',''last_name'',''#{Name.last_name}''}'," +
"'address'," + "'#{json ''country'',''#{Address.country}'',''city'',''#{Address.city}''}'}");
}
}
위의 코드는 다음 출력을 생성합니다.
{"person": {"first_name": "Dorian", "last_name": "Simonis"}, "address": {"country": "Cameroon", "city": "South Ernestine"}}
4.7. 메소드 호출
사실, 모든 표현식은 메소드 이름과 매개변수가 문자열로 전달된 메소드 호출일 뿐입니다. 따라서 위의 모든 지시문은 동일한 이름을 가진 메서드를 미러링합니다. 그러나 때로는 일반 텍스트를 사용하여 모의 데이터를 만드는 것이 더 편리합니다.
public class MethodInvocation {
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("Name from a method: " + getNameFromMethod());
System.out.println("Name from an expression: " + getNameFromExpression());
}
static String getNameFromMethod() {
return faker.name().firstName();
}
static String getNameFromExpression() {
return faker.expression("#{Name.first_Name}");
}
}
이제 csv 및 json 지시문이 있는 표현식이 내부에서 메서드 호출을 사용 했음 이 분명합니다 . 이런 식으로 Faker 객체 에서 데이터 생성을 위한 모든 메서드를 호출할 수 있습니다 . 메서드 이름은 대소문자를 구분하지 않고 형식의 변형을 허용하지만 사용된 버전의 설명서를 참조하여 확인하는 것이 좋습니다.
또한 표현식을 사용하여 메소드에 매개변수를 전달할 수 있습니다. 우리는 이것을 regexify 및 templatify 지시문 의 형식에서 부분적으로 보았습니다 . 경우에 따라 다소 번거롭고 오류가 발생하기 쉬울 수 있지만 때로는 이것이 Faker와 상호 작용하는 가장 편리한 방법입니다.
public class MethodInvocationWithParams {
public static int MIN = 1;
public static int MAX = 10;
public static String UNIT = "SECONDS";
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println("Duration from the method :" + getDurationFromMethod());
System.out.println("Duration from the expression: " + getDurationFromExpression());
}
static Duration getDurationFromMethod() {
return faker.date().duration(MIN, MAX, UNIT);
}
static String getDurationFromExpression() {
return faker.expression("#{date.duration '1', '10', 'SECONDS'}");
}
}
표현식의 단점 중 하나는 String 객체를 반환한다는 것입니다. 결과적으로 이것은 반환된 객체에 대해 수행할 수 있는 작업의 수를 줄입니다. 위의 코드는 다음 출력을 생성합니다.
Duration from the method: PT6S
Duration from the expression: PT4S
5. 컬렉션
컬렉션을 사용하면 모의 데이터가 있는 List을 만들 수 있습니다. 이 경우 요소의 유형이 다를 수 있습니다. 컬렉션은 컬렉션에 있는 모든 클래스의 부모인 가장 구체적인 유형으로 매개변수화됩니다. 약간의 괴짜를 가지고 "Star Wars"와 "Start Trek"의 캐릭터 List을 생성해 보겠습니다.
public class Collection {
public static int MIN = 1;
public static int MAX = 100;
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println(getFictionalCharacters());
}
static List<String> getFictionalCharacters() {
return faker.collection(
() -> faker.starWars().character(),
() -> faker.starTrek().character())
.len(MIN, MAX)
.generate();
}
}
그 결과 다음 List을 얻었습니다.
[Luke Skywalker, Wesley Crusher, Jean-Luc Picard, Greedo, Hikaru Sulu, William T. Riker]
컬렉션의 두 공급자 모두 String 유형 값을 반환하기 때문에 결과 List은 String으로 매개변수화됩니다 . 서로 다른 유형의 데이터를 혼합하는 상황을 확인해 보겠습니다.
public class MixedCollection {
public static int MIN = 1;
public static int MAX = 20;
private static Faker faker = new Faker();
public static void main(String[] args) {
System.out.println(getMixedCollection());
}
static List<? extends Serializable> getMixedCollection() {
return faker.collection(
() -> faker.date().birthday(),
() -> faker.name().fullName())
.len(MIN, MAX)
.generate();
}
}
이 경우 String 및 Timestamp 에 대한 가장 구체적인 클래스 는 Serializable입니다. 출력은 다음과 같습니다.
[1964-11-09 15:16:43.0, Devora Stamm DVM, 1980-01-11 15:18:00.0, 1989-04-28 05:13:54.0,
2004-09-06 17:11:49.0, Irving Turcotte, Sherita Durgan I, 2004-03-08 00:45:57.0, 1979-08-25 22:48:50.0,
Manda Hane, Latanya Hegmann, 1991-05-29 12:07:23.0, 1989-06-26 12:40:44.0, Kevin Quigley]
6. 결론
Datafaker는 Javafaker의 새롭고 향상된 버전입니다. 이 문서에서는 데이터를 생성하는 새로운 방법을 제공하는 Datafaker 1.6.0에 도입된 새로운 기능에 대해 설명했습니다. 그러나 이 라이브러리에 대해 배울 것이 더 많으며 Datafaker의 기능 및 특징에 대한 자세한 정보를 얻으려면 공식 문서 및 GitHub 리포지토리 를 참조하는 것이 좋습니다.
항상 그렇듯이 기사에 제공된 코드는 GitHub에서 사용할 수 있습니다 .