inflearn logo
강의

Khóa học

Chia sẻ kiến thức

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 코드입니당 필요한 분들 쓰세요

125

dbdb11142615

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

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();
	}
}

tdd spring-boot pojo 소프트웨어-테스트 api

Câu trả lời 1

0

communityai8509

안녕하세요, 인프런 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로 초기화되는 것에 대한 설명입니다.

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

POJO에서 Spring Test로 넘어갈 때 누락(해결됨)

0

33

1

이 방법이 TDD가 맞나요?

0

1109

2

POJO로 개발했는데 비즈니스 로직을 로깅해야 할 경우, 어떻게 해야 할까요?

0

337

1

generate -> add Dependency 이 메뉴가 안보이던데, 어떻게 보이게할까요?

0

355

1

실무 Asserta 사용여부가 궁금합니다.

0

455

1

테스트 코드 내의 지역변수를 final로 선언하는 이유가 궁금합니다.

0

530

1

통합테스트와 단위 테스트

0

964

1

의존성 및 설계? 부분 질문드립니다.

0

400

1

테스트 더블

0

394

1

리뷰반영 강의에서 shortcut ctrl + esc 는 어떻게 설정하나요?

0

483

1

POJO

0

597

1

POJO 상품 등록 기능 구현하기 강의 질문

1

543

1

steps 클래스를 사용하는 이유

0

340

1

랜덤 포트를 사용하는 이유

0

1104

1

상품등록 API 개발, JPA로 변환하기 에서

0

875

2

패키지 구조에 대해서 궁금합니다!

0

645

1

BeforeEach 를 하위 클래스에서 다시 사용하는것에 대해서 질문 드립니다.

1

563

1

ProductService의 updateProduct 로직 질문입니다.

0

556

2

TRUNCATE TABLE 시 AUTO_INCREMENT 컬럼 1로 초기화

2

3498

1

POJO로 개발 후 스프링으로 전환, 이후 JPA 전환하는 이유

4

1283

1

TestRestTemplate 대신에 RestAssured를 사용하는 이유가 있을까요?

0

1190

1

API 테스트로 전환하기

0

1019

1

코드 스타일에 대해서 질문드립니다.

2

1138

1

혹시 강의 중에 나오는 플러그인 좀 알 수 있을까요

0

1221

1