ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [22] Spring Data : MySQL 설정하기
    Spring/Spring boot 2020. 7. 9. 08:55
    반응형

    [DataBase Connection Pool - DBCP]

    Database를 사용하기 위해서는 먼저 Database와 연결(connection)할 수 있어야 합니다. 이 연결 작업은 cost가 높은 작업으로 Database에 작업이 필요할 때마다 connection을 진행하면 성능상 문제가 발생할 수 있습니다. 따라서 사용하기 전에 일정 수량의 DataBase Connection을 만들어 두고 필요로 할 때 할당하며 사용이 완료되면 connection을 pool로 반환하도록 합니다. 이렇게 DB connection을 담아두고 관리하는 pool을 DataBase Connection Pool (DBCP)라고 합니다.

     

    Spring boot에서 지원하는 DBCP의 종류는 다음과 같습니다.

    1. HikariCP (default)
    2. Tomcat CP
    3. Commons DBCP2

     

     


    [DBCP 설정]

    application.properties file에 DBCP 설정과 관련한 property를 추가할 수 있습니다.

     

    spring.datasource.{DBCP 이름}.* 로 DBCP 이름 이하의 property에 대한 값을 설정할 수 있습니다. 만약 hikari connection pool의 maximum pool size를 2로 지정하고자 한다면 다음의 내용을 application.properties file에 추가합니다. (현재 제가 실습하고 있는 컴퓨터는 2 core 이므로 최대 pools size를 2로 잡았습니다.)

    spring.datasource.hikari.maximum-pool-size=2

     

    Spring boot의 기본 DBCP인 HikariCP의 기본 설정 값은 다음과 같습니다.

    • autoCommit = true ->statement가 실행되면 자동으로 적용하도록 설정되어 있습니다.
    • connectionTimeout = 30000 (30sec) -> DBCP에서 connection 결과를 30초 안에 application에 전달하지 못했을 때 exception을 발생시킵니다.
    • maximumPoolSize = 10 -> 최대 DB connection 객체 수를 지정할 수 있습니다. 기본은 10입니다. connection 객체를 아무리 많이 만들어도 동시 처리 가능한 connection 수는 CPU core 수와 동일하므로 service를 가동할 hardware의 사양을 파악하여 가장 적절한 connection 수를 유지하도록 설정할 필요가 있습니다.

    위와 같은 DBCP관련 property들은 HikariConfig를 상속받은 HikariDataSource class(HikariData HikariCP-{jar version}.jar의 HikariConfig class file)를 통해 접근하고 설정합니다. class file을 살펴보면 어떤 property를 가지고 있는지 확인해볼 수 있고 각각의 property에 대한 설명은 문서를 통해 확인합니다.

     

     

     


    [MySQL 사용하기]

    pom.xml을 열어 dependencies tag 안에 mysql connector(DataSource의 구현체) 의존성을 추가하도록 합니다.

    <dependencies>
    
    ...
    
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    	</dependency>
    
    
    ...
    </dependencies>

     

    이로써 Spring boot에서 MySQL에 연결할 준비는 완료되었습니다. 이제 사용할 MySQL을 설치해야 합니다.

    Docker를 사용하면 MySQL을 손쉽게 설치하고 사용할 수 있습니다. 만약 Docker가 설치되어있지 않은 경우 https://docs.docker.com/docker-for-mac/install/ 에서 Docker 설치를 진행합니다. Docker 설치 후에는  다음 명령을 통해 container를 실행합니다.  (MySQL을 설치)

    docker run -p 3306:3306 --name mysql_boot -e MYSQL_ROOT_PASSWORD=1 -e MYSQL_DATABASE=springboot -e MYSQL_USER=dave -e MYSQL_PASSWORD=pass -d mysql
    • -p 3306:3360: Docker container 안의 3306 port를 local machine의 3306 port로 연결하라는 의미입니다.
    • --name mysql_boot: container의 이름은 mysql_boot입니다.
    • -e MYSQL_ROOT_PASSWORD=1: MySQL의 root password를 1로 설정합니다.
    • -e MYSQL_DATABASE=springboot: springboot 라는 database를 만듭니다.
    • -e MYSQL_USER=dave: dave라는 User를 생성합니다.
    • -e MYSQL_PASSWORD=pass: User dave의 password를 pass로 설정합니다.
    • -d mysql: container에 사용할 image를 mysql로 지정합니다.

     

    Docker instance가 실행중인지 확인하기 위해 terminal에서 다음과 같이 명령을 실행합니다.

    docker ps

    다음 그림과 같이 Docker instance가 지정한 port에서 실행되고 있음을 볼 수 있습니다.

    만약 Docker containter를 중지하고 삭제해야 하는 경우는 terminal에서 다음의 명령어를 차례대로 실행해줍니다.

    docker stop {Containter_Name}
    docker rm {Container_Name}

     

     

     

    이제 이 database instance에 접속하기 위해 application.properties file에 다음의 property를 추가해줍니다.

    spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.username=dave
    spring.datasource.password=pass

     

     

    table을 생성하고 data를 하나 insert하는 Runner class를 추가합니다.

    @Controller
    public class MySQLRunner implements ApplicationRunner {
    
        @Autowired
        DataSource dataSource;
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
    
            try(Connection connection = dataSource.getConnection()) {
                String url = connection.getMetaData().getURL();
                String userName = connection.getMetaData().getUserName();
    			
    			System.out.println("DBCP type: " + dataSource.getClass());
                System.out.println("URL: " + url);
                System.out.println("UserName: " + userName);
    
                Statement statement = connection.createStatement();
                String sql = "CREATE TABLE USER(ID INTEGER NOT NULL, name VARCHAR(255), PRIMARY KEY (id))";
                statement.executeUpdate(sql);
            }
    
            jdbcTemplate.execute("INSERT INTO USER VALUES (1, 'Dave')");
        }
    }
    

     

     

    terminal에 다음 명령어를 입력하여 아까 생성해 놓은 docker container에 들어가 bash를 실행하도록 합니다.

    docker exec -i -t mysql_boot bash

     

    container 안에서 MySQL을 실행합니다.

    mysql -u dave -p

     

    password를 물어오는데 이전에 설정해놓은 pass를 입력하면 mysql console 창으로 들어갑니다.

     

     

    우선 show databases 로 현재 어떤 database가 있는지 확인해봅니다.

     

     

    우리는 springboot database를 사용하므로 use springboot를 입력하여 사용할 database를 선택합니다.

     

     

    show tables로 선택된 database에 어떤 table이 있는지 확인해봅니다.

    현재는 springboot database에 생성된 table이 없으므로 Empty set입니다.

     

     

    이제 만들어 놓은 application을 기동 해봅니다. Runner class의 내용들이 실행되면서 user table을 생성하고 row를 추가하게 될 것입니다.

     

    다시 show tables로 table 목록을 살펴보면 user table이 생성되어 있음을 확인할 수 있습니다.

     

     

    USER table에 row가 추가되었는지 select문을 실행해보면 추가된 것이 확인됩니다.

     

     

    참고
    SSL connection이 구성되지 않아 warnning message가 뜨는 경우는 다음의 두가지 방법을 사용하여 처리할 수 있습니다.
    1. application.properties file의 spring.datasource.url의 값에 ?useSSL=false를 붙여줍니다.
        (example) spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false

    2. trust store를 적용하여 SSL로 접속할 수 있도록 만들어줍니다. (참고: https://camel-it.tistory.com/27)

     

    댓글

Designed by Tistory.