본문 바로가기

RUBYONRAILS

Spring 4.0 + Mybatis java config로 설정하기

솔루션을 만들어야 하는데

하이버네이트로 레거시 테이블들을 엮어줄 자신도 없을 뿐더러 엮은들 팀원들에게 역량을 기대할 수 없고 나조차 완벽하게 소화할 수 없다는걸 고려해서 Mybatis를 연동해서 구성하고 배포하기로 결정했다.

 

Spring 4.0 + Mybatis 3.1을 사용했다

그리고 Spring이랑 Mybatis와의 연동을 위해서 또 하나의 라이브러리가 필요한데

지금 한 설정을 위해서는

     <org.mybatis.version>3.1.1</org.mybatis.version>
     <org.mybatis.spring.version>1.2.1</org.mybatis.spring.version>

  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${org.mybatis.version}</version>
  </dependency>
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${org.mybatis.spring.version}</version>
  </dependency>

위와 같은 설정을 Maven에 추가 한다.

내가 봤던 mybatis 다큐먼트에서는 해당 설정의 mybatis.spriong.version을 1.1.1로 정의하고 있었는데 사용해보고 싶던 어노테이션이 import가 안되어서 1.2.1로 올려 설정하였다.

 

프로젝트 구조이다.

어노테이션 방식으로 각각의 controller,service,repository 간에 주입을 해주었고 원래는 Mapper가 없는 구조였으나 Mapper를 impl 패키지 내부에 포함시켜서 설정하였다.

 

아 참 전체적인 프로젝트 구조는 maven 구조로 생성했었다.

그리고 resouces/dwg/mapper로 HomeMapper.xml들을 구성했다.

HomeMapper.java

public interface HomeMapper  {
 
  @Select("SELECT * FROM EEAM_DRWNG_TBL")
  ArrayList<HashMap<String, String>> getDwgList();
 
  ArrayList<HashMap<String, String>> getDwgListXml();
}

@Select 어노테이션에 쿼리를 명시한 이유는 쿼리를 xml로 관리할 경우 추적하기 귀찮고 관리하기 좀 어려운 면이 있다보니 저렇게 사용해도 좋을 것 같다는 생각에 2개의 방식을 채택하기로 하였다.

아래 메서드는 .xml파일에 id로 매핑이 되는 설정이다.

@Repository(value="homeMapper") 설정으로 이 인터페이스를 MapperScan을 통해 매퍼로 등록하게 된다.

HomeServiceImpl.java

@Service("homeService")
public class HomeServiceImpl implements HomeService {

 @Autowired
 private SqlSession sqlSession;
 
 @Autowired
 private HomeMapper homeMapper;
 
 public ArrayList<HashMap<String, String>> getDwglist() {
  return homeMapper.getDwgList();
 }

 public ArrayList<HashMap<String, String>> getDwglistXml() {
  return homeMapper.getDwgListXml();
 }
}

서비스에서는 매퍼로 등록된 Bean을 Autowired를 통해 주입받는다 첫번째 메서드와 두번째 메서드를 통해서 HomeMapper의 메서드를 호출해서 각각의 매핑된 .xml이나 @Select로 실행하게 된다.

HomeMapper.xml

<mapper namespace="com.ese.dwg.service.impl.HomeMapper">

 <select id="getDwgListXml" resultType="java.util.HashMap">
  SELECT *
  FROM EEAM_DRWNG_TBL
 </select>
 
</mapper>

HomeMapper.java 인터페이스의 두번째 메서드와 매핑이 되는 ID를 가지고 있다. 두번째 메서드를 호출하게 되면 이 부분의 매핑된 정보를 통해서 쿼리를 수행하게 된다.

여기서 중요한 것은 하나만 정보를 달리해도 오류가 생기거나 조회가 되지 않는다는 것.

1. mapper namespace가 Mapper의 패키지명과 동일해야 한다.

2. HomeMapper.xml과 HomeMapper.java 파일의 파일명이 동일해야 한다.

3. HomeMapper.java의 각각의 메서드는 .xml의 리턴 타입이나 파라미터 인자와 동일해야 한다.

 

이제 설정!

이 설정은 java config를 통해서 설정한다.

참고로 이렇게 설정해보니 좀 더 객체 지향적인 구성이 될 수 있고 기존에 .xml 파일에서 설정하던 것들이 java로 어떻게 구현이 되는지 한눈에 보여지게 된다. 하다보면 이 구성이 좀 더 쉽게 구성할 수 있는 면도 존재하며 필요시 조건문을 통해서 프로젝트 설정을 달리 구성할 수 있다는 장점도 존재한다.

난 작년에 접해봤지만 포스팅 찾아보면 벌써 오래전부터 사용하던 분들이 많아 보인다.

다른 설정들은 다 해놨다는 가정하에..

@MapperScan("com.ese.**.service.impl")

클래스 명 선언부 위에 위와 같은 어노테이션을 추가 한다.

HomeMapper.java를 스캔하여 자동으로 등록해준다.

 @Bean
 public SqlSessionFactory sqlSessionFatory(DataSource datasource) throws Exception{
  SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
  sqlSessionFactory.setDataSource(datasource);
  sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:dwg/mapper/*.xml"));
  return (SqlSessionFactory) sqlSessionFactory.getObject();
 }

빨간 줄 친 부분이 없으면 HomeMapper.xml 파일 매칭할 수 있는 정보가 없어 HomeMapper.java의 두번째의 .xml의 ID 정보와 매핑되는 부분에서 에러가 난다. 매핑되는 statement가 없다고..

이런 설정을 통해서 .xml과 .java 간의 매핑을 해줄 수 있다.

 @Bean
 public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) {
  return new SqlSessionTemplate(sqlSessionFactory);
 }

마지막으로 SqlSessionTemplate를 통해서 Mybatis의 DAO에서 세션공유와 Thead Safe한 sqlSession을 제공받을 수 있다. 그냥 Mybatis Session을 관리해준다.

끝.

 

 

'RUBYONRAILS' 카테고리의 다른 글

[rails] ruby on rails 설치기  (0) 2013.10.08
[rails] 프로젝트 띄우기  (0) 2013.10.08
[rails] Rails + MySql 연동  (0) 2013.10.08
[rails] mySql 연동 후 게시글 조회  (0) 2013.10.08