스프링/6. 스프링 DB-2

16. 임베디드 모드 DB

sdafdq 2023. 10. 9. 15:39

H2 DB는 자바로 개발되어 있다.

JVM안에서 메모리 모드로 동작하는 특별한 기능을 제공한다.

즉, 휘발성인 모드 이다.

DB를 애플리케이션에 내장해서 함께 실행한다고 해서 임베디드 모드라고 한다.

애플리케이션이 종료되면 임베디드 모드로 동작한 H2 DB도 함께 종료되고 데이터도 모두 휘발된다.

 

 

하는 방법이 어렵지는 않다.

 

@Import(JdbcTemplateV3Config.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

	@Bean
	@Profile("local")
	public TestDataInit testDataInit(ItemRepository itemRepository) {
		return new TestDataInit(itemRepository);
	}

	@Bean
	@Profile("test")
	public DataSource dataSource(){
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("org.h2.Driver");
		dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
		dataSource.setUsername("sa");
		dataSource.setPassword("1234");
		return dataSource;
	}
}

저기 보면 test 때는 데이타소스를 따로 등록해 준다.

setDriverClassName은 이게 h2라는 것을 알려주고

setUrl이 중요한 데 "jdbc:h2:mem:db;" 이게 메모리 환경에서 동작하는 DB란 뜻이고, mem뒤의 db는 그냥 이름이다.

DB_CLOSE_DELAY=-1 이거는 아무래도 임베디드 모드의 DB는 커넥션 연결이 모두 끊어지면 DB도 종료되는데, 그걸 방지하기 위한 것 이라고 한다. 직역은 DB의 닫는 딜레이 인데, 그걸 -1이라면 따로 값을 안준거나 마찬가지니 무한이기에 계속 안닫는 다는 뜻인가 봄. 물론 JVM에서 동작하는 거라 애플리케이션이 꺼지면 얘도 꺼지긴 함.

그 다음 username, 비번인데 저거는 진짜 그냥 아무렇게나 해놔도 됨.

 

이렇게 하고 빈으로 등록하면 저게 DataSource로 등록되긴 하는데,

휘발성이라 꺼지면 다 사라지고..

즉 테이블조차 없다는 소리임.

 

근데, 스프링부트는 애플리케이션 실행할 때 DB를 초기화 해주는 기능을 제공함.

resource/schema.sql 이라는 파일을 만들어서 거기에 sql문을 써 주면 매번 내가 지정한 그 DataSource에서 지정한 그 DB에 매번 여기안에 있는 명령들을 날려 초기화 시켜 주는 듯.

근데 이거는 테스트용도라,

/test/resouce/schema.sql 테스트 안에 있는 resource에 schema.sql을 만들어서 넣어야 함.

주의 하셈. main에 있는 resouce에 하면.. 우리가 기껏 테스트 용도로 설정한 DB에 명령들을 날리는 게 아니라 실제 우리가 서비스용으로 하려고 한 DB에 명령을 날림.

drop table if exists item CASCADE;
create table item
(
    id bigint generated by default as identity,
    item_name varchar(10),
    price integer,
    quantity integer,
    primary key(id)
);

여튼 이렇게.

 

 

 

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

18. MyBatis  (0) 2023.10.09
17. 스프링부트의 임베디드 DB  (0) 2023.10.09
15. @Transactional로 테스트  (0) 2023.10.09
14. 데이터 롤백  (0) 2023.10.09
13. 테스트용 DB와 서버용 DB 분리  (0) 2023.10.09