개발을 진행할 때, 초기 데이터가 자동으로 세팅된다면 테스트나 화면 확인이 훨씬 수월해진다.
특히 로그인 계정이나 상품 정보처럼 반복적으로 입력해야 하는 테스트 데이터를 자동으로 등록해두면,
매번 SQL을 수동으로 넣거나 컨트롤러를 호출하지 않아도 되어 개발 효율이 높아진다.
@Component
public class TestDataInitializer implements ApplicationRunner {
...
}
@Override
@Transactional
public void run(ApplicationArguments args) throws Exception {
if (memberService.findAll().isEmpty() && productService.getAllProduct().isEmpty()) {
loadTestData();
}
}
ClassPathResource resource = new ClassPathResource("json/test-data.json");
InputStream inputStream = resource.getInputStream();
JsonNode jsonNode = objectMapper.readTree(inputStream);
{
"members": [
{
"email": "test@example.com",
"password": "1234",
"username": "테스트유저",
"address": "테스트주소",
"role": "MEMBER"
}
],
"products": [
{
"name": "테스트 상품",
"description": "테스트용 설명",
"price": 10000,
"quantity": 10
}
]
}
for (JsonNode node : jsonNode.get("members")) {
MemberSignUpForm form = new MemberSignUpForm();
form.setEmail(node.get("email").asText());
form.setPassword(node.get("password").asText());
form.setUsername(node.get("username").asText());
form.setAddress(node.get("address").asText());
String roleStr = node.get("role").asText();
form.setRole(Role.valueOf(roleStr));
memberService.signUp(form);
}
for (JsonNode node : jsonNode.get("products")) {
ProductRegisterForm form = new ProductRegisterForm();
form.setName(node.get("name").asText());
form.setDescription(node.get("description").asText());
form.setPrice(node.get("price").decimalValue());
form.setQuantity(node.get("quantity").longValue());
productService.registerProduct(form);
}