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
테스트를 위해 데이터베이스를 설치하는 것은 번거로운 작업임.
테스트 이기 때문에 데이터를 모두 삭제해도 괜찮고 사실 테스트가 끝나면 데이터베이스도 필요 없음.
임베디드 모드
H2 데이터베이스는 자바로 개발되어 있고, JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다. 그래서 애플 리케이션을 실행할 때 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있다. DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드(Embedded mode)라 한다.
애플리케이션 종료시 같이 종료되고 사라짐.
dataSource()
url 의 jdbc:h2:mem:db 이부분이 중요. 이렇게만 적으면 임베디드 모드로 동작하는 h2 데이터베이스 사용할 수 있음.
DB_CLOSE_DELAY=-1" 임베디드 모드에선 데이터베이스 커넥션이 모두 끊어지면 종료되는데 이를 방지함
테스트 실행하면, 테이블이 없다는 오류가 나옴.
메모리 디비를 새로 만들었으니 당연히 테이블이 없음.
테이블을 직접 테스트마다 만들어도 되지만 너무복잡합.
스프링 부트 - 기본 SQL 스크립트를 사용해서 데이터베이스를 초기화하는 기능
메모리 DB는 애플리케이션이 종료될 때 함께 사라지기 때문에, 애플리케이션 실행 시점에 데이터베이스 테이블도 새로 만들어주어야 한다.
이를 직접 호출하도 되지만, 스프링 부트는 SQL 스크립트를 실행해서 애플리케이션 로딩 시점에 데이터베이스 초기화 하는 기능 제공.
Test 가 있는 resources 에 schema.sql 추가. (파일명이 오타나면 안됨)
파일에 아래 코드 추가
droptable if exists item CASCADE;
createtableitem
(
id bigint generated by default as identity,
item_name varchar(10),
price integer,
quantity integer,
primary key (id)
);
그러면 정상적으로 테스트 통과.
저 스크립트도 귀찮아 보이는데, 이걸 또 스프링이 해결해줌.
테스트 - 스프링 부트와 임베디드 모드
스프링 부트는 개발자에게 정말 많은 편리함을 제공하는데, 임베디드 데이터베이스에 대한 설정도 기본으로 제공한다.
스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용한다.
데이터베이스를 빈으로 등록하는 것 하지 않아도 괜찮음.
원래 테스트의 application.properties 에 들어가 있던 디비 접속 정보 부분을 주석처리 해보자.
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.
테스트 - 임베디드 모드 DB
테스트를 위해 데이터베이스를 설치하는 것은 번거로운 작업임.
테스트 이기 때문에 데이터를 모두 삭제해도 괜찮고 사실 테스트가 끝나면 데이터베이스도 필요 없음.
임베디드 모드
H2 데이터베이스는 자바로 개발되어 있고, JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다. 그래서 애플 리케이션을 실행할 때 H2 데이터베이스도 해당 JVM 메모리에 포함해서 함께 실행할 수 있다. DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드(Embedded mode)라 한다.
애플리케이션 종료시 같이 종료되고 사라짐.
H2 디비를 임베디드 모드로 사용해보자
url 의 jdbc:h2:mem:db 이부분이 중요. 이렇게만 적으면 임베디드 모드로 동작하는 h2 데이터베이스 사용할 수 있음.
DB_CLOSE_DELAY=-1" 임베디드 모드에선 데이터베이스 커넥션이 모두 끊어지면 종료되는데 이를 방지함
테스트 실행하면, 테이블이 없다는 오류가 나옴.
메모리 디비를 새로 만들었으니 당연히 테이블이 없음.
테이블을 직접 테스트마다 만들어도 되지만 너무복잡합.
스프링 부트 - 기본 SQL 스크립트를 사용해서 데이터베이스를 초기화하는 기능
메모리 DB는 애플리케이션이 종료될 때 함께 사라지기 때문에, 애플리케이션 실행 시점에 데이터베이스 테이블도 새로 만들어주어야 한다.
이를 직접 호출하도 되지만, 스프링 부트는 SQL 스크립트를 실행해서 애플리케이션 로딩 시점에 데이터베이스 초기화 하는 기능 제공.
Test 가 있는 resources 에 schema.sql 추가. (파일명이 오타나면 안됨)
파일에 아래 코드 추가
그러면 정상적으로 테스트 통과.
저 스크립트도 귀찮아 보이는데, 이걸 또 스프링이 해결해줌.
테스트 - 스프링 부트와 임베디드 모드
스프링 부트는 개발자에게 정말 많은 편리함을 제공하는데, 임베디드 데이터베이스에 대한 설정도 기본으로 제공한다.
스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용한다.
데이터베이스를 빈으로 등록하는 것 하지 않아도 괜찮음.
이렇게 하면 데이터베이스에 접근하는 모든 설정 정보가 사라지게 된다.
이렇게 별다른 정보가 없으면 스프링 부트는 임베디드 모드로 접근하는 데이터소스(
DataSource)를 만들어서 제공한 다. 바로 앞서 우리가 직접 만든 데이터소스와 비슷하다 생각하면 된다.테스트 실행해도 잘 동작함!
임베디드 모드로 동작하는중.
참고로 로그를 보면 다음 부분을 확인할 수 있는데
jdbc:h2:mem뒤에 임의의 데이터베이스 이름이 들어가 있다. 이 것은 혹시라도 여러 데이터소스가 사용될 때 같은 데이터베이스를 사용하면서 발생하는 충돌을 방지하기 위해 스프링 부트가 임의의 이름을 부여한 것이다.conn0: url=jdbc:h2:mem:d8fb3a29-caf7-4b37-9b6c-b0eed9985454임베디드 데이터베이스 이름을 스프링 부트가 기본으로 제공하는
jdbc:h2:mem:testdb로 고정하고 싶으면application.properties에 다음 설정을 추가하면 된다.spring.datasource.generate-unique-name=false결국 테스트에는 @transactional 만 붙여주면 알아서 된다!!
All reactions