[ Mybatis 프레임워크 ] 새로운 DAO 관리
[ Mybatis 프레임워크 ]
Ibatis라는 이름으로 시작됨
>> Ibatis가 보인다 = 예전코드구나, Mybatis구나 ( 문법은 조금 다름 )
※ 사용이유
1) DB연동을 담당하는 JAVA 코드를 1~2줄로 줄일수 있음 [ 가독성이 좋아짐 ]
2) SQL 문은 JAVA코드에서 분리하여 XML 파일로 별도 관리가능 [ 응집도 ↑↑↑ ]
즉, 유지보수 용이
※ 팀 프로젝트에 적용하는 방법?
1) **우리가 어필해야하는 부분 >> 여러가지 버전의 DAO를 빠르게 교체 가능
@Repository(DAO 클래스)
+ @Service(Serviceimpl 클래스)
>> [ 2 layered 아키텍처 ]를 이용하여 교체
2) 상대적으로 간단한 기능들의 CRUD를 Mybatis로 구현
MybatisDAO를 제작할 예정
>> 회원가입, 댓글등록 등등
3) 상대적으로 복잡한 기능들의 CRUD는 기존의 JDBC or JDBCTemplate으로 구현
>> 사용자의 Tier별 할인률적용로직 등등
※ 동작방법
1) XML 파일에 저장된 SQL 문을 실행
2) 실행의 결과를 VO(JAVA객체)에 자동으로 매핑까지 수행함
Mybatis 사용하기위해 설치가 필요
마켓플레이스 >> mybatis 1.4.1, 1.2.5 버전 다운로드 >> 허가필요, 덮어쓰기, 체크할 부분은 모두 체크
>> 한 버전 다운받을때마다 ReStrat 하기
플러그인을 설치하였으며, 사용하기 위해서는 jar 파일이 필요하다
pom.xml에 작성하여 추가한다
이제 사용해보자
1) DB 연동에 필요한 SQL 문을 XML 파일에 저장
테이블명-mapping.xml로 생성
src폴더에 만든 해당 xml파일들을
src/main/resources 폴더안에 mappings 패키지를 생성하여 관리
board-mapping.xml 내부에 SQL문을 가득 넣을 예정
>> namespace 여기 이름을 뭘로 할지 정하는 것 = BoardDAO
실무에서 SQL문을 java가 아닌 xml로 관리를 하게된다면
소문자 대문자 상관없이 작성하는 경우가 많으니 참고
로직에 맞는 < 태그 > 들이 존재하며 id값으로 해당 이름을 만든다
태그바디에는 SQL문을 작성하고 ?를 넣던 부분을 #{} 을 이용해 만들어 준다
select 문은 아웃풋이 존재하므로 resultType 속성을 걸어주며, 어떤 타입을 넣을지 작성
하지만 ** board에 대한 설명을 해주어야 한다
>> 2) 에서 할 예정
2) SQL문을 사용하기 위해선 DB 연동을 해주어야 한다
마찬지로 src 폴더위에 먼저 생성후에, 폴더로 옮겨주는것을 권장한다
sql-map-config.xml 이름으로 생성해준다 ( 주로 이 이름으로 생성 )
기본적으로 해당 xml 내부에 코드가 작성되어있지만, 모두 지우고
위와 같이 작성한다
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
plugins
environments
databaseIdProvider
mappers
<configuration> 태그바디에 사용할 수 있는 태그인데,
위의 순서로 작성하지 않으면 오류가 발생한다
ex) <mappers> 태그를 가장 위에 생성하면 오류가 발생한다
1) <properties resource="db.properties" />
DB연동을 위한 정보들을 가지고있는 properties 연동하는 태그
2) <typeAliases type="com.kim.biz.board.BoardVO" alias="board" />
board-mapping.xml 내부의
resultType에 사용할 board를 객체가 무엇인지 알려주기 위해 설정하는 태그
type="클래스지정" alias="사용할 이름"
3) DB연동태그 <environments>
위와같은 형식으로 작성하고
${} 으로 properties에 저장된 값들을 불러올 수 있다
4) <mapper resource="mappings/board-mapping.xml" />
사용할 SQL을 모아둔 mapping.xml과 연동하는 태그
DAO 에서 사용해 보자
DAO에서 사용하기 위해선 Mybatis에서 제공하는 SqlSession 객체를 사용해야한다!
>> Factory 패턴으로 얻을 수 있고, 이부분이 Spring이 대체해 줄 부분이다
※ 오늘은 Spring에 연동하지 않고 내부적으로 어떻게 돌아가는지를 표현한 것
com.kim.biz.common 패키진 내부에 일반 자바 클래스로 생성
SqlSessionFactory 객체를 멤버변수로 생성하고 처음엔 null로 대입
Factory가 존재하지않는다면
xml 읽어줄 Reader 객체를 이용하여 xml 파일을 로딩해주고
읽어준 Reader의 객체를 Factory 객체에 넣어준다
그리고 SqlSession 객체를 내보내주는 메서드를 만들었다
그리고 Mybatis를 이용하여 사용할 DAO3 클래스를 만들어 준다
생성자에 SqlSession객체를 꺼내줄 메서드를 넣어준다
>> 객체화하면 자동으로 SqlSession 객체를 불러와 주기 때문
mybatis.insert
mybatis.update
mybatis.delete
내부에 vo객체는 자동으로 setter 해주고
" 사용할 SQL문 "은 xml에 저장한 id값이다
mybatis.selectOne
mybatis.selectList
selectOne과 selectAll을 사용하기위한 mybatis 메서드다
** 사용할 SQL문은 xml에 저장한 namespace + id값을 이용한다
client로 돌려볼 예정
클라이언트로 Mybatis를 이용한 DAO3를 돌려보자
title 중에 "마"가 들어간 모든 글을 출력하는 로직
총 4번을 돌려보았고 insert가 4번되어 4개가 출력되는 모습
+) CDATA
xml에서 SQL문을 작성시
<= 20 처럼 < 부등호를 이용해야 할수도 있는데
< 부등호를 태그로 인식하여 원인이 발생하는 일이 생긴다
이 문법은 Mybatis 문법이 아닌, XML문법이다
XMl의 내용은 XML 파서가 해석을 통해 설정을 이해함
이와 같이 <![CDATA[ 내부 바디 ]]> 안에 적게 되면
해당 영역의 글은 XML 파서가 해석하지 않는다
+) resultMap 속성
board-mapping.xml
SQL문 결과값을 resultMap에 설정한 대로 매핑해줄 수 있다
VO에 멤버변수로 이름을 자유롭게 정할 수 있기 때문에
SQL 결과의 칼럼명과 VO객체의 멤버변수명이 다를 때 사용한다
column 에 SQL문 칼럼값을 적고,property 에 VO의 매핑할 멤버변수명을 적어주면 된다
지금은 일치하기 때문에 크게 사용하진 않을 것 같다
하지만 VO를 바꿀수 없는 시기에 사용할 법 할 태그이다