Easy Random
Spring에서 제공하는 Easy Random라는 라이브러리를 어떻게 사용하는지 알아보도록 하겠습니다.
이 라이브러리는 테스트 데이터를 생성하거나 랜덤한 값을 생성할 때 사용합니다
Easy Random이란?
Easy Random은 Java 객체를 랜덤하게 생성하는 라이브러리입니다.
단순히 랜덤한 수나 문자열을 생성하는 것이 아니라, 우리가 정의한 클래스 타입의 객체를 랜덤하게 생성하는 것이 특징입니다.
따라서 테스트 데이터를 생성하거나 모의 데이터를 만들 때 특히 유용하게 사용됩니다.
시드(Seed)에 대하여
Easy Random은 시드값을 사용하여 랜덤 값을 생성합니다. 시드값은 랜덤 값 생성의 기준점이라고 할 수 있습니다.
동일한 시드값을 가지고 랜덤 값을 생성하면 항상 동일한 결과가 나옵니다.
시드값을 통해 일정한 패턴의 랜덤값을 생성할 수 있기 때문에, 테스트 시나리오를 재현하거나 일관된 테스트 환경을 구성하는데 사용될 수 있습니다.
Easy Random에서는 seed(long seed)
메서드를 통해 시드값을 지정할 수 있습니다.
EasyRandomParameters parameters = new EasyRandomParameters()
.seed(123L);
EasyRandom easyRandom = new EasyRandom(parameters);
이렇게 하면 easyRandom
객체를 사용하여 생성하는 모든 랜덤 값들은 항상 동일한 패턴을 가지게 됩니다.
객체 생성 타이밍
Easy Random은 nextObject(Class<T> type)
메서드를 호출하는 시점에 지정한 클래스 타입의 객체를 생성합니다.
Member member = easyRandom.nextObject(Member.class);
위 코드는 Member
클래스 타입의 객체를 생성하는 코드입니다. 이 코드가 실행될 때 easyRandom
은 Member
클래스의 랜덤한 객체를 생성하게 됩니다.
객체 생성 시점의 제어는 테스트 코드를 작성하거나 랜덤값을 필요로 하는 다양한 상황에서 유용하게 사용될 수 있습니다.
예를 들어, 서로 다른 테스트 케이스에서 같은 패턴의 랜덤값을 사용하려면 동일한 시드값을 사용하고, 각 테스트 케이스에서 nextObject()
메서드를 호출하여 객체를 생성하면 됩니다.
Easy Random의 사용 방법
다음 코드는 Member 객체와 MemberDto 객체를 랜덤하게 생성하는 예제입니다.
public class MemberFixtureFactory {
public static Member create() {
var parameter = new EasyRandomParameters()
.excludeField(named("id"))
.stringLengthRange(1, 10)
.randomize(Long.class, new LongRangeRandomizer(1L, 100L));
return new EasyRandom(parameter).nextObject(Member.class);
}
public static MemberDto createDto() {
var parameter = new EasyRandomParameters()
.stringLengthRange(1, 10)
.randomize(Long.class, new LongRangeRandomizer(1L, 100L));
return new MemberDto(
new LongRangeRandomizer(1L, 100L).getRandomValue(),
new StringRandomizer(10).getRandomValue(),
new StringRandomizer(10).getRandomValue(),
new LocalDateRandomizer().getRandomValue()
);
}
}
이 코드에서는 EasyRandomParameters
를 사용하여 랜덤 생성 규칙을 정의하고 있습니다.
excludeField
메서드를 사용하여 id 필드를 제외하고, stringLengthRange
메서드를 사용하여 생성될 문자열의 길이 범위를 지정하고 있습니다.
randomize
메서드는 특정 타입의 랜덤 값을 생성하는 방법을 지정합니다.
마지막으로 new EasyRandom(parameter).nextObject(Member.class)
를 통해 위에서 정의한 규칙에 따라 Member 객체를 랜덤하게 생성하고 있습니다.
아래는 위에서 생성한 코드를 가져다 만든 테스트 코드입니다
@SpringBootTest // 스프링 부트 테스트 환경 설정 어노테이션
public class PostBulkInsertTest {
@Autowired // 스프링의 의존성 주입 어노테이션
private PostRepository postRepository;
@Test // 테스트 메서드를 지정하는 어노테이션
public void bulkInsert() {
// EasyRandom 객체를 생성, 시작 시간과 끝 시간을 주어 범위 내의 랜덤 데이터를 생성하도록 설정
var easyRandom = PostFixtureFactory.get(
3L,
LocalDate.of(1970, 1, 1),
LocalDate.of(2022, 2, 1)
);
var stopWatch = new StopWatch(); // 시간 측정을 위한 StopWatch 객체 생성
stopWatch.start(); // 시간 측정 시작
int _1만 = 10000;
// 0부터 _1만(10000) 까지 범위의 정수 스트림을 생성,
// 각 정수에 대해 Post 클래스의 객체를 랜덤하게 생성하여 List에 담는다.
var posts = IntStream.range(0, _1만 * 1)
.parallel()
.mapToObj(i -> easyRandom.nextObject(Post.class))
.toList();
stopWatch.stop(); // 시간 측정 종료
// 객체 생성에 걸린 시간을 출력
System.out.println("객체 생성 시간 : " + stopWatch.getTotalTimeSeconds());
var queryStopWatch = new StopWatch(); // DB 쿼리에 걸리는 시간 측정을 위한 StopWatch 객체 생성
queryStopWatch.start(); // 시간 측정 시작
postRepository.bulkInsert(posts); // bulk insert 수행
queryStopWatch.stop(); // 시간 측정 종료
// DB 인서트에 걸린 시간을 출력
System.out.println("DB 인서트 시간 : " + queryStopWatch.getTotalTimeSeconds());
}
}
주의할 점
그러나 Easy Random는 무작위로 객체를 생성하기 때문에, 실제 비즈니스 로직에서는 사용하지 않는 것이 좋습니다.
테스트 데이터를 생성하거나 샘플 데이터를 만드는 등의 목적으로만 사용해야 합니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
Spring의 @RequestMapping (0) | 2023.07.05 |
---|---|
Spring Security (0) | 2023.07.04 |
JDBC (0) | 2023.06.02 |
데이터 변환 with Spring (0) | 2023.05.27 |
데이터 검증 with Spring (0) | 2023.05.27 |