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 |