김루트
EVOLUTION COMPLETE!
김루트
전체 방문자
오늘
어제
  • 분류 전체보기 (45)
    • Dev (37)
      • Vue (5)
      • Python (0)
      • 알고리즘 (0)
      • javascript (5)
      • JAVA (11)
      • Mysql (6)
      • git (3)
      • Error List (6)
    • 인터넷정보 (0)
    • Utility (1)
    • 관련자료 (2)
    • 제품리뷰 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 글 작성시 키보드 입력이 늦어지는 현상

인기 글

태그

  • 람다
  • 파이썬 파일읽기
  • router-link
  • 함수
  • router-view
  • 파이썬 파일다루기
  • 파이썬
  • Vue.js
  • 파이썬 파일추가
  • Vue
  • 파이썬 with
  • 파이썬 파일쓰기
  • Vue공부
  • 김루트
  • 파이썬 open

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김루트

EVOLUTION COMPLETE!

Mybatis 소개 및 시작
카테고리 없음

Mybatis 소개 및 시작

2018. 1. 22. 17:24

Mybatis란 ?

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



특징을 살펴보자면


  • 간단한 퍼시스턴스 프레임워크
  • 코드의 생산성을 높여준다.
  • 설계를 향상시킨다.
  • 작업의 분배가 수월해지고 팀을 세분화하는 것을 도와준다.
  • SQL문이 애플리케이션 소스 코드로부터 완전하게 분리 된다.
  • 이식성이 뛰어나 어떤 프로그래밍 언어로도 구현이 가능하다.
  • 오픈소스이다.

미리 살펴보는 간단한 용어

  • SqlSessionFactoryBuilder class : 설정파일을 읽어서 SqlSessionFactory객체를 생성
  • SqlSessionFactory class : SqlSession을 만드는 역할
  • SqlSession class : sql문을 실제 호출해주는 역할(필요시 open하고 close를 해줘야 한다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="" />
                <property name="url" value=""/>
                <property name="username" value="" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="" />
    </mappers>
</configuration>
Colored by Color Scripter
cs

위 코드는 가장 핵심적인 부분만을 보여준다. XML 가장 위부분에서는 XML 문서의 유효성체크를 위해 반드시 필요하다. environment 에리먼트는 트랜잭션 관리와 커넥션 풀링을 위한 환경적인 설정을 나타낸다. mappers 엘리먼트는 SQL 코드와 매핑 정의를 가지는 XML 파일인 mapper의 목록을 지정한다.



기존에 dao오를 만들어 그곳에서 sql 쿼리문을 추가해야하는 번거로움이 있는데 이제 우리가 사용할 sql문들을 Mapper에 등록해놓고선 편리하게 나중에 sqlSession을 통해서 불러다 쓰면 훨씬 편리할 것이다.

매핑이 된 SQL 구문

그렇다면 도대체 SqlSeession이나 Mapper클래스가 정확히 어떻게 실행되는지 궁금할 것이다. 매핑된 SQL 구문에 대한 내용이 가장 중요하다. 구문은 XML이나 애노테이션을 사용해서 정의할 수 있다. 그럼 먼저 XML을 보자. 마이바티스가 제공하는 대부분의 기능은 XML을 통해 매핑 기법을 사용한다. 이전에 마이바티스를 사용했었다면 쉽게 이해되겠지만 XML 매핑 문서에 이전보다 많은 기능이 추가 되었다.
다음은 SqlSession을 호출하는 xml 기반의 매핑 구문이다.
1
2
3
4
5
6
7
8
9
<?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="cafe.naver.jjdev.student.service.StudentMapper">
    <select id="selectStudentList" resultType="cafe.naver.jjdev.student.service.Student">
        SELECT id,name,branch,percentage,phone,email FROM details.student
    </select>
</mapper>
Colored by Color Scripter
cs
한 개의 매퍼 XML 파일에는 많은 수의 매핑 구문을 정의할 수 있다. XML 도입부의 DOCTYPE을 제외하면 나머지는 쉽게 이해되는 구문의 형태이다. 여기선 cafe.naver.jjdev.student.service.StudentMapper 네임스페이스에서 selectStudentList라는 매핑 구문을 정의했고 이는 결과적으로 cafe.naver.jjdev.student.service.StudentMapper.selectStudentList형태로 실제 명시되게 된다. 그래서 다음 처럼 사용하게 되는 셈이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StudentDao {
    private SqlSession sqlSession;
    private final String NS = "cafe.naver.student.service.StudentMapper.";
    
    public StudentDao() throws IOException {
        Reader reader = Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        this.sqlSession = sqlSessionFactory.openSession();
    }
 
public List<Student> selectStudent() {
        return sqlSession.selectList("cafe.naver.student.service.StudentMapper.selectAll");
    }
}
Colored by Color Scripter
cs


위 코드에서 중요한 키워드만 보자면 아래와 같다

SqlSessionFactoryBuilder

이 클래스는 인스턴스회되어 사용되고 던져질 수 있다. SqlSessionFactory 를 생성한 후 유지할 필요는 없다. 그러므로 SqlSessionFactoryBuilder 인스턴스의 가장 좋은 스코프는 메소드 스코프(예를들면 메소드 지역변수)이다. 여러개의 SqlSessionFactory 인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder를 재사용할 수도 있지만 유지하지 않는 것이 가장 좋다.


SqlSessionFactory

한번 만든뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 한다. 그래서 삭제하거나 재생성할 필요가 없다. 애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory 를 다시 빌드하지 않는 것이 가장 좋은 형태이다. 재빌드하는 형태는 결과적으로 “나쁜냄새” 가 나도록 한다. 그러므로 SqlSessionFactory 의 가장 좋은 스코프는 애플리케이션 스코프이다. 애플리케이션 스코프로 유지하기 위한 다양한 방법이 존재한다. 가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이다. 또는 구글 쥬스나 스프링과 같은 의존성 삽입 컨테이너를 선호할 수도 있다. 이러한 프레임워크는 SqlSessionFactory의 생명주기를 싱글턴으로 관리할 것이다.


SqlSession

각각의 쓰레드는 자체적으로 SqlSession인스턴스를 가져야 한다. SqlSession인스턴스는 공유되지 않고 쓰레드에 안전하지도 않다. 그러므로 가장 좋은 스코프는 요청 또는 메소드 스코프이다. SqlSession 을 static 필드나 클래스의 인스턴스 필드로 지정해서는 안된다. 그리고 서블릿 프레임워크의 HttpSession 과 같은 관리 스코프에 둬서도 안된다. 어떠한 종류의 웹 프레임워크를 사용한다면 HTTP 요청과 유사한 스코프에 두는 것으로 고려해야 한다. 달리 말해서 HTTP 요청을 받을때마다 만들고 응답을 리턴할때마다 SqlSession 을 닫을 수 있다. SqlSession 을 닫는 것은 중요하다. 언제나 finally 블록에서 닫아야만 한다. 다음은 SqlSession을 닫는 것을 확인하는 표준적인 형태다.


자료 출처 : mybatis.org


이상으로 Mybatis의 간단한 소개를 마친다.




저작자표시 (새창열림)
    김루트
    김루트
    방문해주셔서 감사합니다:)

    티스토리툴바