1. MyBatis
▷ SQL 매핑 프레임워크, 개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하는 용도로 많이 사용
▷ 스프링 프레임워크와 MyBatis를 연동해서 좀 더 빠르게 SQL 처리 가능
▷ 기존의 SQL을 그대로 사용할 수 있고 진입장벽이 낮아 JDBC 대안으로 사용할 수 있음
◎ MyBatis의 특징
◎ pom.xml 수정(MyBatis 관련 라이브러리 내용 추가)
...(생략)... <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> ...(생략)...
◎ SQLSessionFactory
▷ MyBatis에서 핵심적인 객체는 SQLSession, SQLSessionFactory
▷ SQLSessionFactory는 SQLSession이라는 것을 만들어 냄.
▷ 개발에서 SQLSession을 통해 Connection을 생성하거나 원하는 SQL을 전달, 결과를 리턴 받는 구조로 작성
◎ src/main/webapp/WEB-INF/spring → root-context.xml(내용 추가)
...(생략)... <!-- 추가 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> ...(생략)...
스프링에 SqlSessionFactory 등록하는 작업은 SqlSessionFactoyBean을 이용하며 MyBatis 패키지가 아니라 스프링 연동 작업을 처리하는 mybatis-spring 라이브러리 클래스임
◎ src/test/java/org/codehows/persistence → DataSourceTests.java
...(생략)... @Setter(onMethod_ = { @Autowired }) private SqlSessionFactory sqlSessionFactory; @Test public void testMyBatis() { try(SqlSession session = sqlSessionFactory.openSession(); Connection con = session.getConnection(); ){ log.info(session); log.info(con); } catch(Exception e) { fail(e.getMessage()); } } ...(생략)...
아래와 같은 화면이 나타나면 됩니다.
2. 스프링과의 연동 처리
▷ SQLSessionFactory 통해서 코드 작성해도 직접 Connection을 얻어 JDBC 코딩이 가능,
좀 더 편하게 작업하기 위해 SQL 처리를 위한 설정 분리 및 자동 처리를 이용하는 게 좋음
▷ 이를 위해 MyBatis의 Mapper라는 존재를 작성해야 함
▷ Mapper는 SQL과 그에 대한 처리를 지정하는 역할을 함
▷ MyBatis - Spring을 이용할 경우 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성 가능
◎ Maper 인터페이스
▷ Mapper를 작성하는 작업은 XML도 가능하고 최소한의 코드를 작성하는 Mapper 인터페이스 사용가능
◎ ex00 → src/main/java → org.codehows.mapper → TimeMapper.java
◎ TimeMapper 인터페이스
package org.codehows.mapper; import org.apache.ibatis.annotations.Select; public interface TimeMapper { @Select("SELECT sysdate FROM dual") public String getTime(); }
◎ root-context.xml
▷ MyBatis가 동작할 때 Mapper를 인식할 수 있돌고 root-context.xml에 추가적인 설정 필요
▷ <mybatis:scan> 태그 이용
1. Namespaces
2. Source
...(생략)... <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 추가 --> <mybatis-spring:scan base-package="org.codehows.mapper"/> <context:component-scan base-package="org.zerock.sample"></context:component-scan> ...(생략)...
<mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아 처리
자동으로 org.codehwos.mapper 패키지를 인식하도록 합니다.
◎ Mapper 테스트
▷ MyBatis-Spring은 Mapper 인터페이스를 이용해 실제 SQL 처리가 되는 클래스를 자동으로 생성
▷ 개발자들이 인터페이스와 SQL만을 작성하는 방식으로 모든 JDBC 처리 끝낼 수 있음
◎ src/test/java → org.codehows.persistence → TimeMapperTests.java 생성
package org.codehows.persistence; import static org.junit.Assert.fail; import java.sql.Connection; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.codehows.mapper.TimeMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import lombok.Setter; import lombok.extern.log4j.Log4j; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") @Log4j public class TimeMapperTests { @Setter(onMethod_ = { @Autowired }) private TimeMapper timeMapper; @Test public void testGetTime() { log.info(timeMapper.getClass().getName()); log.info(timeMapper.getTime()); } }
TimeMapperTests 클래스는 TimeMapper가 정상적으로 사용 가능한지 알아보기 위한 테스트 코드
코드가 정상적으로 동작한다면 스프링 내부에는 TimeMapper 타입으로 만들어진 스프링 객체(빈)가 존재한다는 뜻
timeMapper.getClass().getName()은 실제 동작하는 클래스 이름을 확인해 줍니다.
실행 결과는 개발 시 인터페이스만 만들어 주었지만 내부적으로 적당한 클래스가 만들어 짐
스프링이 인터페이스를 이용해 객체를 생성한다는 것이 중요
◎ XML 매퍼와 같이 쓰기
▷ MyBatis를 이용해 SQL을 처리할 때 어노테이션을 이용하는 방식이 편리하지만 SQL이 복잡하거나 길어지면 어노테이션보다는 XML을 이용하는 방식을 더 선호
▷ MyBatis-Spring은 Mapper 인터페이스와 XML을 동시에 이용할 수 있음
◎ src/main/java → org.codehows.mapper → TimeMapper.java(인터페이스)
package org.codehows.mapper; import org.apache.ibatis.annotations.Select; public interface TimeMapper { @Select("SELECT sysdate FROM dual") public String getTime(); public String getTime2(); }
◎ src/main/resources → org.codehows.mapper → TimeMapper.xml
<?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.codehows.mapper.TimeMapper"> <select id="getTime2" resultType="string"> SELECT sysdate FROM dual </select> </mapper>
◎ src/test/java → org.codehows.persistence → DataSourceTests.java 수정
...(생략)... @Test public void testConnection() { try (Connection con = dataSource.getConnection()){ log.info(con); } catch(Exception e) { fail(e.getMessage()); } } ...(생략)...
다음과 같이 내용을 추가했을 때 실행이 된다면 연결이 완료된 것입니다.
MyBatis를 이용해서 스프링과 연결하고 실제 SQL문들을 사용해 보았습니다.
작성한 인터페이스, 클래스와 DB와 연결이 잘 되면 문제 없이 진행된 거네요!
스프링이 간단하긴 하지만 처음에 개념이 좀 어렵네요,,ㅎㅎ
그래도 반복해서 보면서 익혀볼게요!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Spring' 카테고리의 다른 글
[코드로 배우는 스프링 웹 프로젝트] ch05 스프링 MVC 기본 구조 (0) | 2023.03.26 |
---|---|
[코드로 배우는 스프링 웹 프로젝트] ch04 MyBatis와 스프링 연동 2( log4jdbc-log4j2) (0) | 2023.03.26 |
[코드로 배우는 스프링 웹 프로젝트] ch03 스프링과 오라클 DB 연동(히카리 사용) (0) | 2023.03.26 |
[코드로 배우는 스프링 웹 프로젝트] ch01 스프링 개발환경 (0) | 2023.03.24 |
[코드로 배우는 스프링 웹 프로젝트] java spring 책 검색 기능 추가하기 (0) | 2023.03.18 |