[SpringBoot] MyBatis 연동하기

    SpringBoot, MyBatis 연동하기

     

     

     

      준비된 것

     PC에 설치된 DB와 개발환경 정도가 필요하다.

    개인적으로 MariaDB가 친숙하므로 MariaDB를 사용하도록 했다.

     

    <dependency>
       <groupId>org.mariadb.jdbc</groupId>
       <artifactId>mariadb-java-client</artifactId>
       <version>2.7.4</version>
    </dependency>
    
    <!-- mybatis-->
    <dependency>
       <groupId>org.mybatis.spring.boot</groupId>
       <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>2.2.2</version>
    </dependency>

    Maven 방식 사용, pom.xml에 연동

    설치 후 Maven을 통해 lib가 설치된 것을 반드시 확인해야 한다.

    자동으로 설치되면 좋겠지만, 등록만 하고 설치가 안돼서 되지 않는 경우가 발생하기도 한다.

     

     

      기본 설정

    #MyBatis 설정
    mybatis.type-aliases-package=com.union.construction_api.Domain
    #SQL 문법 있는 위치.
    mybatis.mapper-locations=mapper/**.xml
    
    
    #db에 대한 정보
    #사용할 DB://IP:PORT/데이터베이스??한글 설정
    spring.datasource.url=jdbc:mariadb://localhost:3307/test_m??characterEncoding=UTF-8
    #DB호출시 필요 이름, 인터넷에 검색된다.
    spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
    #DataBase 접근 권한이 있는 ID, PW
    spring.datasource.username=root
    spring.datasource.password=root!!

    서식을 복사하여, application.properties에 저장한다.

     위의 내용을 properties에 저장하도록 한다.

    별 다른 설정 없이, SpringBoot의 내장된 properties가 정보를 받아들인다.

     

    위의 과정을 거쳤다면, 등록한 정보가 일치하는지 여부를 먼저 확인하는 것도 좋다.

     

    @Test
    void DB연결확인() {
        try (
                Connection con = DriverManager.getConnection(
                        "jdbc:mariadb://localhost:3307/test_m??characterEncoding=UTF-8",
                        "root",
                        "root!!"
                ))
        {
            System.out.println(con);
        }
        catch(Exception e) {
    
        }
    }

    어떤 방식을 사용하든간에, 해당 Code의 동작 여부를 판단하면 된다.

    어떤 방식을 사용하든 상관은 없다.

    Spring에는 Test 기능이 있기 때문에, Test를 이용한 것일 뿐, try문의 동작에 대해 Error가 발생하지 않는다면 Java와 DB 간의 연결이 원활하다는 것을 알 수 있다.

     

     

     

      연결방식

     MyBatis는 Spring부터 사용해본 입장으로 정말 많은 방식이 존재했다.

    xml 방식과 Java의 Bean을 이용해 연결하는 방식.

     

    @configuration를 이용해서 연결하는 방식도 존재한다.

    이는 각자 편한 방식으로 진행하면 되고, 필자는 Annotaion 중, @Autowired 방식이 매우 선호한다.

    연결 방식이 정말 간결해서 추후 추가적인 작업이 매우 간단하다는? 장점이 있다.

     

    다만, 너무 자동으로 연결되는 탓에 문제가 발생된다면 어디 문제인지 고생이 따를 수가 있다.

     

    Java의 기초, MVC 패턴

    DB와 원활한 작업을 위해 mvc 패턴을 고수했다.

    Controller, Service, Mapper로 구분했으며 흔히 말하는 VO, Bean, DTO 등 비슷한 역할을 수행하는 domain으로 되어있다.

     

     

    @Controller

    html에서 호출하는 url을 구분하는 곳이다.

    url 호출에 따른 적합한 동작이 되도록 선정한다.

    보통 Controller에서 작업하기도 하고 이를 Service로 옮긴다.

     

    @Controller
    public class MainController {
    
    	@Autowired
        MainService mainService;
    
        @GetMapping("/test123")
        public void Test_Service() {
    
            try {
                System.out.println("test");
                List<TestBean> list = mainService.TEST_SELECT();
    
                for(TestBean i : list) {
                    System.out.println(i.toString());
                }
    
            }
            catch (Exception e) {
    
            }
    
        }
    }

    Controller이다.

     

    @Service

    Controller에서 선정된 작업을 처리하는 공간이다.

    Controller에서 작업할 수도 있지만 Serivce에서 작업하는 것이 원래 만들어진 이유이기도 하다.

    다만, 개발환경에 따라서 Service의 존재는 없을 수도 있다.

     

    ◆ Interface

    public interface MainService {
    
        //Mapper Test
        List<TestBean> TEST_SELECT() throws Exception;
    
        //Test
        List<TestBean> Test2() throws  Exception;
    }

    Service 부분은 Interface와 Class로 나눈다.

    ◆ Class

    @Service
    public class MainServiceImpl implements MainService {
    
        @Autowired
        MainMapper mainMapper;
    
        @Override
        public List<TestBean> TEST_SELECT() throws Exception{
            return mainMapper.TESTSELECT();
        }
    
        @Override
        public List<TestBean> Test2() throws  Exception {
            return mainMapper.Test2();
        }
    }

    Service에서 Mapper로 연결한다.

     

    @Mapper

    JAVA의 DAO를 수행하는 공간이다.

    MyBatis(ibatis) 라이브러리를 소유하고 있다면 만들 수 있다.

     

    Java에 필요한 db의 정보를 호출하기 위해 필요한 class이며, 흔히 SQL을 저장 혹은 연결하는 것을 담당한다.

     

     

    ◆ Interface

    @Mapper
    public interface MainMapper {
    
        List<TestBean> TESTSELECT() throws Exception;
    
        @Select("SELECT NAME FROM TEST LIMIT 1")
        List<TestBean> Test2();
    }

    Mapper

     

    Mapper은 사용하는 방식이 크게 두 가지로 나뉜다.

     

    1. 두 번째 문법처럼 SQL문을 Interface에 모두 적용하는 방식이다.

     

    따로 연결할 것도 없이 SELECT문을 호출할 수 있게 도와준다.

    위의 사진 Test2() 메소드 위에 선언된 Annotation이 메소드 실행 시 실행되는 sql문이다.

     

     

    2. Mapper와 xml을 구분 짓는 방식이다

    해당 Interface에 대한 내용은 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.union.construction_api.Mapper.MainMapper">
    
    
        <select id="TESTSELECT" resultType="com.union.construction_api.Domain.TestBean">
            SELECT T_NAME FROM TEST
        </select>
    </mapper>

    SQL 호출

    Mapper에 저장한 것처럼 sql을 xml에 저장하는 방식이다.

    id는 interface에 저장된 메서드 명과 연결된다. 

     

    xml의 위치는 이것으로 확인할 수 있다.

    xml의 위치는 시작 시 설정한 값으로 설정할 수 있다.

    아무것도 없을 시, resources가 경로로 잡혀있다.

     

     

    만약, xml만 위치를 찾지 못하는 문제가 발생한다면 경로 설정에 문제가 있을 수 있다.

     

    설명 안 한 제일 위의 Domain은 xml에서 get, set 사용할 domain 이용 시 경로 설정을 무시해주는 설정을 가지고 있다.

     

     

     

      마무리

     간단한 내용이지만, 안 되면 진짜 막막하다.

    Code는 별로 쓴 것도 없고, 딱히 설정을 건드리지도 않는다.

     

    이 모든 것이 SpringBoot가 내장된 설정이 자동으로 연결해주기 때문이다.

     

    Spring이었다면, sqlSession 설정하고 재밌는 짓을 벌였겠지만, 참 황당하게 Boot는 이러한 설정이 없다.

     

     

    그래서 한 번에 되면 운 좋고, 안 된다면 그냥 다시 하는 게 마음에 이롭다.

     

    다른 분들의 설정도 많이 지켜봤지만 딱히? 이유 없이 더 이상 설정을 건들 필요는 없다.단지, 설정할 때 무언가를 더 추가해야 한다면 그것은 이제 그때의 이야기이다.

     

     

    반응형

    댓글

    Designed by JB FACTORY