DB등의 외부환경이 테스트 성공 실패에 영향을 주면 테스트에 대한 자동화 불가능.
-> 개발중에 고정적으로 사용할수있는 내부 DB가 필요함.
-> 임베디드 DB 사용
EmbeddedDatabase 자체가 datasource를 extend한다.
따라서 DB연결 후 datasource 형태로 반환가능.
//H2 사용할때
EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(H2) // H2 Db를 통해
.setScriptEncoding("UTF-8")
.ignoreFailedDrops(true)
.addScript("schema.sql")//add script: 스크립트 읽어서 초기설정
.build()
근데, SQL 자체가 벤더사(MYSQL, POSTQL 등)에 따라 쿼리에 쓰이는 function이 다르기 때문에(ex. UUID_TO_BIN) mysql에 맞춘 쿼리에는 H2 DB 가 동작 안할수도있다.
-> 벤더사에 맞는 임베디드 DB(embedded-mysql 등) 사용이 필요할 수 있다. (대체로 오픈소스로 사용할수있다.)
=> 따라서 그런 function 필요없도록 쿼리 작성하거나, 안된다면 적절한 임베디드 db 오픈소스를 활용해서 동작시킬 수 있다.
//1.Config 등의 메소드에 사용할 데이터소스를 반환
var dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost:2215/test-order_mgmt")
.username("test")
.password("test1234!")
.type(HikariDataSource.class)
.build();
@BeforeAll
void setUp(){
//1. 임베디드 mysql에 관해 설정
var mysqldConfig= aMysqldConfig(v8_0_11)
.withCharset(UTF8)
.withPort(2215)
.withUser("test", "test1234!")
.withTimeZone("Asia/Seoul")
.build();
EmbeddedMysql embeddedMysql = anEmbeddedMysql(mysqldConfig)
.addSchema("test-order_mgmt",classPathScript("schema.sql"))
.start();
}
스프링이 NamedParameterJdbcTemplate를 제공
-> 템플릿의 ?와 숫자 인덱스 기반(일반 JdbcTemplate) 아닌
-> 이름 기반의 파라미터를 설정하게 해주는 템플릿
JdbcTemplate을 가지고 있고, 그 파라미터 부분을 조정해서 제공.
잘못된 sql 접근
-> sqlException에서 얻는 코드값이 벤더사마다 다름.
-> 스프링이 DataAccessException을 제공, 다양한 데이터접근 에러를 포함(DuplicateKeyException 등)하고 있음.
-> 타입화된 에러를 활용할 수 있음
try {
customerNamedJdbcRepository.insert(newCustomer);
}catch (BadSqlGrammarException e){
//원래는 각 에러코드마다 처리해야함.
// BadSqlGrammarException처럼 타입화된 에러를 활용해 이를 쉽게 처리가능
logger.error("got BadSqlGrammarException errorcode ->{}",e.getSQLException().getErrorCode());
}
트랜잭션 -> ACID을 유지
중간에 망가지면 -> 롤백.
성공적으로 마무리되면 중간 과정을 커밋.
connection.setAutoCommit(false);
connection.setAutoCommit(true);
connection.rollback();