강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của dbdb11142615
dbdb11142615

câu hỏi đã được viết

Trong thực tế! Tìm hiểu về TDD thông qua phát triển API đặt hàng sản phẩm Spring Boot

Chuyển sang thử nghiệm API

DatabaseCleanup 코드입니당 필요한 분들 쓰세요

Viết

·

115

0

 package com.clarity.productorderservice;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;
import javax.persistence.metamodel.EntityType;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.base.CaseFormat;

@Component
public class DatabaseCleanup implements InitializingBean {

	@PersistenceContext
	private EntityManager entityManager;

	private List<String> tableNames;

	@Override
	public void afterPropertiesSet() {
		final Set<EntityType<?>> entities = entityManager.getMetamodel().getEntities();
		tableNames = entities.stream()
			.filter(e->isEntity(e)&&hasTableAnnotation(e))
			.map(e->e.getJavaType().getAnnotation(Table.class).name())
			.collect(Collectors.toList());

		final List<String> entityNames = entities.stream()
			.filter(e -> isEntity(e) && !hasTableAnnotation(e))
			.map(e -> CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getName()))
			.toList();
	}


	private boolean isEntity(EntityType<?> e) {
		return null != e.getJavaType().getAnnotation(Entity.class);
	}

	private boolean hasTableAnnotation(EntityType<?> e) {
		return null != e.getJavaType().getAnnotation(Table.class);
	}

	@Transactional
	public void execute() {
		entityManager.flush();
		entityManager.createNativeQuery("SET REFERENTIAL_INTEGRITY FALSE").executeUpdate();

		for (final String tableName : tableNames) {
			entityManager.createNativeQuery("TRUNCATE TABLE " + tableName).executeUpdate();
			entityManager.createNativeQuery("ALTER TABLE " + tableName + " ALTER COLUMN ID RESTART WITH 1").executeUpdate();
		}

		entityManager.createNativeQuery("SET REFERENTIAL_INTEGRITY TRUE").executeUpdate();
	}
}
tddspring-bootpojo소프트웨어-테스트api

Câu trả lời 1

0

안녕하세요, 인프런 AI 인턴입니다. 유정현님.

DatabaseCleanup 코드를 공유해 주셔서 감사합니다. 이 코드는 JPA를 사용하여 테스트 환경에서 데이터베이스를 초기화하는 역할을 합니다. 아래는 코드의 주요 기능에 대한 간략한 요약입니다:

  1. EntityManager 사용: JPA의 EntityManager를 사용하여 데이터베이스와 인터랙션합니다.
  2. 초기 설정(afterPropertiesSet): JPA 메타모델을 통해 응용 프로그램에 정의된 엔터티의 메타 정보를 가져옵니다. 테이블명을 수집하여 tableNames 리스트에 저장합니다.
  3. isEntity 및 hasTableAnnotation: 각 엔터티가 유효한 엔터티인지 확인하고, 테이블 어노테이션이 존재하는지 확인하는 메서드입니다.
  4. 데이터베이스 초기화(execute): 모든 테이블에 대해 TRUNCATE 명령을 실행하고, AUTO_INCREMENT 값을 1로 초기화합니다.

이 코드는 테스트를 반복 실행할 때 각 테스트의 독립성을 보장하기 위해 데이터베이스 상태를 초기화하는 데 유용합니다.

아래의 유사 질문에서 추가로 도움을 받을 수 있습니다:
- TRUNCATE TABLE 시 AUTO_INCREMENT 컬럼 1로 초기화: TRUNCATE TABLE 명령 사용 시 Auto-increment 컬럼이 1로 초기화되는 것에 대한 설명입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của dbdb11142615
dbdb11142615

câu hỏi đã được viết

Đặt câu hỏi