• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

create test 부분에서 시퀀스 문제가 있습니다.

24.02.18 19:19 작성 조회수 216

0

단일 테스트는 문제 없지만 전체 테스트 진행 시

테이블의 id의 시퀀스가 계속 증가 하는 문제로
jpa save 시 id 1에 저장하려는 문제가 발생하여

user-service-test-data.sql

-- insert into `users` (`id`, `email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
-- values (1, 'kok202@naver.com', 'kok202', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'ACTIVE', 0);
-- insert into `users` (`id`, `email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
-- values (2, 'kok303@naver.com', 'kok303', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab', 'PENDING', 0);


insert into `users` (`email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
values ('kok202@naver.com', 'kok202', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'ACTIVE', 0);
insert into `users` (`email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
values ('kok303@naver.com', 'kok303', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab', 'PENDING', 0);


post-service-test-data.sql


-- insert into `users` (`id`, `email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
-- values (1, 'kok202@naver.com', 'kok202', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'ACTIVE', 0);
-- insert into `users` (`id`, `email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
-- values (2, 'kok303@naver.com', 'kok303', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab', 'PENDING', 0);
-- insert into `posts` (`id`, `content`, `created_at`, `modified_at`, `user_id`)
-- values (1, 'helloworld', 1678530673958, 0, 1);


insert into `users` (`email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
values ('kok202@naver.com', 'kok202', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'ACTIVE', 0);
insert into `users` (`email`, `nickname`, `address`, `certification_code`, `status`, `last_login_at`)
values ('kok303@naver.com', 'kok303', 'Seoul', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab', 'PENDING', 0);
insert into `posts` (`content`, `created_at`, `modified_at`, `user_id`)
values ('helloworld', 1678530673958, 0, 1);
delte-all-data.sql

delete from `posts` where 1;
delete from `users` where 1;

ALTER TABLE `users` ALTER COLUMN id RESTART WITH 1;
ALTER TABLE `posts` ALTER COLUMN id RESTART WITH 1;

이와 같이 변경하였는데 혹시 다른 방법이 있을까요?

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.19

안녕하세요, 인프런 AI 인턴입니다.

님의 문제는 테스트를 할 때마다 시퀀스가 초기화되지 않아 테스트 데이터의 ID 값 충돌을 경험하고 계신 것으로 이해합니다. Spring Boot에서 테스트를 진행할 때, 데이터베이스의 ID 시퀀스를 초기화하는 몇 가지 방법이 있습니다. 예를 들어, 테스트용 데이터베이스가 메모리 내 임베디드 데이터베이스인 경우에는 테스트가 종료될 때마다 데이터베이스 상태가 자동으로 초기화되어 문제가 되지 않습니다. 그러나 실제 데이터베이스를 사용하는 경우에는 @DataJpaTest 애노테이션을 사용하여 각각의 테스트가 독립적으로 수행되도록 할 수 있습니다.

만약 @DataJpaTest 애노테이션이 적용된 테스트 클래스에서 테스트가 실행될 때마다 롤백이 이루어져야 한다면, 이는 트랜잭션 관리를 통해 해결할 수 있으며, 기본적으로 테스트는 롤백이 이루어집니다. 다음 문서를 참고하시면 좋을 것 같습니다:
- Spring Boot Reference Documentation v3.1.5 - 테스트 트랜잭션 관리

그리고 각 테스트 진행 후에 테이블의 시퀀스를 초기화하기 위해 SQL 스크립트를 사용하시는 것도 좋은 방법입니다. 첨부하신 delte-all-data.sql 파일에서 시퀀스를 초기화하는 부분이 적절하게 적용되었습니다만, 테스트 환경에 따라서는 이러한 SQL 명령이 지원되지 않을 수도 있습니다.

참고로, @DataJpaTest 애노테이션이 적용될 경우에는 기본적으로 기존의 데이터베이스 연결 대신에 내장 메모리 데이터베이스가 사용됩니다. 해당 애노테이션은 @Entity 클래스를 스캔하고, Spring Data JPA 리포지토리를 구성하며, 클래스패스에서 이용 가능한 임베디드 데이터베이스가 있다면 이를 설정합니다. 만약, 실제 데이터베이스에서 테스트를 수행하길 원하신다면 @AutoConfigureTestDatabase(replace = Replace.NONE) 애노테이션 사용을 고려해볼 수 있습니다. 이에 대해서는 다음 문서에서 더 자세한 정보를 얻으실 수 있습니다:
- Spring Boot Reference Documentation v3.1.5 - Auto-configured Data JPA Tests

다른 방법을 찾으신다면, 마이그레이션 도구(예: Flyway or Liquibase)를 사용하여 테스트 실행 전에 데이터베이스를 초기화하는 것도 가능합니다. 이 방법은 테스트 데이터와 스키마를 동기화하는 데에도 도움이 됩니다.

자세한 설정 방법이나 추가적인 도움이 필요하시면, 문서를 참고하시거나 필요한 내용을 질문으로 남겨주세요.