혜미의 개발 일지
[프레임워크] mybatis 와 ibatis 구조 차이 본문
mybais와 ibatis는 둘다 스프링에서 sql(DB)를 연결해주는 일종의 프레임워크이다.
우리가 서비스를 사용해서 다오랑 impl을 사용하는 이유는 객체지향과 트랜잭션을 이용해서 에러시 원인을 더 빨리 파악하기 위함이라고 들었다.
그리고 mybais와 ibatis와 같은 프레임워크를 사용하는 이유는 DB를 직접적으로 연결하는 것
즉, jdbc로 직접 처리하는 방법보다 코드의 설정(Connection) 부분을 줄이고 실제 sql문에 연결함으로서 빠른 개발이 가능하도록 사용한다고 알고 있다.
내가 여기 입사할 당시에는 spring프로젝트에 mvc패턴과 ibatis를 사용해왔는데 몇개월 후 ibatis의 단점을 보안하기 위해 mybatis로 바꾸었다.
처음에는 그 둘의 차이를 잘 모른채 구조를 바꿨는데 이번에 잘 정리하여 현재 프로젝트의 구조를 다시 점검해보려 한다.
먼저 ibatis와 mybatis의 개념과 사용법을 위키백과를 참조하여 찾아봤다.
iBATIS(아이바티스)는 SQL에 기반한 데이터베이스와 자바, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크(Persistence Framework)이다. 이러한 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동한다.
또 다른 영속성 프레임워크인 하이버네이트(Hibernate)와 비교하여 하이버네이트는 객체모델을 사용자가 생성을 하면 프레임워크에서 데이터베이스와 연결을 시켜주는 방식인데 반해 iBatis는 사용자가 SQL 문장을 만들면 그에 적합한 객체모델을 생성하는 방식으로 작동한다.
사용법
데이터베이스 테이블 PRODUCT (PROD_ID INTEGER, PROD_DESC VARCHAR(64)) 및 자바 클래스 com.example.Product (id: int, description: String)가 있다고 치자. PROD_ID 키에서 새로운 Product POJO로 제품 레코드를 읽으려면 다음의 매핑을 iBATIS XML 매핑 파일에 추가한다:
<select id="getProduct" parameterClass="java.lang.Long" resultClass="com.example.Product">
select PROD_ID as id,
PROD_DESC as description
from PRODUCT
where PROD_ID = #value#
</select>
그러면 제품 번호 123에 대해 데이터베이스에서 새로운 자바 Product 오브젝트를 다음과 같이 검색한다:
Product resultProduct = (Product) sqlMapClient.queryForObject("getProduct", 123);
마이바티스(MyBatis)는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션(annotation)을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다.
마이바티스는 아파치 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
마이바티스는 IBATIS 3.0의 포크이며 IBATIS의 원 개발자들이 포함된 팀에 의해 유지보수되고 있다.
사용법
SQL 문은 XML 파일이나 애너테이션에 저장되어 있다. 아래는 마이바티스 매퍼를 기술하며 일부 마이바티스 애너테이션이 있는 자바 인터페이스를 구성한다:
package org.mybatis.example;
public interface BlogMapper {
@Select("select * from Blog where id = #{id}")
Blog selectBlog(int id);
}
위의 문은 다음과 같이 실행된다.
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
SQL 문들과 매핑들은 다음과 같이 XML 파일로 표면화할 수 있다.
<?xml version="1.0" encoding="UTF-8" ?>
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>
문들은 마이바티스 API를 사용하여 실행할 수도 있다.
Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
[참조 : 위키백과]
예전 ibatis 경우 sql을 연결하기 위해서 sql-map-config-DB.xml 파일에 sqlMapConfig xml 리소스를 선언 해주면 스프링 프로젝트가 돌면서 그 위치를 찾아서 DAO 파일이 xml 쿼리를 찾아서 동작하였었다.
sql-map-config-DB.xml 예시)
<sqlMap resource="egovframework/sqlmap/sql/mssqlDB/member/Member_SQL.xml" />
그에 반면 mybatis의 경우는 mapper를 이용해 DAO에서 선언한 쿼리(xml)를 찾는 구조라고 보면 된다.
현재 프로젝트 구조는 서비스에서 메소드를 선언하고..
memberService.java 예시)
public interface MemberService {
public MemberVO loginCheck(String userId) throws Exception;
}
impl은 서비스를 상속받고 그리고 impl에서는 다오를 입력해서 메소드를 불러온다.
MemberServiceImpl.java 파일 예시)
@Service("MemberService")
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberServiceDAO memberServiceDAO;
@Override
public MemberVO loginCheck(String userId) throws Exception {
return (MemberVO) memberServiceDAO.loginCheck(userId);
}
}
그리고 DAO에 @Repository를 선언하여 쿼리 ip를 적어 사용한다.
DAO파일 예시)
@Repository("MemberServiceDAO")
public class MemberServiceDAO extends EgovAbstractMapper {
public MemberVO loginCheck(String userId)throws Exception{
return (MemberVO)selectOne("loginCheck", userId);
}
}
(그리고 원래는 이사이에 매퍼가 작동하여 xml쿼리를 연결해주고 있어야하는데...)
mapper 파일 예시)
@Repository("MemberServiceMapper")
public interface MemberServiceMapper {
public MemberVO loginCheck(String userId) throws Exception;
}
xml에 쿼리 맨위에 네임스페이스를 작성한걸 연결시켜 쿼리를 찾는다.
Member_SQL.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="com.프로젝트명.member.service.impl.MemberServiceDAO">
<select id="loginCheck " parameterType="java.lang.String" resultType="memberVO">
/** 로그인체크 ::: loginCheck */
<![CDATA[
]]>
</select>
</mapper>
그렇다면 현재 xml파일에서 네임스페이스에서 바로DAO로 선언해서 매퍼를 거치지 않고 있는 것은 아닐까?
이어서 작성중입니다.
'프레임워크 > Spring framework' 카테고리의 다른 글
[Spring Security] 패스워드 암호화 Bcryptpasswordencoder (0) | 2022.05.03 |
---|---|
[Web] JWT 토큰 방식 적용하기 (0) | 2022.04.27 |
[Java] 자바 파일 업로드& 다운로드 구현하기 (0) | 2022.03.10 |
[Spring] 스프링 서블릿이란 (0) | 2022.03.10 |
[Spring] 스프링 MVC 패턴과 서비스 impl 관계정리 (0) | 2022.03.10 |