스프링부트(spring boot)에서 mybatis 로 SQL 실행하기

스프링부트(spring boot)와 데이터베이스를 연결하는 방법은 정말 여러가지인데, sql 자체를 그대로 활용해서 사용하고자 한다면 mybatis 만한 ORM 프레임워크가 없다고 생각한다. spring boot 프로젝트 생성시에 디펜던시는 아래 2개를 추가해주는데, 이 포스팅에서는 PostgreSQL 을 사용했지만, 본인이 사용하는 DB의 Driver 로 변경해서 받으면 된다.

- MyBatis Framework
- PostgreSQL Driver

postgresql JDBC 연결

로컬PC에 DB를 설치해야 할텐데, 직접 pc에 설치하는 것보다는 docker 이미지로 구동하는 걸 선호하는 편이다. 해당 방법은 여기를 클릭한다. 여기서는 postgreSQL DB와 연결할 예정이다. spring boot 에서 DB와 연결하고 싶다면, 아래와 같이 데이터소스 정보를 셋팅하면 된다.

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass

위에서 보듯이 기본적으로 3가지를 셋팅하면 되는데, 가장 먼저 URL (Uniform Resource Locator)을 만들어 입력해야 한다. postgresql URL 관련 문서를 보면, 아래와 같이 URL 정보를 정의하면 된다.

jdbc:postgresql:database
jdbc:postgresql:/
jdbc:postgresql://host/database
jdbc:postgresql://host/
jdbc:postgresql://host:port/database
jdbc:postgresql://host:port/

여기서, 보통은 jdbc:postgresql://localhost:5432/mydb 와 같이 localhost로 셋팅하면 되는데, 내경우 docker 이미지로 postgresql 을 실행하다보니, 동일 docker network 로 연결하고, docker 컨테이너 이름인 my-postgres로 셋팅했다. 최종 셋팅한 설정은 아래 3개이다.

# application.properties
spring.datasource.url=jdbc:postgresql://my-postgres:5432/mydb 
spring.datasource.username=postgres
spring.datasource.password=1111

mybatis 로 DB에 연결하기

JDBC 설정이 되었다면, 이제 mybatis 연결작업만 하면 된다. 아래와 같은 순서로 파일을 만들어가며 설정작업을 진행할 것이다.

mybatis 연결 작업 순서
1. src/main/resources/mybatis-config.xml
2. src/main/resources/mapper/MemberMapper.xml
3. src/main/java/com/creart/app01/domain/Member.java
4. src/main/java/com/creart/app01/mapper/MemberMapper.java

최종 파일 위치는 아래의 그림을 참고한다.

mybatis-config.xml 파일 생성하기

mybatis 를 spring boot 에 연결하여 사용하기 위해, xml 파일을 만들어 설정해야 한다. application.properties 파일과 동일한 위치에 mybatis-config.xml 파일을 만든다.

파일위치 : src/main/resources/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>
    <typeAliases>
        <package name="com.creart.app01.domain"/>
    </typeAliases>
    <mappers>
        <mapper resource="mapper/MemberMapper.xml"/>
    </mappers>
</configuration>

그리고 application.properties 파일에 mybatis-config.xml 파일의 위치를 설정한다.

# mybatis 설정파일 위치설정.
mybatis.config-location=classpath:mybatis-config.xml

MemberMapper.xml 생성하기

MemberMapper.xml 파일은 실제 실행될 쿼리가 정의되어 있는 파일이다. 꼭 저이름으로 할 필요는 없고, 모델명Mapper.xml 형태로 보통 정의된다. namespace는 자바 mapper 클래스를 정의하며, 해당 클래스는 자바환경에서 쉽게 해당 쿼리로 이어지게끔 다리역할을 하게 된다.

파일위치 : src/main/resources/mapper/MemberMapper.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.creart.app01.mapper.MemberMapper">
    <select id="selectCityById" resultType="Member">
        select id, email, name from user where id = #{id}
    </select>
</mapper>

Member.java 생성하기.

읽고 싶은 테이블 레이아웃과 동일하게 필드 구성을 하고, getter, setter 함수 및 toString() 함수를 오버라이딩 해서 재정의한다.

파일위치 : src/main/java/com/creart/app01/domain/Member.java
package com.creart.app01.domain;

public class Member {

    private int id;
    private String email;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", email='" + email + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

MemberMapper.java 생성하기

xml 파일로도 mapper 가 있지만, 여기서는 java 인터페이스로 mapper 를 하나 더 생성한다. 역할은 보다시피, 자바환경에서 메소드로서 쿼리를 실행 시킬 수 있도록 한번 감싸는 역할을 한다. 중요한건, 메소드명을 xml 파일의 쿼리 id와 동일하게 셋팅해야 한다.

파일위치 : src/main/java/com/creart/app01/mapper/MemberMapper.java
package com.creart.app01.mapper;

import com.creart.app01.domain.Member;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberMapper {
    Member selectCityById(int id);
}

CommandLineRunner를 이용한 쿼리 실행

spring boot 프로젝트를 만들면, main 메소드가 포함된 클래스가 하나 기본으로 생성되어 있다. 거기에다, CommandLineRunner 인터페이스를 이용해서, 간단하게 테이블 select 해서 로그를 찍어보기로 한다. MemberMapper 클래스를 @Autowired 해서 객체를 주입하고, 그 객체로 select 쿼리를 실행한다. 자세한 사용은 spring 웹사이트를 참고한다.

package com.creart.app01;

import com.creart.app01.mapper.MemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App01Application implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(App01Application.class, args);
	}

	@Autowired
	private MemberMapper memberMapper;

	@Override
	public void run(String... args) throws Exception {
		System.out.println(this.memberMapper.selectCityById(1));
	}
}

서버를 실행하면, run 메소드가 실행되면서, select 결과를 로그상에서 볼 수 있다.

INFO 1273 --- [  restartedMain] com.creart.app01.App01Application        : Started App01Application in 4.284 seconds (process running for 4.772)
INFO 1273 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
INFO 1273 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@47f303ae
INFO 1273 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
Member{id=1, email='user@gmail.com', name='user_name'}

더 보면 좋을 글들