ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mybatis
    STUDY/백엔드 2020. 12. 31. 10:01

    Mybatis란?

    - 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 Persistence Framework이다. Mybatis는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다. Mybatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.

     

    ※  Persistence Framework : 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합이다. JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있으며 안정적인 구동도 보장한다.

     

    - 특징

    • 쉬운 접근성과 코드의 간결함.
      • XML 형태로 서술된 JDBC 코드하고 생각해도 될 만큼 JDBC의 모든 기능을 대부분 제공한다.
      • 복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드를 유지할 수 있다.
      • 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.

     

    • SQL문과 프로그래밍 코드를 분리함
      • SQL에 변경이 있을 때마다 자바코드를 수정하거나 컴파일하지 않아도 된다.

     

    • 다양한 프로그래밍 언어로 구현이 가능하다.

     

     

    - 라이브러리 

    <!-- Mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.3</version>
    </dependency>

    <!-- Mysql Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.18</version>
    </dependency>

    ※ mybatis-spring-boot-starter 역할

    • 존재하는 DataSource 자동감지
    • SqlSeessionFactoryBean을 사용해서 해당 데이터소스를 전달하는 SqlSessionFactory의 객체를 생성하고 등록한다.
    • SqlSessionFactory을 이용해 SqlSessionTemplate의 객체를 생성하고 등록한다.
    • 매퍼들을 자동스캔한 뒤 스캔된 것들을 SqlSessionTemplate에 연결하고 Spring Context에 등록해서 당신의 빈들에 주입할 수 있게 해준다.(@MapperScan)
    • @MapperScan은 @Mapper로 등록된 것들을 스캔한다.

     

    - 주요 컴포넌트

     

    • SqlSessionFactoryBuilder 클래스 : build() 메소드를 통해 mybatis-config를 로딩하여 SqlSessionFactory 객체를 생성한다.
    • SqlSessionFactory 클래스 : SqlSession 객체에 대한 팩토리 객체다. 이 객체의 openSession() 이라는 메소드를 통해 SqlSession 객체를 얻을 수 있다.
    • SqlSession 클래스 : Mapper XML 에 등록된 SQL을 실행하기 위해 API 를 제공

     

     

    - 실습1

    • application.properties 설정
    #mysql 설정
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/project?serverTimezone=Asia/Seoul
    spring.datasource.username=user
    spring.datasource.password=passwd

    #mybatis 설정
    mybatis.type-aliases-package=com.example.dto
    mybatis.mapper-locations=mapper/*.xml
    • resources/mapper/*.xml (mapper 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.example.dao.HelloWorldMapper">
        <select id="selectHelloWorld" resultType="String">
            select word from testTable
        </select>
    </mapper>
    • Mapper Interface 파일 설정
    @Mapper
    public interface HelloWorldMapper {
        public String selectHelloWorld();
    }
    • Service 파일 설정
    @Service
    @Transactional
    public class HelloWorldService {
        @Autowired HelloWorldMapper helloWorldMapper;
        public String selectHelloWorld(){
            return helloWorldMapper.selectHelloWorld();
        }
    }
    • Controller 설정
    @RestController
    @RequestMapping("/")
    public class HelloWorldApiController {

        private Logger logger = LoggerFactory.getLogger(HelloWorldApiController.class);
        private HelloWorldService helloWorldService;

        public HelloWorldApiController(HelloWorldService helloWorldService){
            this.helloWorldService = helloWorldService;
        }

        @GetMapping
        public String printHelloWorld() {
            logger.info("Hello World");
            return helloWorldService.selectHelloWorld();
        }
    }

     

    참고

    dog-developers.tistory.com/25?category=850439

    mybatis.org/spring/ko/sqlsession.html#SqlSessionTemplate

    mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

    sjh836.tistory.com/127


    - 실습2

    • pom.xml 라이브러리 추가
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.7.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.12.RELEASE</version>
    </dependency>

    spring-jdbc를 추가하면 @EnableAutoConfiguration 어노테이션을 통해 DataSource에 대한 Bean을 별도로 등록하지 않아도 된다. DataSource의 설정은 application.properties 파일내에서 spring.datasource.* 와 같은 패턴으로 설정이 가능하다. 만약 별도의 DataSource Bean을 등록하면 application.properties 내의 spring.datasource.* 속성은 적용되지 않는다.

    • DatabaseConfig 설정
    @Configuration
    @MapperScan(basePackages="com.example.dao")
    @EnableTransactionManagement
    public class DatabaseConfig {

        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
            SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
            sqlSessionFactory.setDataSource((javax.sql.DataSource) dataSource);
            sqlSessionFactory.setTypeAliasesPackage("com.example.dto");
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            sqlSessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
            return sqlSessionFactory.getObject();
    }

        @Bean
        public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
            final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
            return sqlSessionTemplate;
        }
    }

    ※ 위와 같이 DatabaseConfig 파일을 만들면 application.properties에 설정한 TypeAliasesPackage, MapperLocations는 적용되지 않는다.

    • dto
    public class HelloWorld {
        private String word;
        public String getWord() { return word; }
        public void setWord(String word) { this.word = word; }
    }
    • dao
    @Repository
    @Mapper
    public interface HelloWorldMapper { public HelloWorld selectHelloWorld(); }
    • helloWorld.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.example.dao.HelloWorldMapper">
        <select id="selectHelloWorld" resultType="HelloWorld">
            select word from testTable
        </select>
    </mapper>
    • service
    @Service
    public class HelloWorldService {
        private HelloWorldMapper helloWorldMapper;

        public HelloWorldService(HelloWorldMapper helloWorldMapper) {
            this.helloWorldMapper = helloWorldMapper;
        }

        public String selectHelloWorld(){
            HelloWorld helloWorld = helloWorldMapper.selectHelloWorld();
            return helloWorld.getWord();
        }
    }
    • Controller
    @RestController
    @RequestMapping("/")
    public class HelloWorldApiController {

        private Logger logger = LoggerFactory.getLogger(HelloWorldApiController.class);
        private HelloWorldService helloWorldService;

        public HelloWorldApiController(HelloWorldService helloWorldService){
            this.helloWorldService = helloWorldService;
        }

        @GetMapping
        public String printHelloWorld() {
            logger.info("Hello World");
            return helloWorldService.selectHelloWorld();
        }
    }

     

    MyBatis 설정파일(DatabaseConfig.class)  - 데이터베이스의 접속 주소 정보나 Mapping 파일의 경로 등의 고정된 환경정보를 설정한다.
     SqlSessionFactoryBuilder  - MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다.
     SqlSessionFactory  - SqlSession을 생성한다.
     SqlSession  - 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다.
     - SqlSession오브젝트는 Thread-Safe 하지 않으므로 thread마다 필요에 따라 생성한다.
     mapping 파일(*.xml)  - SQL문과 OR Mapping을 설정한다.
     SqlSessionFactoryBean  - MyBatis 설정파일을 바탕으로 SqlSessionFactory를 생성한다.
     - Spring Bean으로 등록해야 한다.
     SqlSessionTemplate  - 핵심적인 역할을 하는 클래스로서 SQL실행이나 트랜잭션 관리를 실행한다.
     - SqlSession 인터페이스를 구현하며, Thread-Safe한다.
     - Spring Bean으로 등록해야 한다.

     

    참고

    shlee0882.tistory.com/205

    'STUDY > 백엔드' 카테고리의 다른 글

    @ControllerAdvice / @RestControllerAdvice  (0) 2021.02.03
    Bean  (0) 2021.01.05
    Server Log  (0) 2020.12.28
    Apache Spring boot(내부 tomcat) 연동  (0) 2020.12.24
    TC(Test Case) & JUnit  (0) 2020.12.18
Designed by Tistory.