[TIL]20210826

열심히 사는 루피 🥰·2021년 8월 26일
0

데브코스 백엔드 TIL

목록 보기
15/20

1. Embedded DataBase

왜 임베디드 DB 쓰는가

DB등의 외부환경이 테스트 성공 실패에 영향을 주면 테스트에 대한 자동화 불가능.
-> 개발중에 고정적으로 사용할수있는 내부 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()

오픈소스 임베디드 DB의 사용

근데, 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();
    }

mysql 임베디드 DB 오픈소스 링크

2.NamedParameterJdbcTemplate

NamedParameterJdbcTemplate란?

스프링이 NamedParameterJdbcTemplate를 제공
-> 템플릿의 ?와 숫자 인덱스 기반(일반 JdbcTemplate) 아닌
-> 이름 기반의 파라미터를 설정하게 해주는 템플릿

JdbcTemplate을 가지고 있고, 그 파라미터 부분을 조정해서 제공.

  • 해시맵을 제공하고, 그 해시맵의 키값을 사용

Exception 처리

잘못된 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();
profile
반가워_! 세상아!

0개의 댓글