MyBatis

0taetae·2024년 10월 26일
0
post-thumbnail

📙MyBatis란?

Java Object와 SQL 문 사이의 자동 Mapping 기능을 지원하는 ORM(Object-Relational Mapping) Framework

💡특징

  • Object는 SQL 사이의 parameter mapping 작업을 자동으로 처리한다.
  • 쉬운 접근성과 코드의 간결함
    • JDBC의 모든 기능을 MyBatis가 대부분 제공
    • 수동적인 parameter 설정과 Query 결과에 대한 mapping 구문을 제거
  • SQL 문과 프로그래밍 코드의 분리
    • SQL에 변경이 있을때마다 자바 코드를 수정하거나 컴파일 하지 않아도 된다.

💡XML에서 SqlSessionFactory 빌드하기

  • SqlSessionFactory를 빌드하여, DB 작업을 수행할 SqlSession 객체를 얻어야 한다.
<?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="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="org/mybatis/example/BlogMapper.xml"/>
	</mappers>
</configuration>

💡XML 매핑하기

  • XML 설정을 통해 SQL 실행과 결과 매핑을 자동으로 처리할 수 있다.
<?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="org.mybatis.example.BlogMapper">
	<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
	</select>
</mapper>

💡MyBatis 3의 주요 Componenet

  • sqlMapConfig.xml
    • MyBatis 설정
    • 데이터베이스의 접속 주소 정보나 객체의 alias, Mapping 파일의 경로 등의 고정된 환경 정보를 설정
  • SqlSessionFactoryBuilder
    • MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성
  • SqlSessionFactory
    • SqlSession 생성
  • SqlSession
    • 핵심적인 역할을 하는 Class
    • SQL 실행이나 Transaction 관리를 실행
    • SqlSession Object는 Tread-Safe하지 않으므로 thread마다 필요에 따라 생성
  • mapping 파일
    • SQL문과 ORMapping을 설정

📙MyBatis-Spring

💡MyBatis와 MyBatis-Spring을 사용한 DB-Access Architecture

💡MyBatis를 사용하는 Data Access Layer

  • DaoImpl → sqlMapConfig.java를 만듦
  • sqlMapConfig.java안에서 mybatis-config.xml 작업
    • property → db 설정 → db 연결
    • mapper → xml 읽어오기
    • typeAlias 별칭
    • mapper를 외부에서 사용하기 위해 유일값을 가져야 함 → mapper에 namespace 반드시 설정
      ⇒ sqlSessionFactory : sqlSession을 만들어줌 sqlSession → commit, rollback, insert, update, delete, select

💡MyBatis-Spring의 주요 Componenet

  • SqlSessionFactoryBean
    • MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성
    • Spring Bean으로 등록해야 함
  • SqlSessionTemplate
    • 핵심적인 역할을 하는 클래스
    • SQL 실행이나 Transaction 관리를 실행
    • SqlSession interface를 구현
    • Thread-safe
    • Spring Bean으로 등록해야 함
  • mapping 파일
    • SQL문과 ORMapping을 설정
  • Spring Bean 설정 파일(bean.xml)
    • SqlSessionFactoryBean을 Bean에 등록할 때 DataSource 정보와 MyBatis Config 파일 정보, Mapping 파일의 정보를 함께 설정
    • SqlSessionTemplate을 Bean으로 등록

📙Mapper Interface

mapping 파일에 기재된 SQL을 호출하기 위한 Interface

  • Mapper Interface를 사용하지 않았을 경우
    • SQL을 호출하는 프로그램은 SqlSession의 method의 argument에 문자열로 namespace + “.” + SQL ID로 지정
  • Mapper Interface를 사용했을 경우
    • UserMapper Interface는 개발자가 작성
    • packagename + “.” + InterfaceName + ”.” + methodName이 namespace +”.” + SQL ID가 되도록 Namespace와 SQL ID를 설정해야 함
    • Namesapce 속성에는 package를 포함한 Mapper Interface의 이름을 작성
    • SQL ID에는 mapping하는 method의 이름을 지정

📙MyBatis와 Spring 연동하기

💡DataSource 설정

  • 스프링 환경 설정파일 (application-context.xml)에 데이터소스를 설정한다.
    ✔️이때, 데이터소스는 dataSource 아이디를 가진 빈으로, 데이터베이스 연결정보를 가진 객체이다.
  • 데이터베이스 설정트랜잭션 처리스프링에서 관리한다.
<!--일반설정-->
<bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
		<property name="url" 
			value="jdbc:mysql://127.0.0.1:3306/ssafyweb?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"/>
		<property name="username" value="ssafy"/>
		<property name="password" value="ssafy"/>
</bean>
<!--ConnectionPool 설정 (DBCP)-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc/ssafy"></property>
</bean>

✔️ springboot는 자체적으로 Hikari CP라는 Pool을 가지고 있다.

💡트랜잭션 관리자 설정

  • transactionManager 아이디를 가진 bean은 트랜잭션을 관리하는 객체이다.
  • MyBatis는 JDBC를 그대로 사용하기 때문에 DataSourceTransactionManager 타입의 bean을 사용한다.
  • 메소드나 클래스에 @Transactional이 선언되어 있으면, AOP를 통해 트랜잭션을 처리한다.

@Transactional

  • @Before(start transaction 처리), @After(정상처리되면 commit, exception이면 rollback)
  • 프록시 패턴 : 프록시를 통해 접근, 직접적인 호출 안된다.
    ✔️이때, 프록시 패턴이란❓
    대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다.
<!--트랜잭션 관리자 설정-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
</bean>
<!--annotation 기반 트랜잭션 관리자 설정-->	
<tx:annotation-driven transaction-manager="transactionManager"/>

💡SqlSessionFactoryBean 설정

  • MyBatis 애플리케이션은 SqlSessionFactoryBean를 중심으로 수행한다.
  • SqlSessionFactory 객체를 생성하기 위해서, SqlSessionFactoryBean을 빈으로 등록해야 한다.
  • SqlSessionFactoryBean을 빈으로 등록할 때, 사용할 데이터소스와 mybatis 설정파일 정보가 필요하다.
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="typeAliasesPackage" value="com.ssafy.*.model"/>
		<property name="mapperLocations" value="classpath:com/ssafy/mapper/*.xml"/>
</bean>

💡mapper 빈 등록

  1. mapper interface를 직접 bean으로 등록
  • MapperFactoryBean 클래스 사용
<bean id="boardMapper" class="org.mybtis.spring.mapper.MapperFactoryBean">
		<property name="mapperInterface" value="com.ssafy.board.model.mapper.BoardMapper"/>
		<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
  1. mapper scanner를 사용하여 자동으로 등록
<context:component-scan base-package="com.ssafy.*.model,com.ssafy.util,com.ssafy.board.aop"/>

0개의 댓글