(spring) MyBatis

2 분 소요

💼📝🔑⏰ 📙📓📘📒🎓

예제 프로젝트 : mvc-demoweb-starter

💼 MyBatis?

객체와 테이블을 매핑하는 ORM과는 다르게 객체와 SQL문을 매핑하는 프레임워크

  • 독자적인 질의 언어를 지원하지 않고 SQL 사용

▪ 장점

  • 저수준 JDBC 코드의 복잡성 제거
  • 친근한 SQL 기반으로 초기 학습곡선 완만
  • 기존 데이터베이스와 호환성 높음
  • Spring 프레임워크와 통합 기능 제공
  • 성능 우수

📝 MyBatis 클래스

  1. SqlSessionFactoryBuilder : SqlSessionFactory를 생성하는 객체,mybatis-config.xml 설정 파일 사용
  2. SqlSessionFactory : SqlSession을 생성하는 객체
  3. SqlSession : SQL을 실행하는 객체 Mapper 파일의 매핑 정보 사용

📝 MyBatis 연동 스프링 클래스

  1. SqlSessionFactoryBean
    • SqlSessionFactoryBuilder를 사용해서 SqlSessionFactory 생성
    • 스프링의 FactoryBean 인터페이스 구현 → getObject 메서드 재정의를 통해 SqlSessionFactory 객체 반환
  2. SqlSessionTemplate : SqlSession을 Wrapping한 객체

🔑 FactoryBean이란?

FactoryBean:

  • new로 만들수 없는 것들을
  • FactoryBean으로 만들어 의존 객체들을 전부 만들어주는 SPRING 인터페이스이다.

💼 MyBatis - 스프링 연동 설정

📝 1. 의존성 패키지 등록 (pom.xml)

  • MyBatis Spring,MyBatis 복사 pom.xml에 등록 작업
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.4</version>
</dependency>
<!-- 마이바티스와 스프링을 연동하는 패키지 -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>2.0.4</version>
</dependency>

📝 2. mybatis-config.xml 설정 파일 작성

  • /resources/mybatis-config.xml : 파일 생성
  • mapper.xml 파일들을 등록 해놓는 작업
<?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>
	<!--mapper.xml에 들어갈 vo의 별칭 설정 -->
	<typeAliases> 
		<typeAlias type="com.demoweb.vo.Member" alias="Member"/>
	</typeAliases>
	<!-- SQL 매핑 파일 경로 지정 -->
	<mappers>
		<mapper resource="com/demoweb/mapper/MemberMapper.xml"/>
	</mappers>
</configuration>

설정파일 주요 구성 요소

  • mappers: SQL 매핑 파일 경로 지정
  • properties : 다른 요소에서 재사용 할 수 있도록 설정 정보를 분리 정의
  • typeAliases : 패키지명을 포함하는 클래스의 전체 경로명 대신 사용할 별명 지정

📝 3. mapper.xml 파일 작성

  • /resources/패키지경로/○○○○Mapper.xml 파일 생성
  • Controller 갯수만큼? 뭐 자유이긴 하다.
  • SQL문이 작성 부분
  • VO 객체와 데이터베이스 TABLE에 변환작업을 해주는 파일이다.
<?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="com.demoweb.mapper.MemberMapper">
	<select id="selectMemberByIdAndPasswd" parameterType="hashmap" resultType="Member">
		SELECT memberid, email, usertype, active, regdate  
		FROM member   
		WHERE memberid = #{memberId} AND passwd = #{passwd}
	</select>
	
	<insert id="insertMember" parameterType="Member">
		INSERT INTO member (memberid, passwd, email)  
		VALUES (#{memberId}, #{passwd}, #{email})
	</insert>
	<update id="updateMember" parameterType="Member">
		UPDATE member 
		SET passwd = #{passwd}, email = #{email}
		WHERE memberid = #{memberId}
	</update>
	
</mapper>

📝 4. root-contex.xml에 빈 추가

  • MyBatis 설정 작업
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg ref="sqlSessionFactory"/>
</bean>
  • MyBatis를 사용할 DAO에 의존성 주입
<bean id="memberDao"
		class="com.demoweb.dao.MemberDao">
	<property name="sqlSessionTemplate" ref="sqlSessionTemplate"></property>
</bean>
  • root-context.xml파일에서 Namesspaces 텝 클릭후 mybatis 선택후 마이바티스에게 알려주는 작업
<mybatis-spring:scan base-package="com.demoweb.mapper"/>

📝 6. Mapper 인터페이스 생성

java경로에 생성, 인터페이스는 꼭 mapper.xml 폴더 구조와 똑같은 경로로 패키지 경로를 잡아야 한다!

@Mapper
public interface MemberMapper {
	void insertMember(Member member);
	Member selectMemberByIdAndPasswd(HashMap<String, Object> params);
	void updateMember(Member member);
}
  • Mapper 어노테이션을 붙이면 꼭 root-context.xml에 컴포넌트 스켄이 설정되어 있는지 확인해야 된다!

📝 7. Dao에서 호출하는 작업

  • mapper인터페이스를 자동 주입하라.
public class MemberDao {
	
	private SqlSessionTemplate sqlSessionTemplate;
	public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
		this.sqlSessionTemplate = sqlSessionTemplate;
	}
	
//TODO 2번째 작업
	@Autowired
	private MemberMapper memberMapper;

	public void insertMember(Member member) {
		memberMapper.insertMember(member);
	}
	
	public Member selectMemberByIdAndPasswd(String memberId, String passwd) {
		
		HashMap<String, Object> params = new HashMap<String, Object>();
		params.put("memberId", memberId);
		params.put("passwd", passwd);
		
		Member member = memberMapper.selectMemberByIdAndPasswd(params);
		return member; //조회된 데이터를 저장항 Member 객체 반환
	}
	
	public void updateMember(Member member) {
		memberMapper.updateMember(member);
	}
}

mapper를 사용하면 DAO를 대체하기 때문에 사용하지 말라는 권장사항이 있음.

댓글남기기