[Java Spring] 테스트 데이터를 자동으로 등록하는 방법

khj·2025년 4월 4일

Java

목록 보기
5/11
post-thumbnail

개발을 진행할 때, 초기 데이터가 자동으로 세팅된다면 테스트나 화면 확인이 훨씬 수월해진다.
특히 로그인 계정이나 상품 정보처럼 반복적으로 입력해야 하는 테스트 데이터를 자동으로 등록해두면,
매번 SQL을 수동으로 넣거나 컨트롤러를 호출하지 않아도 되어 개발 효율이 높아진다.

✨ 목표

  • resources/json/test-data.json 파일에 테스트 데이터를 정의한다.
  • Spring Boot 애플리케이션이 시작될 때 ApplicationRunner가 실행된다.
  • 등록된 Member나 Product가 없을 경우, 테스트 데이터를 자동으로 등록한다.

✅ 핵심 클래스: TestDataInitializer

@Component
public class TestDataInitializer implements ApplicationRunner {
    ...
}
  • @Component: Spring이 자동으로 빈으로 등록해준다.
  • ApplicationRunner: 스프링 애플리케이션이 구동되고 나서 실행되는 인터페이스이다.
    • ApplicationRunner는 Spring Boot에서 제공하는 인터페이스로, 애플리케이션이 실행된 후 자동으로 실행되는 메서드를 정의할 수 있다.
  • CommandLineRunner와 비슷하지만, 인자를 ApplicationArguments로 받는다는 차이가 있다.

📦 전체 코드 설명

@Override
@Transactional
public void run(ApplicationArguments args) throws Exception {
    if (memberService.findAll().isEmpty() && productService.getAllProduct().isEmpty()) {
        loadTestData();
    }
}
  • 애플리케이션이 시작될 때 실행되는 run() 메서드이다.
  • 기존에 DB에 등록된 Member나 Product가 하나도 없을 경우에만 초기 데이터를 세팅한다.
  • @Transactional: 서비스 계층을 거치므로, 전체 로직이 트랜잭션으로 묶인다.

📂 JSON 파일에서 데이터 읽기

ClassPathResource resource = new ClassPathResource("json/test-data.json");
InputStream inputStream = resource.getInputStream();
JsonNode jsonNode = objectMapper.readTree(inputStream);
  • ClassPathResource: resources 폴더 안의 파일을 읽을 때 사용한다.
  • ObjectMapper: Jackson 라이브러리를 통해 JSON 데이터를 파싱한다.

📂 Json 데이터 구조

{
  "members": [
    {
      "email": "test@example.com",
      "password": "1234",
      "username": "테스트유저",
      "address": "테스트주소",
      "role": "MEMBER"
    }
  ],
  "products": [
    {
      "name": "테스트 상품",
      "description": "테스트용 설명",
      "price": 10000,
      "quantity": 10
    }
  ]
}

👤 Member 등록 처리

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);
}
  • JSON에서 가져온 정보를 form에 매핑하고, signUp을 호출하여 등록한다.
  • Role.valueOf()를 통해 문자열을 Enum으로 변환하여 저장한다.

📦 Product 등록 처리

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);
}
  • 마찬가지로 상품 정보도 form으로 매핑 후 등록 처리한다.
  • 가격은 decimalValue(), 수량은 longValue()를 통해 정확한 타입으로 변환한다.
profile
Spring, Django 개발 블로그

0개의 댓글