본문 바로가기
project

Spring Boot + Mybatis

by 스르나 2021. 5. 19.
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
</dependency>

이글은 스프링 부트에서 마이바티스를 사용하는 방법을 설명한 글이다.

 

기존의 스프링 프레임워크와 마이바티스는 xml기반의 설정인데 스프링 부트는 자바설정이 가능하고, 쿼리문도 xml에 넣지 않고 자바 코드에 넣을 수 있다.

 

스펙

 

자바 8

스프링 부트 2.x.x

mysql 8

IDE intellij

build tool: maven

 

 

설명

우선 먼저 마이바티스는 스프링 부트에서 mybatis-spring-boot-starter라는 의존성을 추가해서 사용할 수 있다.

 

Maven

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.4</version>
</dependency>

당연히 자신의 DB에 맞는 JDBC도 의존성에 추가를 해줘야 한다.

 

<!--MYSQL-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>

 

maven 전체 dependency

 <dependencies>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

 

application.properties

이렇게 의존성을 추가해준 다음 이제는 JDBC에 필요한 url, id, password등을 application.properties에 추가해 주자

 

## application.properties

spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/
spring.datasource.hikari.password=root # 본인의 비밀번호
spring.datasource.hikari.username=root # 본인의 아이디
spring.datasource.hikari.driver-class-name=com.mysql.jdbc.Driver

 

url부분에서 3306/ 다음에 원하는 스키마네임을 적을 수 있다.

 

스키마

만약 동적으로 스키마를 변경해야 할 필요가 있다면 스키마를 application.properties에 적지않고 위처럼 구성하면 된다.(동적으로 스키마를 변경하는 것은 뒤에서 설명하겠다)

 

 

Java Config

다음으로는 mybatis와 jdbc의 설정을 자바로 설정하는 방법이다.

 

디렉토리 구조

본인의 설정을 위해 config 패키지를 만들고 그아래 DbConfig라는 클래스를 만들었다.

 

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan("com.example.demo.mapper") // 마이바티스의 메퍼를 탐색
public class DbConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
        return new HikariDataSource(hikariConfig());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        try {
            SqlSessionFactory factory=sqlSessionFactoryBean.getObject();
            factory.getConfiguration().setMapUnderscoreToCamelCase(true);
            return factory;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

여기서 다른것은 스프링의 sqlSessionFactory를 위한 설정이라는 것을 읽어보면 알 수 있는 내용이지만 DbConfig위의 MapperScan이라는 어노테이션은 처음 봤을 것이다.

 

기존의 xml방식은 쿼리문을 xml에 넣어서 사용했지만 이제는 그렇게 하지 않고 자바쿼리문을 넣을 수 있다. 이 쿼리문이 들어있는 자바 클래스가 모여있는 곳들을 scan하는 것이 MapperScan의 역할이다. 위에 디렉토리 구조에도 mapper라는 패키지가 있는데 해당 패키지에 쿼리문이 들어있다.

 

Mapper Class

import com.example.demo.dto.EmployeeDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface EmployeeMapper {

    @Select("Select * from ${schema}.employees where emp_no=${empNo}")
    EmployeeDto getEmployeeByNo(@Param("schema") String schema, @Param("empNo") int empNo);

    @Select("select * from ${schema}.employees")
    List<EmployeeDto> getEmployeeAll(@Param("schema") String schema);
}

이 클래스가 바로 쿼리문을 넣은 클래스다. 보면 @Select 어노테이션에 쿼리문이 들어 있다.

 

그리고 위에서 스키마를 동적으로 바꾸는 방법을 설명하겠다고 했는데 방법은 여기에 나와 있다. 보면 from절에 ${}으로 감싼 문자열이 보일것이고 메소드의 파리미터로 준 값이 보일 것이다. 해당 파라미터가 쿼리문의 ${}에 들어가서 스키마 네임으로 사용되는 것이다.

 

※ Mybatis에서 $, #의 차이는 $같은 경우 값에 따옴표가 붙지 않고 #은 따옴표가 붙어서 들어간다.그렇기 때문에 스키마의 이름에는 $를 사용해야한다.

 

 

Mapper 사용

 

import com.example.demo.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class ArppRunner implements ApplicationRunner {

    @Autowired
    EmployeeMapper mapper;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(mapper.getEmployeeByNo("employees", 10001));

        mapper.getEmployeeAll("employees").forEach(System.out::println);
    }
}

 

Mapper는 스프링 빈처럼 바로 사용이 가능하다.

'project' 카테고리의 다른 글

도커+스프링+리액트+mysql  (0) 2021.01.15
Spring Boot+Jsp+Hello World 까지  (0) 2019.09.17