web/Spring

Mybatis 관련 정리

반응형

iBaties
Mybatis이전 버전인 iBaties 개발자가 모든 SQL XML 작성하고, SQL 문을 사용하는 DAO 클래스를 설계하는 SQL문을 사용하는 DAO 클래스를 설계해서 SQL 문을 호출하는 방식의 코드
 
Mybatis
Mybatis ibaties에서 애노테이션을 지원하고 인터페이스와 애노테이션을 통해서 SQL 문을 설정하고처리할  있는 형태로 발전
 
Mybaties 특징
XML만을 이용해서 SQL문을 설정, DAO에서는 XML 찾아서 실행하는 코드를 작성하는 방식 (대표적으로 사용)
-> SQL 문은 별도의 XML 작성되기 때문에 SQL문의 수정이나 유지보수에 적합
-> 개발  코드의 양이 많아지고복잡성이 증가
애노테이션과 인터페이스만을 이용해서 SQL문을 설정
-> 별도의 DAO없이도 개발이 가능하기 때문에 생산성 증가
-> SQL 문을 애노테이션으로 작성하무로매번 수정이 일어나는 경우 다시 컴파일
인터페이스와 XML 작성된SQL 
-> 간단한 SQL 문은 애노테이션으로복잡한 SQL문은 XML 처리하므로상황에 따라서 유연하게 처리
-> 개발자에 따라 개발방식의 차이가 있으므로 유지보수가 어려움.
 
Mybatis XML 사용해서 작성하는 코딩의 순서
- 테이블 생성  개발 준비
테이블 생성  기타 데이터베이스 관련 설정
도메인 객체의 설계  클래스 작성
DAO 인터페이스의 작성
실행해야 하는 기능을 인터페이스로 정의
XML Mapper 성성과 SQL 작성
XML 작성  SQL 작성
MyBaties에서 작성된 틔 mapper를 인식하도록 설정
DAO 구현
DAO 인터페이스를 구현한 클래스 작성
스프링상에 DAO 등록  테스트
 
도메인 클래스는 특정 테이블과 유사한 속성을 가지는 클래스를 의미한다.
 
VO 객체는 데이터를 담는 형식의 클래스이고,
DAO 클래스는 데이터를 처리하는 인터페이스이다.
Mabatis에서 SQL 문을 저장하는 존재를 Mapper라는 용어로 표현한다.



Mapper XML 인터페이스를 이용할  있는데, XML 사용하는 경우의 순서는 다음과 같다.
XML 작성된 Mapper 위치 결정 (JAVA 소스와 별개로 resources 같은 경로를 이용하여 mapper라는 페키지를 생성하여 보관)
XML Mapper 파일을 작성하고 필요한 DTD 추가
SQL 작성
Mapper 작성  namespace 속성은 클래스의 패키지와 유사한 용도로 mybatis내에서 원하는 SQL 문을 찾아서 실행할  동작한다.
 
Mapper 작성한 후에 root-context.xml 해당 mapper 위치를 등록해준다.
 
  실제 구현 클래스를 작성해야 하는데 Mybatis에서 DAO 이용하는 경우는 sqlSessionTemplate라는 것을 설정해서 작업해야 한다.
->sqlsessiontemplate DB 연결을 맺고 close 자동으로 해주기에 조금  편리한 서비스를  있도록 mybatis-spring에서 제공해 준다.
->sqlSessionTemplate sqlSessionFactory 생성자로 주입해서 설정한다.
 
DAO구현 
@Repository  -> DAO 스프링에 인식 시키기 위해서 사용
public class MemberDAOImpl implements MemberDAO{
 
@Inject
private SqlSession sqlSession;
 
private static final String namespace = "com.test.mapper.memberMapper";
 
@Override
public String getTime() {
return sqlSession.selectOne(namespace +".getTime");
}
 
@Override
public void insertMember(MemberVO vo) {
sqlSession.insert(namespace + ".insertMember", vo);
}
 
}
 
 
sqlSession selectOne, selectList, selectMap 데이터를 DB에서 추출하고 insert, update, delete DB 데이터를 조작할  사용된다.
@Repository 애노테이션을 설정하더라도 스프링에서 제대로 스캔하지 못하는 경우가 있으므로 제대로스프링의 빈으로 등록하기 위해서 root-context.xml 이용해서 아래와 같이 설정이 필요한다.
Root-context.,xml
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="com.test.persistence">
</context:component-scan>
 
 
동작 방식 정리
Root-context.xml DB 정보를 datasource라는 id형태로 삽입
데이터를 삽입할 형태인 vo객체 생성
동작을 정의한 DAO 클래스의 interface 생성
Interface 구현한 DAOImpl 클래스 생성
Mapper xml 통해 동작에 맞는 xml형태의 문장을 삽입한다.  (name space 주의할 )
<mapper namespace="com.test.mapper.memberMapper">
 
<select id="getTime" resultType="string">
select now()
</select>
 
<insert id="insertMember">
insert into tbl_member (userid, userpw, username, email) values (#{userid}, #{userpw}, #{username}, #{email})
</insert>
 
 
</mapper>
Root-context.xml DB 연결에 중요한 sqlSissionFactory sqlsessionTemplate 생성
<!-- 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객치 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml"></property> <!-- mybatis 환경설정 파일 연결 -->
<property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml"></property>
</bean>
 
<!-- SQLSessionTemplate 만들기 (sqlsessionfactory를 주입해서 만든다._ -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
 
테스트 코드 작성
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class MemberDAOTest {
 
@Inject -> inject 애노테이션은 의존성 주입으로  3자에게 객체를 생성 받아지는 방법
private MemberDAO dao;
 
@Test
public void testTime() throws Exception {
System.out.println(dao.getTime());
}
 
@Test
public void testInsertMember() throws Exception {
MemberVO vo = new MemberVO();
vo.setUserid("user00");
vo.setUserpw("user00");
vo.setUsername("USER00");
vo.setEmail("user00@aaa.com");
 
dao.insertMember(vo);
}
}
 
Sql 오류에 대비한 log4j 설정 방법
->  부부을 pom.xml 추가하여 라이브러리를 추가한 다음
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
 
-> root-context.xml 부분의 driverClassName 부분을 아래와 같이  변경 해주어야한다.
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url" value="jdbc:log4jdbc:mysql://192.168.25.57:3306/book_ex"></property>
<property name="username" value="root"></property>
<property name="password" value="ddd00"></property>
</bean>
 
또한 별도의 로그 관련 설정 파일이 존재하여야 한다.
/src/main/resources 폴더에 log4jdbc.log4j2.properties 파일과 logback.xml 파일을 추가 해야한다.
 
Log4jdbc.log4j2.properties
logtjdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
 
Logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
 
<!-- log4jdbc-log4j2 -->
<logger name="jdbc.sqlonly" level="DEBUG"/>
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="WARN"/>
<logger name="jdbc.resultset" level="ERROR"/>
<logger name="jdbc.resultsettable" level="ERROR"/>
<logger name="jdbc.connection" level="INFO"/>
 
</configuration>
 
 
설정  다음과 같은 오류가 발생한다면 
- log4j-api-2.0.1.jar
- log4j-core-2.0.1.jar
 
두개의 라이브러리 파일이 존재하는지 확인해 봐야한다.
 
<오류내용>
Property 'driverClassName' threw exception; nested exception is java.lang.NoClassDefFoundError: Unable to find Log4j2 as default logging library. Please provide a logging library and configure a valid spyLogDelegator name in the properties file.
ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@2669b199] to prepare test instance [org.zerock.web.MemberDAOTest@2474f125]
java.lang.IllegalStateException: Failed to load ApplicationContext

반응형

'web > Spring' 카테고리의 다른 글

STS의 github 연동  (0) 2016.12.21
Mybatis의 #{} 문법 사용방법  (0) 2016.12.21
Spring의 UTF-8 처리 필터 등록  (0) 2016.12.21
스프링 프레임워크의 기본적인 구성  (0) 2016.12.21
typeAliases 사용방법  (0) 2016.12.21