ORM
[myBatis] myBatis 사용방법
yyyyMMdd
2023. 12. 26. 16:42
728x90
#. 현재는 많은 곳에서 JPA를 사용하나 이전에는 Ibatis를 시작으로 myBatis를 사용했을 것입니다.
#. 레거시한 프로젝트의 경우 대부분 myBatis를 사용하는데 이에 대해 알아보도록 할 예정입니다.
#. myBatis 란 무엇인가?
- Hibernate와 같은 완전한 ORM(Object-Relational Mapping) 프레임워크와 비교하여 데이터베이스 작업에 대한 대안적인 접근 방식을 제공합니다.
- SQL 데이터베이스 작업 프로세스를 단순화하는 동시에 SQL 쿼리 및 Java 개체에 대한 결과 매핑에 대한 더 많은 제어 기능을 제공합니다.
- SQL을 직접적으로 관리하려는 개발자에게 적합하며, 복잡한 SQL이 필요하고 성능이 중요한 프로젝트에 주로 사용하는 것이 좋습니다.
#. 주요 기능
- SQL 중심 접근 방식
- 개발자가 SQL 쿼리를 직접 작성할 수 있어 데이터베이스에서 실행되는 쿼리를 제어할 수 있습니다. - 객체에 쿼리 매핑
- SQL 쿼리 결과를 Java 객체에 직접 매핑하여 SQL 결과를 Java 객체로 변환하여 사용할 수 있습니다. - 동적 SQL
- 다양한 매개변수 또는 조건을 기반으로 동적 SQL 구성을 지원합니다. - 단순성과 경량성
- 일부 ORM 프레임워크에 비해 myBatis는 더 간단하고 가벼우며 SQL에 익숙한 개발자에게 적합합니다. - Java 애플리케이션과의 통합
- Java와 잘 통합되어 다양한 데이터베이스를 지원하고 Spring 또는 Java EE 애플리케이션 내에서 원활하게 작동합니다. - 구성 가능성
- myBatis의 구성은 XML을 통해 수행할 수 있으므로 데이터베이스 연결, 매핑 전략 등을 사용자 정의할 수 있습니다.
#. Config 설정
- config.xml 파일을 생성하여 아래 내용을 입력해 줍니다.
- environment를 추가할 수 있으며, environements의 default에 지정하여 기본값을 설정할 수 있습니다.
- DBMS에 따라 driver에서 수정이 필요합니다.
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="오라클 접속 ID"/>
<property name="password" value="오라클 접속 PW"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="맵퍼경로/맵퍼.xml"/>
</mappers>
</configuration>
#. Bean 설정
- myBatis 사용을 위한 추가적인 설정을 해줍니다.
- dataSource - sqlSessionFactory가 처리될 때 dataSource라는 Bean을 참조합니다.(로그 확인용)
- configLocation - myBatis 설정 및 매퍼 설정과 관련된 파일명을 지정해 줍니다.
- 관련된 파일의 내부에는 configuration > mappers > mapper - resource 프로퍼티를 이용해 경로 설정이 가능합니다. - mapperLocation - 맵퍼 파일들의 경로를 지정해 줍니다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:xml파일명.xml"/>
<property name="mapperLocations" value="classpath*:xml파일경로/*.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!-- 로그 확인용 -->
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceSpied" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE" />
<property name="sqlPrefix" value="SQL : " />
</bean>
</property>
</bean>
#. Mapper 설정
- namespace
- 맵퍼 파일의 이름을 설정하여 전 단에서 호출 시 사용됩니다.
- 주요 사용 태그
- <select>
- <update>
- <delete>
- <insert>
- 데이터 유형 입력 시(parameterType 및 resultType 프로퍼티 입력 시 사용)
- java.util.HashMap처럼 길게 써도 되나 짧게 써도 상관없습니다.
- 문자 : string = (java.lang.String)
- 숫자 : int = (java.lang.Integer)
- Map, HashMap : map, hashmap = (java.util.HashMap)
- 파라미터 유형
1. ${파라미터명}
- Java의 Statement 방식으로 ' '을 처리해주지 않는 방식입니다.
- SQL Injection 등 보안에 문제가 될 수 있으므로 사용하지 않는 것이 좋습니다.
2. #{파라미터명}
- Java의 PreparedStatement 방식으로 파라미터를 ' '으로 묶어 데이터 타입을 처리해 줍니다.
<mapper namespace="맵퍼이름">
<select id="연결ID" parameterType="hashMap" resultType="hashMap">
select * from table where col1 = #{col1};
</select>
#. 파라미터 null 체크
- 일반적인 경우 아래와 같은 null 체크를 통해 처리해 줍니다.
- null인 것을 체크할 때에는 'param == null' or "".equals(param)'과 같이 equals()를 붙여서 체크해 줍니다.
<if test='param != null and !"".equals(param)'>
#{param}
</if>
<if test='param == null or "".equals(param)'>
<if test='param1 != null and !"".equals(param1)'>
#{param1}
</if>
</if>
- 배열로 분류되는 파라미터의 경우 빈 배열이라 하더라도 객체가 전달되므로 null 체크가 되지 않습니다.
- 따라서 길이로 체크해 줍니다.
<if test='list.length > 0'>#{list}</if>;
#. foreach
- 파라미터가 다중값인 경우 자바에서 처리할 수도 있지만 foreach를 이용해 처리도 가능합니다.
- 자바에서 HTTPServletRequest의 getParameterValues로 HTML의 name을 지정해 해당 name의 모든 값을 호출하는 전처리 과정 후 mapper에서 in의 값으로 넣어줍니다.
AND col1 IN
<foreach item="col1" collection="col1List" open="(" close=")" separator=",">
#{mid}
</foreach>
<!-- 결과 -->
AND col1 IN
(
'data1'
,
'data2'
,
'data3'
,
'data4'
,
'data5'
)
#. 프로시저 호출
- 프로시저를 호출할 때에는 statementType 속성을 열어 CALLABLE을 추가해 줘야 정상적으로 프로시저를 실행할 수 있습니다.
<select id="연결ID" statementType="CALLABLE" resultType="hashmap">
{ Call 프로시저명(
, #{param1}
, #{param2}
, #{param3}
, '
<if test='param4 != null and !"".equals(param4)'>
${param4}
</if>
'
) }
</select>
#. 기타
- 작성한 쿼리에서 Alias를 넣지 않을 경우 오류가 발생하게 됩니다.
- ResultSet.getXXX(colName): could not look up name
#. 간략하게 myBatis에 대해서 살펴보았습니다.
#. 초기 설정을 잘 처리한 뒤엔 sql에 대한 부분만 신경 써서 처리하면 큰 문제없이 사용이 가능합니다.
===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================
728x90