티스토리 뷰

Mybatis가  뭔데 ?🤔


💡Mybatis는 RDB와의 관계를 매핑시켜 개발 생산성을 높여주는 지속적 프레임워크(persistence framework)다.

 

c.f)  Persistence Framework 란?

지속성 프레임워크(Persistence Framework)는 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일들의 집합

 

 

Mybatis 사용목적과 이유가 궁금하다면, 펼쳐보자

더보기

그럼 얘를 쓰는 이유가 뭐지? 


 Java언어로 콘솔 프로젝트든, 웹 프로젝트를 진행해보았다면, DB를 연동하는 과정을 한 번쯤 경험했을 것이다. JDBC를 이용하여, 연결 후 CRUD 작업을 하는 과정 중에 아래와 같은 상황에 정말 많이 공감할 것이다.

 

1) 이거 자바 맞아 ..?

 이놈의 JDBC는 항상 열고 닫아줘야 한다. 내가 원하는 건 SQL문으로 레코드만 꺼내오는 것인데... 연결하고, 닫아주고... 잔 코드들이 너무 많다.

 

2) 난잡한 코드 😩

 SQL문이 바뀌거나, 혹은 테이블이 바뀌었을 때, 찾기가 너무 눈 아프다. 특히 테이블이라도 바뀌면, (객체가 Map이 아닐 땐) 변수가 추가되거나 삭제되고, 여간 곤혹이 아니다 -_-; 

 

3) 재시작... 컴파일.... 🤬

 코드이기에 class파일로 컴파일하는 과정을 거쳐야 한다. 오타가 많고, 실수가 많을수록, run버튼에 손이 갈 때마다 스트레스가 상승한다.

 

JDBC를 사용함에 있어서 한 번쯤 공감할만한 내 경험 사례들을 써보았다.

Mybatis는 이러한 번거로움을 줄여 개발 생산성을 높여주는 프레임워크다.

JDBC를 사용할 때 보다 60% 정도의 코드만으로 프로그램 작성이 가능하다고 한다.

 

 

그래서 어떤 장점인데? 


 1) 코드의 분리 📕📗

필자의 생각으론 Mybatis의 장점은 코드의 분리로부터 시작된다. SQL문을 xml파일(mapper파일)로 분리하여, java코드와 쿼리문을 분리했다. 개발자는 필요시마다 DAO에서 불러서 사용할 수 있다.

 

 2) 유지보수성 📈

당연히 코드를 특징(언어의 형태)으로 분리하였으므로, 그로 인한 이점을 그대로 상속한다. 즉, 유지보수성이 높아진다!  SQL 코드를 변경하기 위해 DAO를 건들 필요가 없다. 

 

 3) 생산성 📈

 DAO에 들어가던 코드가 들어가지 않으니 당연히 코드가 짧아진다. 뿐만 아니라 SqlSessionTemplate 객체를 이용하면, open/close 도 신경 쓸 필요 없다. 단 한두 줄이면 DAO가 끝나는 마법 같은 코드 길이를 보여준다. 

 

 

 


필자가 적용한 Mybatis 환경과 목적은 다음과 같습니다.

java : 1.8 version

spring : 4.3.30.RELEASE

Mybatis 사용목적 : JNDI와 연결하여 이용, SqlSessionTemplate 사용할 목적


 

어떻게 쓰는데?

이 부분이 처음 Mybatis를 접하는 모든 사람에게 가장 어려운 부분이라고 생각한다. Mybatis는 초반 설치가 약간 복잡할 수 있다. 이용하기 위해서 구성해야 하는 것들은 다음과 같다.

 

  • Mybatis dependency 추가
  • root-context servlet 등록
  • Mybatis Configuration 설정
  • Mapper 파일 생성

1) 의존성 추가

pom.xml에 다음과 같이 의존성을 추가한다. 버전은 본인에 맞게 설정할 것!

		<!-- 마이바티스 사용을 위한 의존성 추가 -->
		<!-- 코어 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.7</version>
		</dependency>
		<!-- 유틸성 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.6</version>
		</dependency>

 

2) root-context에 등록 

마이 바티스 지원을 위해 bean을 등록해야 한다. 우선적으로 SqlSessionFactory을 등록하고, 추가로 SqlSessionTemplate을 등록하는 과정이다. root-context.xml에서 빈을 등록하면 된다. dataSource에는 생성한 JNDI의  bean id를 넣어주면 된다. (필자의 JNDI 설정은 위와 같아서 참고를 위해 같이 올려둔다. )

 

SqlSessionFactory 생성 시, configLocation 속성을 반드시 설정해줘야 하는데, 이때 value에는 configuration이 들어갈 실제 경로를 포함하여 적어준다. 

 

(필자의 설정 파일은 src/main/resource/onememo/mybatis/configuration.xml 여기에 존재한다.)

 

 

	<!-- JNDI SETTINGS -->
	<bean id="datasourceByJNDI" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="SPRING" />
		<property name="resourceRef" value="true"/>
	</bean>

	<!-- 1]SqlSessionFactory -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- JDNI id 삽입 -->
		<property name="dataSource" ref="datasourceByJNDI" />
        <!-- 실제 mybatis configuration이 존재하는 경로 삽입 -->
		<property name="configLocation"	value="classpath:onememo/mybatis/configuration.xml" />
	</bean>
    
	<!-- 2]SqlSessionTemplate -->
	<bean id="template" class="org.mybatis.spring.SqlSessionTemplate">
    	<!-- 위에서 생성한 factory 삽입 -->
		<constructor-arg ref="sqlSessionFactory" />
	</bean>

 

c.f) JDBC를 이용할 분들은 접어두기를 이용 바란다.

 

 

3) Configuration.xml 추가

Mybatis 기본 설정을 관리하는 파일이다. 해당 파일은 "설정"에 관한 파일이므로, 실제 SQL문을 사용하는 파일이 아니다.

즉, 반드시 sql문을 기술하는 파일의 경로를 이 설정 파일에 걸어줘야 한다.(그래야 찾아가니깐!)

mapper 태그를 통해서 실제를 sql문을 기술하는 xml 경로를 설정해주면 된다. 

 

필자는 위 예제를 기준으로 src/main/resource/onememo/mybatis/mapper 이 경로에 onememo.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">

<!-- https://mybatis.org/mybatis-3/ko/index.html -->
<!-- mybatis 환경설정파일 1] 데이터베이스 연결정보 설정 2] Mapper파일의 위치정보 설정 -->
<configuration>

	<!-- Alias Area -->
	<typeAliases>
		<!-- 타입 지정용 -->
	</typeAliases>

	<!-- mapper file location -->
	<mappers>
		<mapper resource="/onememo/mybatis/mapper/onememo.xml" />
	</mappers>
    
</configuration>

 

4) Mapper 파일 

실제로 SQL문을 기술하는 부분이다. 

CRUD에 따라 insert, select, update, delete 태그를 이용하여 안에 SQL 문을 사용하며, SpEL , EL 사용이 가능하다.

 

※xml에서 SQL문 사용법

 

각 태그들의 속성 

 

a) id

자바 코드에서 해당 태그를 불러 SQL를 실행하기 위한 id 값이다. 

 

b) parameterType

어떤 파라미터 타입이 들어오는지에 대한 설정 타입이다. Map, String이 주로 들어가며, 객체일 경우 패키지명을 포함한 객체명으로 넣어줘야 한다.

 

c) resultType

select를 제외한 나머지 태그들은 모두 int형 반환이므로 resultType이라는 속성이 없다.

레코드 조회에 관련된 select 태그만 resultType이 존재하는데, 만약 DTO(VO)로 반환하고 싶다면, configuration에서 typealias를 지정하거나, 혹은 패키지명을 포함한 dto 객체명을 적어줘야 한다.

 

d) SQL문

DAO에서 기술하던 것처럼 SQL문을 사용하면 된다. 단, 변수 처리 방법이 좀 다르다. preparedStatement 같은 경우 물음표를 사용하고, set계열을 이용해서 삽입을 해주지만, mybatis에선 SpEL 표현식으로 삽입이 가능하다.

단, 해당 표현식 안에 들어간 변수명과  일치하는 변수명이 parameterType에 존재해야만 읽어올 수 있다.

 

<?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="onememo.mybatis.mapper.onememo">

   
   <!-- 해당 map에는 title,content,id 라는 키를 가진 값들이 존재함 -->
   <insert id="memoInsert" parameterType="Map">
   		INSERT INTO onememo VALUES(SEQ_ONEMEMO_NO.NEXTVAL,#{title},#{content},SYSDATE,#{id})

   </insert>
   
     <!-- 해당 String은 id라는 변수명이 들어옴-->
   <select id="memoFindNameById" parameterType="String" resultType="String">
   		SELECT name FROM members WHERE id = #{id}
   </select>

  
  
   <update id="onememoUpdate" parameterType="Map">
   		UPDATE onememo SET title =#{title} , content =#{content} WHERE no=#{no}
   </update>
   	   
   
   
  
   <delete id="memoDeleteByNo" parameterType="Map">
   		DELETE onememo WHERE no = #{no}
   </delete>
  
</mapper>

 

 

사용 예제


SqlSessionTemplate 객체 주입

원하는 method 실행 (DML 형태의 메서드 이름으로 존재하며, 읽어보면 어렵지 않게 사용 가능하다.)

update 함수 호출 (끝...? 끝 😃👍👍👍👍👍)

 

@Repository()
public class OneMemoDAO {
	
	//@Autowired
	@Resource(name="template")
	private SqlSessionTemplate template;
	
	// ... 중간 생략
    
	public int update(Map map) {
		// TODO Auto-generated method stub
		//해당 객체에 mapper파일에서 매핑할 아이디와 파라미터 전달
		template.update("onememoUpdate",map);
		return 0;
	}

}

 

 

마치며


Mybatis가 초기 설정이 좀 혼란스럽지, 프레임워크기 때문에 몇 번 써보면 쉽게 흐름을 이해할 수 있었다. 처음엔 파일도 많고 복잡했다고 느껴졌지만, DAO 코드량이 혁신적으로 줄었다. (단 한 줄 👍) 

Mybatis 하나만으로도 정말 많은 이야기들을 할 수 있지만, 가장 쉽고 기본적인 것 위주로 포스팅하는데 신경 써서 작성했다. 

 

 

📃 References


 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함