[Spring Boot] MySQL 연결

one-us·2022년 11월 9일

toGETus

목록 보기
8/8
post-thumbnail
  1. Dependency 추가
dependencies {
	implementation 'mysql:mysql-connector-java' // MySQL
	implementation 'org.mybatis.spring.boot.mybatis-spring-boot-starter' // MyBatis
}
  1. application.properties
# DataSource
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/{DBNAME}?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username={USERNAME}
spring.datasource.password={PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  1. config 추가

DataSourceConfig.java

package com.project.togetus.config;

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataSourceConfig {
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
    
}

MySQLConfig.java

package com.project.togetus.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan("com.project.togetus.dao")
public class MySQLConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver ();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

        Resource myBatisConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
        sessionFactory.setConfigLocation(myBatisConfig);

        return sessionFactory.getObject();
    }
    
}

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="callSettersOnNulls" value="true"/>
    </settings>
</configuration>
  1. 연결 작업

UserDTO.java

package com.project.togetus.dto;

import lombok.Data;

@Data
public class UserDTO {
    int id;
    String user_id;
    String name;
    String status;
    String created_at;
    String modified_at;
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.togetus.dao.UserDAO">
    <select id="getUser" resultType="com.project.togetus.dto.UserDTO">
        select
            id,
            user_id,
            name,
            status,
            created_at,
            modified_at
        from
            TB_USER
    </select>
</mapper>

userDAO.java

package com.project.togetus.dao;

import java.util.List;

import com.project.togetus.dto.UserDTO;

public interface UserDAO {
    List<UserDTO> getUser();
    
}

userController.java

@RestController
@RequestMapping("/api")
public class userController {
    @Autowired
    private UserDAO userDAO;

    @GetMapping("/user")
    public List<UserDTO> getUser() {
        return userDAO.getUser();
    }
}
  1. 해치웠다.

  2. 덤+) .gitignore 추가작업

application.properties

를 추가해주자! 보안은 중요하다 !

실패한 내용
실패한 test: 원인을 찾아서 고칠 것
1. TEST: DB 연결을 테스트해보자.
src/test/package 아래에 다음과 같이 파일을 만들자. 이름은 `DBConnectionTest`로 했다.
이상하게도 나는 이미 만들어진 디렉토리&파일이 있었다. main에서 만든 파일은 자동으로 생성되나보다. 해당 위치에 그대로 하면 Test annotation이 안먹으니 test/package를 꼭 만들어 새로 만들자.

  1. 코드
package com.project.togetus;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnectionTest {
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    private static final String URL = "jdbc:mysql://localhost:3306/{DBNAME}?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false";
    private static final String USER = "{USERNAME}";
    private static final String PASSWORD = "{PASSWORD}";

    @Test
    public void testConnection() throws Exception {
        Class.forName(DRIVER);
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

를 그대로 빌드했더니 오류가 나는 것이 아닌가!

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

구글링을 좀 해보니
main/resources/application.properties에 아래 내용을 추가하라고 한다.

# DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/{DBNAME}?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username={USERNAME}
spring.datasource.password={PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

추가해도 안돼서 일단 포기했다.

출처
https://doozi0316.tistory.com/entry/Spring-Boot-MyBatis-MySQL-%EC%97%B0%EB%8F%99-%EB%B0%A9%EB%B2%95
https://fntg.tistory.com/193
https://inasie.github.io/it%EC%9D%BC%EB%B0%98/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-expander-control/

0개의 댓글