mapper와 MyBatis

jungnoeun·2022년 9월 16일
0

spring

목록 보기
10/24

mapper

Persistance Framework

  • Persistence Layer에서 개발하는 Framework
  • jdbc 프로그래밍에 비해 간단한 작업만으로 데이터베이스와의 연동과 개발 보장한다.
  • dbms에 대한 종속성이 줄어든다. 유지보수가 쉬우며 직관적이다.
  • Framework는 sql Mapper와 orm으로 구성되어 있다. sql Mapper와는 다르게 orm은 관계형구조를 가지며 sql mapper는 쿼리으로 동작하지만 orm은 메서드로 데이터를 조작할 수 있다.

Mybatis

  • sql Mapper 중 하나
  • jdbc로 처리하는 코드의 설정(Connection) 부분을 줄이고 실제 sql문에 연결함으로서 빠른 개발이 가능하게 한다.
  • 해당 코드는 map 인터페이스와 매핑을 위한 xml과 annotation을 사용한다.
  • 다른 방식에 비해 객체자체보다 쿼리에 집중할 수 있다.

Mybatis를 이용한 Mapping 방식

Mybatis 가 어떻게 Spring boot의 xml과 mapping이 되는가?

Mybatis를 사용하려면 크게 4가지를 정의해야 한다.

  1. 쿼리문을 정의한 mapper.xml 파일
  2. Mapper.xml를 java코드에서 실행시키는 Mapper Class or interface (Mapper.java)
  3. 쿼리의 결과데이터를 담는 중간 매개 Class (보통 VO)
  4. 위의 3개의 위치를 알려주는 설정

Interface를 이용하여 사용하는 방식.

Mapper.xml 과 Mapper.java를 연결해주는 방식은 NameSpace와 각 쿼리문의 id의 조합임.
쿼리문의 id의 값은 Mapper.java에서 인터페이스로 만들어 놓은 메소드명과 일치해야함.

Interface 와 Class 방식 각각의 장단점

Class 사용

장점

  • 쿼리문 실행 전에 넣어줄 매개변수와 쿼리 결과값의 변형을 정의할 수 있다.
  • Namespace를 내 마음대로 둘 수 있다.
  • .xml 파일의 쿼리문 id와 mapper 메소드명을 일치시킬 필요가 없다.
    단점
  • Sqlsession 객체를 주입받아야 하며, 쿼리문 실행 시 항상 호출해야 한다.
  • 쿼리문 호출 시 sqlsession에 .xml 파일의 namespce와 쿼리문 id를 매개변수로 넘겨야한다.

Interface 사용

장점

  • 메소드의 내부 구현이 불필요하다.
  • Sqlsession 객체 주입이 불펼요하다.
  • .xml 파일의 쿼리문 id와 mapper 메소드 명이 일치한다.
    단점
  • .xml의 Namespace가 실제 Mapper.java 위치를 가르켜야 한다.
  • 메소드 내부 정의가 불가능하다.

MyBatis

MyBatis 특징

  1. MyBatis-Spring은 Mybatis에서 Mybatis3와 Spring 연동 라이브러리로 제공됩니다.
  2. 싱글톤 패턴으로 스프링빈 으로 등록하여 주입하여 쉽게 사용이 가능합니다.
  3. Mybatis Mapper Interface를 통해 DB에 접근합니다.
  4. 객체 프로퍼티로 파라미터와 결과를 객체(DTO, Map)등으로 자동 Mapping을 지원합니다.
  5. Spring 연동 모듈을 제공해주기 때문에 Spring 설정이 간단합니다.
  6. 트랜잭션을 관리해주기 쉽게 설정이 가능합니다.

Mybatis 주요 구성 요소

구성요소/구성파일설명
MyBatis configuration fileMyBatis의 작업 설정을 설명하는 XML 파일
데이터베이스의 연결 대상, 매핑 파일의 경로, Mybatis의 작업 설정 등과 같은 세부사항을 설명하는 파일
Mybatis의 기본 작업을 변경하거나 확장 할 때 설정이 수행
org.apache.ibatis.session.SqlSessionFactoryBuilderMybatis 구성 파일을 읽고 생성하는 SqlSessionFactory 구성요소
org.apache.ibatis.session.SqlSessionFactorySqlSession을 생성하는 구성 요소
org.apache.ibatis.session.SqlSessionSQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소
Mybatis를 사용하여 데이터베이스에 엑세스할 때 가장 중요한 역할을 하는 구성 요소
Mapper interfacetypeafe에서 매핑 파일에 정의된 SQL을 호출하는 인터페이스
Mybatis는 Mapper 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 된다
Mapping fileSQL 및 O/R 매핑 설정을 설명하는 XML 파일

Mybatis 주요 구성 요소가 Database Access 하는 순서


(1) ~ (3)은 응용 프로그램 시작시 수행되는 프로세스입니다.

(1) 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.
(2) SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 Mybatis 구성 파일을 읽습니다.
(3) SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다.

(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스입니다.

(4) 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.
(5) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.
(6) SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환합니다.
(7) 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체를 가져옵니다.
(8) 응용 프로그램이 매퍼 인터페이스 메서드를 호출합니다.
(9) 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청합니다.
(10) SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행합니다.

Mybatis-Spring의 컴포넌트 구조

제목1제목2
org.mybatis.spring.SqlSessionFactoryBeanSqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.
표준 Mybatis에서 SqlSessionFactory는 Mybatis 구성 파일에 정의된 정보를 기반으로 하지만 SqlSessionFactoryBean을 사용하면 Mybatis 구성파일이 없어도 SqlSessionFactory를 빌드할 수 있다.
org.mybatis.spring.mapper.MapperFactoryBean싱글톤 Mapper 개체를 만들고 Spring DI 컨테이너에 개체를 저장하는 구성 요소.
org.mybatis.spring.SqlSessionTemplateSqlSession 인터페이스를 구현하는 싱글톤 버전의 SqlSession 구성 요소.

(1) ~ (4)은 응용 프로그램 시작시 수행되는 프로세스입니다.

(1) SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.
(2) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.
(3) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다. 따라서 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장됩니다.
(4) MapperFactoryBean은 안전한 SqlSession(SqlSessionTemplate) 및 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체)를 생성합니 다. 따라서 생성되는 매퍼 객체는 스프링 DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI가 적용됩니다. 매퍼 개체는 안전한 SqlSession(SqlSessionTemplate)을 사용하여 스레드 안전 구현을 제공합니다.

(5) ~ (11)은 응용 프로그램 시작시 수행되는 프로세스입니다.

(5) 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.
(6) 애플리케이션(서비스)은 DI 컨테이너에서 주입한 매퍼 개체(매퍼 인터페이스를 구현하는 프록시 개체)의 방법을 호출합니다.
(7) 매퍼 객체는 호출된 메소드에 해당하는 SqlSession (SqlSessionTemplate ) 메서드를 호출합니다.
(8) SqlSession (SqlSessionTemplate )은 프록시 사용 및 안전한 SqlSession 메서드를 호출합니다.
(9) 프록시 사용 및 스레드 안전 SqlSession은 트랜잭션에 할당된 MyBatis3 표준 SqlSession을 사용합니다. 트랜잭션에 할당된 SqlSession이 존재하지 않는 경우 SqlSessionFactory 메서드를 호출하여 표준 MyBatis3의 SqlSession을 가져옵니다.
(10) SqlSessionFactory는 MyBatis3 표준 SqlSession을 반환합니다. 반환된 MyBatis3 표준 SqlSession이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우 새 SqlSession을 생성하지 않고 동일한 SqlSession을 사용합니다.on 메서드를 호출하고 SQL 실행을 요청합니다.
(11) MyBatis3 표준 SqlSession은 매핑 파일에서 실행할 SQL을 가져와 실행합니다.

mapper:
https://jung-story.tistory.com/128
MyBatis:
https://jung-story.tistory.com/121
mapper와 repository 차이:
https://pamyferret.tistory.com/69
mapperscan이용한 mapper 주입법
https://linked2ev.github.io/mybatis/2019/09/08/MyBatis-5-MapperScan%EB%A5%BC-%ED%86%B5%ED%95%9C-Mapper-%EC%A3%BC%EC%9E%85-%EB%B0%A9%EC%8B%9D/

profile
개발자

0개의 댓글