MyBatis

[MyBatis] 01. 소개 및 환경 설정

  • -
반응형

MyBatis

앞으로 우리가 사용할 MyBatis에 대해 간략히 알아보자.

소개

MyBatis란 SQL을 편하게 작성할 수 있도록 SQL-Object 매핑을 지원하는 Persistence Framework으로 주요 특징은 다음과 같다.

  • 기본적으로 PreparedStatement를 사용하기 때문에 SQL 삽입 공격에 대해 안전하다.
  • ResultSet의 내용을 DTO나 컬렉션에 저장하기 위한 코드가 필요 없다.
  • 일반적으로 XML에서 SQL 쿼리를 작성한다.
  • 프로그램 코드와 SQL의 분리로 코드가 간결해지고 유지 보수성이 향상된다.

MyBatis에 대해서는 아래 사이트에서 한글로 자세한 document를 제공하므로 즐겨 찾기에 추가하고 자주 살펴보기를 권한다.

 

 

MyBatis – 마이바티스 3 | 소개

마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 ��

mybatis.org

 

mybatis-spring –

 

mybatis-spring –

시작하기 이 장은 마이바티스 스프링 연동모듈을 설치하고 셋팅하는 방법에 대해 간단히 보여준다. 그리고 트랜잭션을 사용하는 간단한 애플리케이션을 만드는 방법까지 다룰 것이다. 설치 마

mybatis.org

 

기본 구조

MyBatis는 다음의 구조를 갖는다.

  • mybatis-config.xml
    • MyBatis 동작에 대한 설정을 담는 파일
    • Spring Boot과 연동되면서 application.properties에서도 동일한 내용을 설정할 수 있다.
  • mapper.xml
    • xml로 SQL 쿼리를 정의해서 등록하며 파라미터 및 결과에 대한 매핑을 처리한다.
    • 일반적으로 테이블당 하나의 mapper.xml을 작성한다.

mybatis-config에서는 여러 mapper 들에 정의된 sql들을 로딩해서 SQL map이라는 것을 구성하는데 이를 mapped statement라고 한다. 이 문장을 호출할 때 파라미터로 JavaBeans, java.util.Map, primitive, String 가 전달될 수 있고 호출의 결과로도 동일한 타입을 받을 수 있다.

 

실습 환경 준비

이번 실습에서는 MySql의 기본 schema인 world를 이용한다. 이에 대한 설치 안내는 별도로 하지 않으므로 개별적으로 준비하기 바란다.

 

프로젝트 생성

MyBatis와 MySql에 대한 라이브러리를 추가로 설치해준다.

 

application.properties

MyBatis를 사용하겠다는 선언만으로 MybatisAutoConfiguration이 동작하고 DataSource 생성에 대한 환경이 필요하다. application.properties에 아래와 같이 DataSource 생성에 관한 설정을 추가하자.

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/world?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

 

또한 전통적으로 mybatis-config.xml에서 할 설정들도 application.properties에서 처리할 수 있다.

# Mybatis 관련 설정
# MyBatis에서 쿼리에 매핑되는 파라미터에 NULL이 있을 경우 처리
mybatis.configuration.jdbc-type-for-null=NULL

# DTO가 있는 곳을 지정해서 mapper에서 fully qualified name을 사용하지 않고 클래스만 사용 가능
mybatis.type-aliases-package=com.eshome.db.model.dto

# 깊이에 상관 없이 /mappers의 모든 하위 경로에 있는 모든 xml 문서를 사용한다.
mybatis.mapper-locations=classpath:/mappers/**/*.xml

# 또는 전통적인 mybatis-config.xml 파일이 있다면 위치를 지정할 수도 있다.
#mybatis.config-location=classpath:/mybatis-config.xml

 

설정 결과 필요한 빈 생성 확인

이제까지 설정이 완료되었다면 DataSource와 MyBatis를 사용하기 위한 SqlSessionTemplate 빈이 생성되어야 한다. 아래 단위테스트가 잘 통과하는지 테스트해보자.

package com.eshome.db;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;

@SpringBootTest
@Slf4j
public class BeanCreationTest {

    @Autowired
    DataSource ds;

    @Autowired
    SqlSessionTemplate template;

    @Test
    public void beanTest() throws Exception {
        assertNotNull(ds);
        log.trace("connection: {}", ds.getClass().getName());
        HikariDataSource hds = (HikariDataSource) ds;
        log.trace("connection: {}", hds.getConnection().toString());

        assertNotNull(template);
    }
}

 

실행 결과 제대로 Connection을 확인할 수 있어야 한다.

17:18:07 [TRACE] [c.e.d.BeanCreationTest.beanTest- 25] > connection: com.zaxxer.hikari.HikariDataSource
17:18:07 [ INFO] [c.z.h.HikariDataSource.getConnection-110] > HikariPool-1 - Starting...
17:18:09 [ INFO] [c.z.h.HikariDataSource.getConnection-123] > HikariPool-1 - Start completed.
17:18:09 [TRACE] [c.e.d.BeanCreationTest.beanTest- 27] > connection: HikariProxyConnection@32838705 wrapping com.mysql.cj.jdbc.ConnectionImpl@26a2f7f9
17:18:09 [ INFO] [c.z.h.HikariDataSource.close-350] > HikariPool-1 - Shutdown initiated...
17:18:09 [ INFO] [c.z.h.HikariDataSource.close-352] > HikariPool-1 - Shutdown completed.

 

DTO 작성

사용할 테이블은 Country와 City 이다. 이 두 테이블의 데이터를 가지고 다닐 DTO 클래스를 작성해보자.

 

package com.eshome.db.model.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
public class Country {
    @NonNull
    private String code;
    @NonNull
    private String name;
    @NonNull
    private String continent;
    private String region = "";
    private Double surfaceArea = 0.0;
    private Integer indepYear;
    private Long population = 0L;
    private Double lifeExpectancy;
    private Double GNP;
    private Double GNPOld;
    private String localName = "";
    private String governmentForm = "";
    private String headOfState;
    private Integer capital;
    private String code2 = "";
}

 

package com.eshome.db.model.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
public class City {
    private Integer id;
    @NonNull
    private String name;
    @NonNull
    private String countryCode;

    private String district;
    private Integer population;
    
    public City(@NonNull String name, @NonNull String countryCode, String district, Integer population) {
        this.name = name;
        this.countryCode = countryCode;
        this.district = district;
        this.population = population;
    }
}

 

Repo 클래스 생성

package com.eshome.db.model.repo;

import com.eshome.db.model.dto.Country;

public interface CountryRepo {
    int insert(Country country);
}
package com.eshome.db.model.repo;

import com.eshome.db.model.dto.Country;
@Repository
public class CountryRepoImpl implements CountryRepo {

    @Override
    public int insert(Country country) {
        // TODO Auto-generated method stub
        return 0;
    }
}

 

반응형

'MyBatis' 카테고리의 다른 글

[MyBatis] 05. 기타  (0) 2023.06.18
[MyBatis] 04. 동적 쿼리  (0) 2023.06.18
[MyBatis] 03. 조회 결과의 매핑  (0) 2023.06.18
[MyBatis] 02. CRUD  (0) 2023.06.18
Spring + mybatis + PageHelper  (4) 2020.06.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.