Backend/Spring

[Spring Error] EmbeddedDatabase 사용 시 java.lang.RuntimeException: mysql start failed with error 해결

mirae.kwak 2022. 8. 5. 15:15
728x90

Error

JUnit을 사용한 스프링 부트 테스트 시에 EmbeddedDatabase를 사용해 mysql을 연결하려고 했다.

    @Configuration
    @ComponentScan(
        basePackages= {"org.prgrms.kdt.customer"}
    )
    static class Config{
        @Bean
        public DataSource dataSource() {
            var dataSource = DataSourceBuilder.create()
                    .url("jdbc:mysql://localhost:2215/test-order_mgmt")
                    .username("test")
                    .password("0000")
                    .type(HikariDataSource.class)
                    .build();
            return dataSource;
        }

        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    Customer newCustomer;

    EmbeddedMysql embeddedMysql;

    @BeforeAll
    void setup() {
        newCustomer = new Customer(UUID.randomUUID(), "test-user", "test-user@gmail.com",
                LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS));
        var mysqlConfig = aMysqldConfig(Version.v8_0_11)
                .withCharset(UTF8)
                .withPort(2215)
                .withUser("test", "0000")
                .withTimeZone("Asia/Seoul")
                .build();
        embeddedMysql = anEmbeddedMysql(mysqlConfig)
                .addSchema("test-order_mgmt", classPathScript("schema.sql"))
                .start();
    }

 

이때 다음과 같은 에러가 나면서 mysql start에 실패했다.

java.io.IOException: java.lang.RuntimeException: mysql start failed with error: [ERROR] [MY-010338] [Server] Can't find error-message file 'C:\Users\MIRAE\CNU_LectureMaterial\share\errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2022-08-05T05:56:59.996507Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\Users\MIRAE\CNU_LectureMaterial\data\DESKTO

 

 

Solution

기존에 내가 사용했던 mysql 버전은 v8_0_11로 이는 윈도우에서 잘 작동하지 않는 경우가 있다고 한다. 따라서 버전을 v5_7_10 으로 낮춰주었더니 연결에 성공했다.

하지만 이때 주의할 점은 v8_0_11 해당 버전에서 사용가능한 sql 문법인 UUID_TO_BIN()이 v5_7_10 버전에서는 작동하지 않는다. 따라서 v5_7_10 버전을 사용할 때에는 다음과 같은 변경이 필요하다.

 

v8_0_11

@Override
    public Optional<Customer> findById(UUID customerId) {
        try {
            return Optional.ofNullable(
                    jdbcTemplate.queryForObject(
                            "select * from customers where customer_id = UUID_TO_BIN(?)",
                            customerRowMapper,
                            customerId.toString().getBytes())
            );
        } catch (EmptyResultDataAccessException e){
            logger.error("Got empty result ", e);
            return Optional.empty();
        }

 

v5_7_10

    @Override
    public Optional<Customer> findById(UUID customerId) {
        try {
            return Optional.ofNullable(
                    jdbcTemplate.queryForObject(
                            "select * from customers where customer_id = UNHEX(REPLACE(?, '-',''))",
                            customerRowMapper,
                            customerId.toString())
            );
        } catch (EmptyResultDataAccessException e){
            logger.error("Got empty result ", e);
            return Optional.empty();
        }
    }

 

728x90