You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
롤백에 의해 앞서 데이터베이스에 저장한 item1 , item2 , item3 의 데이터가 제거된다.
✅참고
테스트 케이스의 메서드나 클래스에 @transactional 을 직접 붙여서 사용할 때 만 이렇게 동작한다.
그리고 트랜잭션을 테스트에서 시작하기 때문에 서비스, 리포지토리에 있는 @transactional 도 테스트에서 시작한 트랜잭션에 참여한다. (이 부분은 뒤에 트랜잭션 전파에서 더 자세히 설명하겠다. 지금은 테스트에서 트랜잭션을 실행하면 테스트 실행이 종료될 때 까지 테스트가 실행하는 모든 코드가 같은 트랜잭션 범위에 들어간다고 이해하면 된다. 같은 범위라는 뜻은 쉽게 이야기해서 같은 트랜잭션을 사용한다는 뜻이다. 그리고 같은 트랜잭션 을 사용한다는 것은 같은 커넥션을 사용한다는 뜻이기도 하다.)
5️⃣ 테스트 - 임베디드 모드 DB
테스트 케이스를 실행하기 위해서 별도의 데이터베이스를 설치하고 운영하는 것은 비용 측면에서 낭비이다.
단순히 테스트를 검증할 정도로만 사용하기 때문에 테스트가 끝나면 데이터베이스의 데이터를 모두 삭제해도된다.
더 나아가서 테스트가 끝나면 데이터베이스 자체를 제거해도 된다.
✅ 임베디드 모드
H2 데이터베이스는 자바로 개발되어 있고, JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다.
그래서 애플리케이션을 실행할 때 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있다.
DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드(Embedded mode)라 한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
데이터 접근 기술 - 테스트
1️⃣ 테스트 - 데이터베이스 연동
✅ 환경 설정
하지만 테스트용 설정에는 spring.datasource.url과 같은 데이터베이스 연결 설정이 없다는 점이다.
✅ 테스트 실행 - 로컬 DB
@SpringBootApplication를 찾아서 설정으로 사용한다.
updateitem() : 성공
save() : 성공
findItems() : 실패
findItems()의 오류 내용
findItems() 코드를 확인해보면 상품을 3개 저장하고, 조회한다.
결과적으로 테스트에서 저장한 3개의 데이터가 조회 되어야 하는데, 기대보다 더 많은 데이터가 조회되었다.
TestDataInit은 프로필이 local일 때만 동작하는데, 테스트 케이스를 실행할 때는 프로필이 spring.profiles.active=test이기 때문에 초기화 데이터가 추가되지는 않는다.
문제는 DB에 과거에 서버를 실행하면서 저장했던 데이터가 보관되어 있기 때문이다.
이전 데이터가 현재 테스트에 영향을 주고 있다.
2️⃣ 테스트 - 데이터베이스 분리
✅ 데이터 베이스 구분
jdbc:h2:tcp://localhost/~/testlocal에서 접근하는 서버 전용 데이터베이스jdbc:h2:tcp://localhost/~/testcasetest 케이스에서 사용하는 전용 데이터베이스데이터베이스 파일 생성 방법
sa입력jdbc:h2:~/testcase(최초 한번)~/testcase.mv.db파일 생성 확인jdbc:h2:tcp://localhost/~/testcase이렇게 접속✅ 테이블 생성하기
✅ 테스트에서 매우 중요한 원칙은 다음과 같다.
3️⃣ 테스트 - 데이터 롤백
✅ 트랜잭션과 롤백 전략
테스트가 끝나고 트랜잭션을 강제로 롤백해버리면 데이터가 원래대로 돌아가 테스트의 원칙을 지킬 수 있다.
예) 각각의 테스트 실행 직전에 트랜잭션을 시작하고, 각각의 테스트 실행 직후에 트랜잭션을 롤백해야 한다. 그래야 다음 테스트에 데이터로 인한 영향을 주지 않는다.
@BeforeEach,@AfterEach라는 편리한 기능을 제공한다.@BeforeEach: 각각의 테스트 케이스를 실행하기 직전에 호출된다. 따라서 여기서 트랜잭션을 시작하면 된다. 각각의 테스트를 트랜잭션 범위 안에서 실행할 수 있다.@AfterEach: 각각의 테스트 케이스가 완료된 직후에 호출된다. 따라서 여기서 트랜잭션을 롤백하면 된다. 그러면 데이터를 트랜잭션 실행 전 상태로 복구할 수 있다.✅ 테스트 실행 하기 전 사전 작업
4️⃣ 테스트 @transactional
✅ @transactional 추가
✅ 테스트 실행 하기 전 사전 작업
✅ @transactional 원리
스프링이 제공하는
@Transactional애노테이션은 로직이 성공적으로 수행되면 커밋하도록 동작한다.그런데
@Transactional애노테이션을 테스트에서 사용하면 아주 특별하게 동작한다.@Transactional이 테스트에 있으면 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 버린다!findItems()를 예시로 알아보기
✅ @transactional이 적용된 테스트 동작 방식
5️⃣ 테스트 - 임베디드 모드 DB
✅ 임베디드 모드
✅ 임베디드 모드 직접 사용
위 코드 설명
jdbc:h2:mem:db- 데이터소스를 만들때 이렇게만 적으면 임베디드 모드(메모리모드)로 동작하는 H2 데이터베이스를 사용할 수 있음DB_CLOSE_DELAY=-1- 임베디드 모드에서는 데이터베이스 커넥션 연결이 모두 끊어지면 데이터베이스 도 종료되는데, 그것을 방지하는 설정이다.위 코드 실행
✅ 스프링 부트 - 기능
기본 SQL 스크립트를 사용해서 데이터베이스를 초기화하는 기능
src/test/resources/schema.sql
실행
로그 확인
6️⃣ 테스트 - 스프링 부트와 임베디드 모드
스프링부트가 앞서 배운것보다 더 쉽고 편리하게 만들어주는 임베디드 데이터베이스에 대한 설정을 제공한다.
ItemServiceApplication 주석 처리
임베디드 데이터베이스 이름을 스프링 부트가 기본적으로 제공하는
jdbc:h2:mem:testdb로 고정하고 싶으면 application.properties에 설정 추가하면된다.spring.datasource.generate-unique-name=false스프링 부트 3.x 로깅 변경 사항
org.springframework.test.context.transaction.TransactionContext 에서 남기는 로깅이 INFO
TRACE 로 변경되었다. 참고로 핵심 정보만 출력하려면 DEBUG 를 사용해도 된다.
application.properties
All reactions