스프링부트 mysql 의존성 - seupeulingbuteu mysql uijonseong

📢 들어가기 전에

  • 이번 포스팅에선 Spring Boot + MyBatis + MySql 연동 방법에 대해 알아본다.
  • Intellij Community 에서 진행했다. 다른 IDE를 써도 상관 없다.
  • Spring Boot 가 설치된 환경에서 진행했다. Spring Boot 설치법은 지난 포스팅을 참조. (Nuxt.js + Spring Boot 연동법 포스팅이지만 Spring Boot 설치에 대해서도 다루고 있다.)

🧱 MySQL, MyBatis Dependency 주입

pom.xml의 dependencies에 아래 코드를 추가하자.

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
  • mysql-connector-java
    • JAVA 가 MySQL과 통신할 수 있게하는 드라이버
  • mybatis-spring-boot-starter
    • Spring Boot 용 Mybatis

위 의존성에 대한 버전은 Maven Repository에서 확인할 수 있다.
원하는 의존성을 검색 후 최신, 혹은 보편적인 버전의 의존성 주입 코드를 복사해 붙여 넣으면 된다.

🧱 MySQL 연결 테스트

DB 연결에 앞서 DB가 제대로 연결될지 테스트 먼저 해보자.

테스트 코드를 작성하기 위해 pom.xml에 아래 dependency를 추가해주자.

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
  • spring-boot-starter-test
    • Spring은 위와 같은 spring-boot-starter-test 의존성을 통해 TEST 기능을 제공한다.
    • 위 코드를 추가하면 JUnit 등을 활용할 수 있다.
    • 자세히
src/test/java/dbTest/MySQLConnectionTest.java

src 폴더 내에 test 디렉토리를 생성하고,
test 폴더 내에 package를 만든 후 자바 파일을 생성하자.
나는 MySQLConnectionTest.java라는 파일을 만들어 줬다.

package dbTest; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; public class MySQLConnectionTest { // MySQL Connector 의 클래스. DB 연결 드라이버 정의 private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; // DB 경로 private static final String URL = "jdbc:mysql://localhost:3306/데이터베이스?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false"; private static final String USER = "유저 ID"; private static final String PASSWORD = "비밀번호"; @Test public void testConnection() throws Exception { // DBMS에게 DB 연결 드라이버의 위치를 알려주기 위한 메소드 Class.forName(DRIVER); try { Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); System.out.println(connection); } catch (Exception e) { e.printStackTrace(); } } }

MySQLConnectionTest.java에 위와 같은 코드를 입력해줬다.
try 부분을 보면 알 수 있듯이, DB 커넥션이 제대로 생성되었는지를 출력해 확인해보는 과정이다.

  • allowPublicKeyRetrieval
    • 클라이언트 옵션을 추가 하여 클라이언트가 서버에서 자동으로 공개 키를 요청할 수 있도록 한다.
    • default는 false
    • MySQL 8.0 이상은 이를 true로 지정하지 않을 시 public key retrieval is not allowed 에러가 발생할 수 있다.
  • userSSL
    • default는 `true
    • false로 지정 시 SSL 사용을 막을 수 있다.
    • 하지만 개발, 혹은 테스트 중에서만 비활성화 시키는 걸 추천
    • 배포 시엔 useSSL를 false로 지정하기보단 SSL을 설정해주면 된다.
결과 로그

TEST 코드를 실행시켜보면 com.mysql.cj.jdbc.ConnectionImpl@~라는 문구가 뜰 것이다.
DB 연결에 성공했다는 의미다! 🎉

🧱 Spring Boot + MyBatis + MySQL 연결

DB 연결 테스트를 완료했으니 본격적으로 DB 연결을 해보자

/src/main/resources/ 내에 application.properties 파일을 생성하여 DB Connection 을 위한 DB 정보를 작성하자.

테스트에서 입력했던 정보와 동일하면 된다.

🚀 application.properties
어플리케이션에서 사용하는 여러가지 설정 값들을 어플리케이션의 밖이나 안에 정의할 수 있는 기능
이 파일은 스프링 부트가 어플리케이션을 구동할 때 자동으로 로딩하는 파일이다.
key - value 형식으로 값을 정의하면 어플리케이션에서 참조하여 사용할 수 있다.
값을 참조할 땐 @Value 등을 사용하면 된다.

spring.datasource.username=MySQL 유저 이름 spring.datasource.password=MySQL 비밀번호 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/데이터베이스명?serverTimezone=UTC&allowPublicKeyRetrieval=true

src/main/resources/application.properties

이제 Datasource 설정을 해줄 것이다.

  • Datasource
    • 커넥션 풀의 커넥션을 관리하기 위한 객체
    • 이 객체를 통해 커넥션을 획득 반납 등의 작업을 한다.

🚀 커넥션 풀
기존 JDBC는 클라이언트로부터 요청이 있을때마다 DB 서버에 연결하기 위해 Connection 객체를 얻음 (좋지 않는 성능이었음)
기존의 불편함을 해결하기 위한 것.
Connection 객체를 요청때마다 생성하는 것이 아니라 웹 어플리케이션이 서비스 되기 전에 서버에서 미리 생성하여 준비한 다음 필요할 때 가져다 쓰게 한다.

src/main/java/com/project/mong/config/DataSourceConfig.java

src/main/java/패키지/config 내에 DataSourceConfig.java를 생성하고 아래와 같이 작성한다.

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

src/main/java/com/project/mong/config/DataSourceConfig.java

  • @Configurtion
    • 어노테이션 기반 환경 구성을 도움
    • 이 어노테이션을 붙이고 클래스 내에 하나 이상의 @Bean 메소드를 구현하면 스프링 컨테이너가 Bean 정의를 생성하고 런타임 시 그 Bean 들의 요청을 처리할 것을 선언한다.
  • @ConfigurationProperties
    • 앞서 설명했던 외부 설정 파일(application.properties)을 참조할 때 쓰는 방법 중 하나이다.(ex. @Value)
    • application.properties의 key를 같은 값으로 시작하게 구현해두면(접두어), 이를 묶어서 Bean으로 등록할 수 있다. (여기선 spring.datasource로 구현해뒀음)
    • 즉, 위 코드처럼 prefix = "spring.datasource" 라고 하면 spring.datasource가 접두어로 붙어 있는 application.properties 값들을 참조할 수 있다.
    • 이 어노테이션을 @Bean이 붙은 메소드에 붙여주면 써드파티 컴포넌트(여기선 Datasource) 에 바인딩을 할 수 있다.
    • 즉, Datasource가 application.properties에 spring.datasource 로 시작되는 값들을 참조해서 쓴다는 것이다.

🚀 써드파티 컴포넌트
3rd Party
프로그래밍을 도와주는 플러그인이나 라이브러리
현재 팀 인원 외의 제 3자가 개발한 도구

참고로 application.properties와 ConfigurationProperties 조합을 쓰지 않는다면 아래와 같이 구현해줄 수도 있다.

@Bean public DataSource dataSource() { return DataSourceBuilder .create() .username("MySql 유저 이름") .password("MySql 비밀번호") .url("MySql 경로") .driverClassName("com.mysql.cj.jdbc.Driver") .build(); }

이제 앞서 설정해준 DataSource를 참조해 MyBatis와 Mysql을 연결하는 작업을 할 것이다.

src/main/java/패키지/config 내에 MySQLConfig.java를 생성하고 아래와 같이 작성한다.

@Configuration @MapperScan ("com.project.mong.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(); } }

src/main/java/com/project/mong/config/MySQLConfig.java

  • @MapperScan
    • 연결할 DAO 인터페이스를 담은 패키지를 등록한다.
    • @MapperScan(basePackages = {"com.project.mong.dao"}) 라고 정의할 수도 있다.
  • SqlSessionFactory
    • MySql과 MyBatis를 연결해주는 객체
  • SqlSessionFactoryBean
    SqlSessionFactory를 생성해주는 클래스
  • setDataSource()
    • 앞서 정의한 datasource를 참조하게 한다.
  • PathMatchingResourcePatternResolver
    • resource 위치 검색을 돕는 Spring class
    • getResources() 로 경로 검색을 해 SqlSessionFactory에 mapper 와 mybatis-config를 set해준다.
  • classpath
    • resource 폴더를 나타냄

여기서 언급한 mybatis-config는 말 그대로 Mybatis 설정 파일이다.
없어도 괜찮은 파일이지만 Mybatis 설정을 위해 생성해주는 편이 좋다.

나는 resource 폴더 아래에 mybatis-config.xml을 생성하고 아래와 같이 입력해줬다.

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

src/main/resources/mybatis-config.xml

  • mapUnderscoreToCamelCase
    • Mybatis의 DTO(VO) 리턴 값을 Camel Case로 변환시킴
  • callSettersOnNulls
    • ResultType 이 HashMap 일 때 값이 null 인 것이 누락되어 나오는데, null을 포함시켜 return 하게 한다.

이 외에도 여러 세팅을 추가시킬 수 있다.

🧱 Spring Boot + MyBatis + MySQL 연결 확인 예제

MySQL 와 MyBatis가 제대로 연결되었는지 확인해보자
설정해 준 데이터베이스 내에 테이블을 create 하고 다음과 같이 값을 넣어줬다.

create table DB_TEST ( title varchar(20), name varchar(20) ); insert into DB_TEST values ( 'DB 연결 테스트 입니다.', 'TEST' );
MySQL DB 결과

DB에 값이 올바르게 들어간 것을 확인할 수 있었다.
이제 이 값을 불러와 출력하는 코드를 짜 줄것이다.

public class TestDTO { String title; String name; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

/src/main/java/패키지/dto/TestDTO.java

가져올 DTO(컬럼)을 작성해주자
DTO 는 Data Transfer Object의 줄임말로 컨트롤러나 매퍼로 주고받는 데이터를 담는 객체를 말한다.
DB 내 어떤 데이터를 가져올 것이라고 정의하는 것이다.
getter를 빠뜨리면 가져오는 과정에서 에러가 생기니 getter, setter를 꼭 작성해주자
lombok를 써도 상관 없다.

다음으로 가져올 MyBatis 쿼리문을 작성해준다
MyBatis는 아래와 같이 쿼리문을 직관적으로 볼 수 있는게 장점이다.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "//mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.project.mong.dao.TestDAO"> <select id="getTestData" resultType="com.project.mong.dto.TestDTO"> select title, name from DB_TEST </select> </mapper>

src/main/resources/mappers/TestMapper.xml

MyBatis mapper 파일은 다른 자바 파일과 달리 resources 폴더 내에 위치한다
이는 우리가 MySQLConfig 파일에서 이 경로에 mapper 파일을 넣겠다고 설정해 줬었다.

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

여기서 classpath 는 /src/main/resources를 의미하는데, Interllij 같은 경우
ctrl + shift + alt+ s 또는 File - Project Structure에서
Modules - Sources 부분에서 쉽게 설정 가능하다.
classpath로 두고자하는 파일을 선택 후 Mark as: 를 Resources로 적용해주면 된다.
아마 기본적으로 /src/main/resources가 classpath로 설정되어 있을 것이다.

위 코드에서 주목해야할 점은 namespace이다.
namespace엔 이 mapper 파일과 연동될 DAO를 선언해주면 된다.
DAO는 Data Access Object의 약자로, DB에 접근할 인터페이스들이 선언될 것이다.

package com.project.mong.dao; import com.project.mong.dto.TestDTO; import java.util.List; public interface TestDAO { List<TestDTO> getTestData(); }

src/main/java/com/project/mong/dao/TestDAO.java

List<TesDTO> 을 반환하는 메소드를 짜줬다.
이는 인터페이스 내에 정의되어 mapper와 연결되어 있으므로 mapper의 getTestData와 메소드 명이
동일해야한다.

다음은 이 메소드를 불러와 결과를 출력하는 컨트롤러를 짜줄 것이다.

package com.project.mong.controller; import com.project.mong.dao.TestDAO; import com.project.mong.dto.TestDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/api") public class DBConnectTestCtrl { @Autowired private TestDAO testDAO; @GetMapping("/hello") public List<TestDTO> HelloWorld() { return testDAO.getTestData(); } }

src/main/java/com/project/mong/controller/DBConnectTestCtrl.java

@Autowired로 DAO를 주입하고
List<TestDTO>를 반환하는 메소드를 짜줬다. 이는 /api/hello로 접근하면 실행하게 될 것이다.

localhos:8080/api/hello 결과화면

DB 데이터가 올바르게 출력되는 것을 볼수 있었다!🎉

지금까지 Spring Boot + MyBatis + MySQL을 연결하는 방법에 대해 알아보았다.
피드백 댓글은 언제나 환영입니다! 👼

Toplist

최신 우편물

태그