W4D4 - SpringBootPart2

Onni·2021년 9월 2일
0

TIL

목록 보기
9/21

Embeded DataBase

  • 지금까지 작성한 코드는 DB가 접속이안되면 테스트가 실패
  • 외부환경이 테스트에 영향을 주면 테스트에 대한 자동화가 불가능
  • 자동화를 가능하게 하기위해 스프링에서는 Embeded DataBase 제공
  • 쿼리문 추가

1. H2 DataBase

  • H2 DataBase를 위한 Dependency 추가
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>


  • 다음과 같이 SQL 문법을 해석 할 수 없다는 오류메세지가 뜬다.
  • H2에서 특정 function을 쓰는 SQL은 지원하지 않음
  • 때문에 오픈소스 embededsql 이용

2. Embedded Mysql

  • Dependency 추가
<dependency>
<groupId>com.wix</groupId>
<artifactId>wix-embedded-mysql</artifactId>
<version>4.6.1</version>
<scope>test</scope>
</dependency>

디비가 동작하면서 데이터가 내려가기때문에 deleteAll 할 필요 없음
직접 환경의 접속정보를 넣지 않았음

3. NamedParameterJdbcTemplate

  • 인덱스 기반에서 이름기반의 파라미터 설정을 해줌

4. DataAccessException

5. Transaction

  • 트랜잭션 테스트를 위해 JdbcCustomerRepository 에 메서드 추가
public void transactionTest(Customer customer) {
        String updateNameSql = "UPDATE customers SET name = ? WHERE customer_id = UUID_TO_BIN(?)";
        String updateEmailSql = "UPDATE customers SET email = ? WHERE customer_id = UUID_TO_BIN(?)";

        Connection connection = null; //RollBack 해주기 위해 Try문 밖으로 뻄
        try {
            connection = DriverManager.getConnection("jdbc:mysql://localhost/order_mgmt", "root", "test1234");
            connection.setAutoCommit(false); // 없으면 커밋이 되기때문에 롤백 안댐 
            try (
                    var updateNameStatement = connection.prepareStatement(updateNameSql);
                    var updateEmailStatement = connection.prepareStatement(updateEmailSql);
            ) {

                updateNameStatement.setString(1, customer.getName());
                updateNameStatement.setBytes(2, customer.getCustomerId().toString().getBytes());
                updateNameStatement.execute();

                updateEmailStatement.setString(1, customer.getEmail());
                updateEmailStatement.setBytes(2, customer.getCustomerId().toString().getBytes());
                updateEmailStatement.execute();
                connection.setAutoCommit(true);
            }
        }catch (SQLException exception) {
                if (connection != null) {
                    try {
                        connection.rollback();
                        connection.close();
                    } catch (SQLException throwable) {
                        logger.error("Got error while closing connection", throwable);
                        throw new RuntimeException(exception);
                    }
                }
                logger.error("Got error while closing connection", exception);
                throw new RuntimeException(exception);
            }
    }
  public static void main(String[] args) {
        var customerRepository = new JdbcCustomerRepository();

        //이메일에 유니크가 깨지기 때문에 에러 발생
        customerRepository.transactionTest(new Customer(UUID.fromString("38b32b34-21dc-4e50-abd0-ae06ffa5c126"), "updated-user", "new-user2@gmail.com", LocalDateTime.now()));
}
  • 콘솔창에서 저장되어 있는 값 확인
  • 실행시키면 이메일이 중복되기때문에 오류가 발생하는 것을 확인 가능
profile
꿈꿈

0개의 댓글