롸?

Mybatis 개요 본문

Framework/mybatis

Mybatis 개요

허니버터새우깡 2020. 3. 25. 14:51

1. Mybatis란?

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

 

퍼시스턴스(Persitence)
 - 퍼시스턴스는 데이터의 지속성을 의미. 즉 애플리케이션을 종료하고 다시 실행하더라도 이전에 저장한 데이터를 다시 불러 올 수 있는 기술.

프레임워크(Framework)
 - 라이브러리가(library)가 개발에 필요한 도구들을 단순히 나열해 놓은 것이라면 프레임워크(framework)는 동작에 필요한 구조를 어느 정도 완성해 놓은 반제품 형태의 도구. 

퍼시스턴스 프레임워크
 - 퍼시스턴스 프레임워크는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 삭제를 다루는 클래스 및 설정 파일들의 집합. 
퍼시스턴스 프레임워크를 사용하면 JDBC프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있다.

퍼시스턴스 프레임워크에는 SQL문장으로 직접 DB데이터를 다루는 'SQL 맵퍼(mapper)'와 자바 객체를 통해 간접적으로 DB데이터를 다루는 '객체 관계 맵퍼(Object-Relational mapper)' 가 있다. SQL 맵퍼의 대표주자로 'mybatis(이전버전의 이름은 iBATIS)'가 있고, 객체관계 맵퍼의 대표 주자로 '하이버네이트(Hibernate)'와 '탑링크('TopLink)'가 있다.

 

2. 특징

SQL 문이 코드로부터 완전히 분리
 - 기존에는 DAO 파일에 모든 SQL 문을 작성하였다. 하지만 MyBatis에서는 Mapper 파일에 SQL 코드를 입력해놓고 DAO 파일에서 필요할 때마다 가져와서 사용할 수 있다.

생산성
 - JDBC와 SQL을 유지하면서도 훨씬 더 적은 코드로도 JDBC처럼 작동한다. 자바 코드의 20%를 사용하여 JDBC 기능의 80%를 제공하는 간단한 프레임워크이며, 작성할 필요가 없는 JDBC 코드로 인한 분량 문제는 현저하게 줄어든다. (JDBC에 비해 62%정도이다.)

성능
 - 성능 최적화 기법을 지원한다. 페이징 처리된 데이터 리스트를 읽어와서 사용할 때 불필요한 수천 개의 행을 한꺼번에 데이터베이스로부터 가져오는 것이 아니기 때문에 애플리케이션의 성능을 향상시킬수있다.[3]

SQL 문장과 프로그래밍 코드의 분리
 - 작업의 분배 : 팀을 세분화하는 것을 돕는다. SQL 문과 자바 코드와의 분리만으로도 자바 개발자는 Query 문을 신경 쓰지 않아도 된다. SQL 문이 변경되더라도 파라미터값만 변경되지 않는다면 자바 소스에서 수정할 부분이 없기 때문이다.

이식성
 - 자바, C#, Ruby(RBATIS) 등 어떠한 프로그래밍 언어로도 구현 가능하다. 데이터베이스 접근 클래스와 비지니스 로직을 담은 클래스의 분리, 이른바 DAO(Data Access Object) 패턴이 이러한 일을 담당한다. iBatis는 DAO 계층 구현을 위한 유틸리티 성격이면서 동시에 best practice 역할도 수행한다. 자주 쓰이는 데이터를 변경되지 않는 동안에 임시 보관한다. iBatis에서는 XML 설정만으로 캐시를 할 수 있다.

트랜잭션과 스레드 관리
 - 트랜잭션 처리 역시 용이하다.

 

 

3. 구성 및 흐름

 환경설정파일 - Mybatis 전반에 걸친 세팅

① 매핑설정이 어디에 있는지

② 디비에 어떻게 접속할 건지

③ 사용할 모델클래스들에 대한 별명

 

매핑설정파일 - 사용할 sql문들에 대한 정의

 

Session빌드 및 사용 - 실제 sql문 실행

- 설정 파일을 먹여서 SqlSessionFactoryBulder를 객체생성

- SqlSessoinFactoryBuilder을 이용해서 SqlSession을 open

- SqlSession을 통해서 원하는 sql구문의 id를 호출해서 사용

- SqlSession을 close


mybatis 작동 흐름

  1. 데이터 처리를 위해 DAO는 mybatis에 제공하는 객체의 메서드를 호출

  2. mybatis는 SQL문이 저장된 맵퍼 파일에서 데이터 처리에 필요한 SQL문을 찾는다.

  3. mybatis는 맴퍼 파일에서 찾은 SQL을 서버에 보내고자 JDBC드라이버를 사용

  4. JDBC 드라이버는 SQL문을 데이터베이스 서버로 보낸다.

  5. mybatis는 select문의 실행 결과를 값 객체에 담아서 반환, insert, update, delete 문인 경우 입력, 변경, 삭제된 레코드의 개수를 반환.


일반적으로 DAO에서 mybatis를 사용하는 시나리오. 

  1. Dao는 SqlSessionFactory에게 SQL을 실행할 객체를 요구한다. 

  2. SqlSessionFactory는 SqlSession 객체를 생성하여 반환한다. 

  3. Dao는 SqlSession 객체에게 SQL실행을 요청 

  4. SqlSession 객체는 SQL이 저장된 맵퍼 파일(XML) 에서 SQL을 찾는다. 

  5. SqlSession은 JDBC드라이버를 통해 데이터베이스에 질의를 실행 

  6. SqlSession은 데이터베이스로부터 가져온 질의 결과를 객체로 생성하여 반환 

  7. Dao는 사용이 끝난 SqlSession을 닫는다.

 

 

4. API

  • SqlSessionFactoryBuilder 클래스 : build() 메소드를 통해 mybatis-config를 로딩하여 SqlSessionFactory 객체를 생성한다.

  • SqlSessionFactory 클래스 : SqlSession 객체에 대한 팩토리 객체다. 이 객체의 openSession() 이라는 메소드를 통해 SqlSession 객체를 얻을 수 있다.

  • SqlSession 클래스 : 실제 Sql을 실행하는 객체. Mapper XML 에 등록된 SQL을 실행하기 위해 API 를 제공

    • public Object selectOne(String stmt, Object param) : 하나의 데이터를 검색, 두개 이상 리턴되면 예외 발생

    • public List selectList(String stmt, Object param) : 여러 개의 데이터를 검색

    • public int insert(String stmt, Object param) : 몇 건 삽입했는지 리턴

    • public int update(String stmt, Object param) : 몇 건 갱신했는지 리턴

    • public int delete(String stmt, Object param) : 몇 건 삭제했는지 리턴

 

 


참고 

1.  https://mybatis.org/mybatis-3/ko/

2.  https://blog.naver.com/javaking75/220060109590

3.  http://wiki.hash.kr/index.php/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4

4.  https://sjh836.tistory.com/127

5.  https://iotsw.tistory.com/77

Comments