이전 블로그에서 myBatis를 사용하면서 DAO Interface를 만들고, DAO를 구현한 클래스를 사용하는 방법을 테스트해 보았다. DAO를 구현하지 않고 Interface의 메소드만 선언하면 myBatis에서 자동 구현되어 사용할 수 있게 하는 방법을 알아보자
1. Mapper 인식하는 방식
- Spring context xml에 설정하기 : UserMapper는 단순 Interface
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
- Mapper scanner를 등록하는 방식 : component-scan과 유사하게 mapper를 검색해 준다 (안됨)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<mybatis:scan base-package="org.mybatis.spring.sample.mapper" />
</beans>
- @MapperScan 애노테이션 사용 : java로 환경설정
@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().addScript("schema.sql").build()
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
return sessionFactory.getObject();
}
}
- MapperScannerConfigurer 사용 : 본 셋팅에는 해당 설정을 사용한다
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mobiconsoft.dashboard.mapper" />
</bean>
2. pom.xml의 myBatis 버전 업그레이드
- mybatis-spring.jar 에서 1.2 이상의 최신 버전을 사용토록 한다
<mybatis.spring.version>1.2.1</mybatis.spring.version>
<mysql.connector.version>5.1.27</mysql.connector.version>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
3. myBatis Mapper 환경 설정
- 위치를 webapp 폴더 밑으로 옮긴다
- dbpool-context.xml의 환경설정 변경 : id 명칭은 내부적으로 동일 이름을 사용하니 변경하지 말자
<!-- mybatis sql session template -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml" />
<property name="configLocation" value="/WEB-INF/mybatis-config.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
<!-- mybatis mapper auto scanning -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mobiconsoft.dashboard.mapper" />
</bean>
- mybatis-config.xml 내역 수정
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
</configuration>
- Person.xml 맵퍼 xml 파일명칭을 PersonMapper.xml 로 변경하고 WEB-INF/classes/mappers/ 폴더 밑으로 이동한다
+ namespace는 반드시 PersonMapper interface 파일이 있는 위치를 명시한다
+ resultType, parameterType 시에 full package + class 명칭을 명시한다
<mapper namespace="com.mobiconsoft.dashboard.mapper.PersonMapper">
<resultMap id="person" type="com.mobiconsoft.dashboard.domain.Person" >
<result property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<select id="getPersons" resultType="com.mobiconsoft.dashboard.domain.Person">
SELECT
*
FROM
person
</select>
<select id="getPerson" parameterType="Integer" resultType="com.mobiconsoft.dashboard.domain.Person">
SELECT
*
FROM
person
WHERE
id=#{id}
</select>
<insert id="savePerson" parameterType="com.mobiconsoft.dashboard.domain.Person">
INSERT INTO
person(id, name)
VALUES
(#{id}, #{name})
</insert>
<update id="updatePerson" parameterType="com.mobiconsoft.dashboard.domain.Person">
UPDATE
person
SET
name=#{name}
WHERE
id=#{id}
</update>
<delete id="deletePerson" parameterType="Integer">
DELETE FROM
person
WHERE
id=#{id}
</delete>
</mapper>
- 이제 PersonDAO.java interface를 PersonMapper.java로 바꾸어 보자
+ PersonMapper.xml 에서 정의한 parameterType은 메소드의 파라미터 타입와 일치해야 한다
+ PersonMapper.xml 에서 정의한 resultType은 메소드의 리턴 타입과 일치해야 한다
@Repository(value="personMapper")
public interface PersonMapper {
public List<Person> getPersons();
public Person getPerson(int id);
public void savePerson(Person person);
public void updatePerson(Person person);
public void deletePerson(int id);
}
- grunt build 할 때 WEB-INF/ 밑의 모든 폴더/파일 dist 폴더에 copy하는 옵션 변경
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt,html}',
'.htaccess',
'bower_components/**/*',
'images/{,*/}*.{gif,webp}',
'styles/fonts/*',
'WEB-INF/**/*'
]
- PersonService Interface 제거하고 구현체를 PersonService로 변경하였음. 최종 소스 디렉토리
+ controller : RESTful 요청 처리
+ service : 실제 업무 트랜잭션 @Transactional 처리
+ mapper : myBatis mapper interface
+ domain : 비즈니스 객체. 주로 테이블과 1:1 맵핑되는 Model
- 실행
* 저장소 : https://github.com/ysyun/SPA_Angular_SpringFramework_Eclipse_ENV/tree/feature_mybatis_mapper
<참조>
'My Projects > BI Dashboard' 카테고리의 다른 글
[BI Dashboard] Angular.js 엔터프라이즈 애플리케이션 구조 만들기 (0) | 2013.11.22 |
---|---|
[BI Dashboard] Angular+Bootstrap을 Windows와 IE8 이상에 적응시키기 (0) | 2013.11.21 |
[BI Dashboard] Spring + MyBatis 연동 설정 및 테스트하기 (1) | 2013.11.20 |
[BI Dashboard] Eclipse용 Spring과 AngularJS Framework 개발환경 셋업하기 (0) | 2013.11.16 |
[BI Dashboard] Eclipse Juno에 Spring + Maven 환경설정 및 테스트 (0) | 2013.11.15 |