이전 포스팅에서 Mybtis(ibatis), 오라클과 연동 설정을 해봤었는데요. 이번에는 Spring Mybatis Oracle 이 세가지를 연동해 보도록 하겠습니다.
이번 포스팅이 이전과의 다른 점은 바로 Spring이 추가됐다는 점인데요. 실무에 사용하는 구조와 가장 흡사한 구조이니 한번 따라해 보시기 바랍니다.
1. 프로젝트 구조
일단 기본적으로 spring sts,와 maven 설정 되어 있어야 합니다.
2. Maven 라이브러리 등록
프로젝트내의 pom.xml로 이동합니다.
다음과 같이 dependencies 에 repositories와 연동에 필요한 라이브러리를 작성해 주시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <repositories> <repository> <id>mesir-repo</id> <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url> </repository> </repositories> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.4.0</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> |
3. root-context.xml 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> //오라클 세팅 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="scott" /> <property name="password" value="tiger" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="mapperLocations" value="classpath*:aa/bb/cc/*.xml"/> //쿼리 정보 파일 경로 <property name="dataSource" ref="dataSource" /> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> </beans> |
다음과 같이 오라클에 대한 주소와 계정등을 입력하고 쿼리 정보가 담긴 파일의 경로를 지정해 줍니다.
4. 패키지 내의 Class 및 쿼리 파일 작성
이제 Mybatis에 필요한 설정은 끝났다고 보시면 됩니다.
이제 이 설정된 사항을 이용하여 DB만 접근하면 됩니다.
4.1 Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Controller public class HomeController { @Autowired Dao dao; @RequestMapping(value = "/", method = RequestMethod.GET) public void check(HttpServletRequest request, HttpServletResponse resp) throws Exception { List<DTO> list = dao.boardlistmain(); for(int i=0; i<list.size(); i++){ System.out.println(list.get(i).getEname()); } } } |
DB 접근 부분인 Dao 클래스를 Aotuwired로 연경하고 접근 url이 “/”일 경우(처음 페이지) 해당 로직을 수행합니다.
그리고 그 결과 값을 리스트 사이즈 만큼포문을 돌려서 해당 결과물을 출력합니다.
4.2 DTO
| public class DTO { private String ename; public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } } |
DB결과물을 담을 객체입니다.
DB 조회는 ALL을 이용하여 job, sal, deptno 등을 모두 조회하지만 DTO내에는 name을 설정해 놨기 때문에 이름만 매핑되어 객체담습니다.
4.3 DAO
| @Repository public class Dao { @Autowired private SqlSessionTemplate sqlSession; public List<DTO> boardlistmain() { // TODO Auto-generated method stub return sqlSession.selectList("Query.listAll"); } } |
root-context.xml에서 설정한 쿼리 파일을 찾는데요.
xml내의 namespace가 Query이고 그안의 listAll에 담긴 쿼리를 실행하고 결과값을 리턴 합니다.
4.4 DB xml설정
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="Query"> <select id="listAll" resultType="aa.bb.cc.DTO"> select * from emp </select> </mapper> |
EMP테이블의 모든 요소를 조회하며 반환타입을 DTO로 합니다.
하지만 객체안에는 String ename 만 존재하므로 조회한 값중 직원 이름 컬럼만 값을 담습니다.
5. 결과
포스팅 내의 소스를 복사해서 테스트하셔도 무방하지만 인터넷 특성상 복사를 하면 여러가지 요소로 인해에러가 발생한 케이스가 있었습니다.
만약 에러가 발생한다면 Spring Mybatis Oracle 연동 예제의 War파일을 첨부하였으니 테스트는 위의 파일을 다운받으셔서 하시면 되겠습니다.
1. File -> New -> Spring Legacy Project
2. Project name : 작성 할 프로젝트 명
Spring MVC Project 선택 후 Next
3. com.test.controller 로 설정
4. 생성 된 프로젝트 우클릭 후
Properties - > Java Compiler 클릭
(1) Java Compiler
(2) JDK Compliance -> Use compliance from execution environment... 체크 해제
(3) Compiler compliance level : 1.8로 변경 후 OK
( 자바 1.8 버전을 사용할 것이기 때문 )
5. 프로젝트 우클릭 -> Properties -> Project Facets
Java Version을 1.8로 변경 후 OK
6. pom.xml 이동
(1) ojdbc6를 사용하기 위한 repository 추가
| <dependencies> 태그 바로 위에 삽입 // ojdbc6를 사용하기 위한 repository 추가 <repositories> <repository> <id>oracle</id> <name>ORACLE JDBC Repository</name> <url>http://maven.jahia.org/maven2</url> </repository> </repositories> | cs |
(2) dependency 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <!-- mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.3.RELEASE</version> </dependency> <!-- ojdbc6 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.1.0.7.0</version> </dependency> <!-- spring test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.1.7.RELEASE</version> </dependency> | cs |
이렇게 추가된 것을 볼 수가 있습니다.
7. mybatis를 연동하기 위해
root-context.xml 설정
(1) root-context.xml로 이동
(2) Namespaces 이동 후
aop, beans, context, jdbc, mybatis-spring 체크
(3) Source 이동
(1) DataSource 설정
| <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"> <property value="oracle.jdbc.driver.OracleDriver" name="driverClassName" /> <property value="jdbc:oracle:thin:@localhost:1521:XE" name="url" /> <property value="DB아이디" name="username" /> <property value="DB패스워드" name="password" /> </bean> | cs |
(2) SqlSessionFactory 객체 설정
| <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="SqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property value="classpath:mybatis-config.xml" name="configLocation" /> <property value="classpath:/mappers/**/*Mappers.xml" name="mapperLocations" /> </bean> | cs |
(3) SqlSessionTemplate 설정
| <bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession" destroy-method="clearCache"> <constructor-arg name="sqlSessionFactory" ref="SqlSessionFactory" /> </bean> | cs |
8. mybatis-config.xml 생성
src/main/resources/ 경로에 mybatis-config.xml 생성
생성 후 아래와 같이 작성
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration> | cs |
9. mapper 패키지 생성 및 mapper 작성
src/main/resources/ 경로에 mappers 패키지 생성
생성 후 아래와 같이 작성
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="DAO에서 선언할 namespace"> </mapper> | cs |
이로써 기초 셋팅은 끝이납니다. 테스트해보시길...
출처: http://pjsprogram.tistory.com/2 [행배]
라이브러리 관리툴로는 maven을 사용한다고 전제한다.
Gradle이나 다른 툴을 사용한다면 http://mvnrepository.com에서 검색해서 집어넣자.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | < dependency >
< groupid >org.springframework</ groupid >
< artifactid >spring-jdbc</ artifactid >
< version >4.1.6.RELEASE</ version >
</ dependency >
< dependency >
< groupid >org.springframework</ groupid >
< artifactid >spring-orm</ artifactid >
< version >4.1.6.RELEASE</ version >
</ dependency >
< dependency >
< groupid >org.mybatis</ groupid >
< artifactid >mybatis</ artifactid >
< version >3.3.0</ version >
</ dependency >
< dependency >
< groupid >org.mybatis</ groupid >
< artifactid >mybatis-spring</ artifactid >
< version >1.2.2</ version >
</ dependency >
< dependency >
< groupid >commons-dbcp</ groupid >
< artifactid >commons-dbcp</ artifactid >
< version >1.4</ version >
</ dependency >
< dependency >
< groupid >mysql</ groupid >
< artifactid >mysql-connector-java</ artifactid >
< version >5.1.35</ version >
</ dependency >
< dependency >
< groupid >com.oracle</ groupid >
< artifactid >ojdbc14</ artifactid >
< version >10.2.0.4.0</ version >
</ dependency >
< repositories >
< repository >
< id >mesir-repo</ id >
</ repository >
</ repositories >
|
bean 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | < bean id = "dataSource" class = "org.apache.tomcat.dbcp.dbcp.BasicDataSource" >
< property name = "driverClassName" value = "oracle.jdbc.driver.OracleDriver" >
< property name = "url" value = "jdbc:oracle:thin:@아이피:1521:xe" >
< property name = "username" value = "사용자 이름" >
< property name = "password" value = "비밀번호" >
</ property ></ property ></ property ></ property ></ bean >
< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >
< property name = "driverClassName" value = "com.mysql.jdbc.Driver" >
< property name = "url" value = "jdbc:mysql://아이피:포트" > < property name = "username" value = "사용자 이름" >
< property name = "password" value = "비밀번호" >
</ property ></ property ></ property ></ property ></ bean >
< bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" >
< property name = "dataSource" ref = "dataSource" >
< property name = "mapperLocations" value = "classpath*:/mapper/*/*.xml" >
< property name = "configLocation" value = "classpath:/mapper/sql-map-config.xml" >
</ property ></ property ></ property ></ bean >
< bean id = "sqlSessionTemplate" class = "org.mybatis.spring.SqlSessionTemplate" >
< constructor-arg index = "0" ref = "sqlSessionFactory" >
</ constructor-arg ></ bean >
< bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name = "dataSource" ref = "dataSource" >
</ property ></ bean >
|
Oracle과 mysql 설정을 두 개 넣어놨는데, 둘중 하나만 사용한다면 주석 처리를 해야 한다.
만약 둘 다 사용하고 싶다면 다른 하나의 id를 다르게 주고, SqlSessionFactory/SqlSessionTemplate/Transaction 부분을 따로 설정해준다.
sql-map-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
1 2 3 4 5 6 | < configuration >
< typealiases >
</ typealiases >
</ configuration >
|
SqlSessionFactory 설정 부분에서 mapperLocations를 지정해줬기 때문에 sql-map-config.xml에서 mapper에 대한 부분을 따로 설정해줄 필요는 없다.
간단하게 alias나 지정해주는 정도.
좀더 뭔가를 써먹고 싶다면 mybatis 가이드(http://mybatis.github.io/mybatis-3/ko)를 참고하자.
maaper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1 2 3 4 5 6 7 | < mapper namespace = "user" >
< select id = "getUserList" resulttype = "xxx.xxx.UserDTO" >
SELECT * FROM USER
</ select >
</ mapper >
|
UserDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.util.List;
import javax.annotation.Resource;
import xxx.xxx.UserDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.session.SqlSession;
@Repository ( "UserDAO" )
public class UserDAO {
@Autowired
@Resource (name = "sqlSessionTemplate" )
private SqlSession sqlSessionFactory;
public List<userdto> getUserList() {
return sqlSessionFactory.selectList( "user.getUserList" , null );
}
}
</userdto>
|
UserService.java
1 2 3 4 5 6 7 8 | import java.util.List;
import xxx.xxx.UserDTO;
public interface UserService {
public List<userdto> getUserList();
}
</userdto>
|
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import xxx.xxx.UserDAO;
import xxx.xxx.UserDTO;
@Service ( "UserService" )
public class UserServiceImpl implements UserService{
@Resource (name = "UserDAO" )
private UserDAO userDAO;
@Override
public List<userdto> getUserList() {
return userDAO.getUserList();
}
}
</userdto>
|
UserController.java 에서 사용할 땐, 다음과 같이 사용한다.
1 2 | @Resource (name = "UserService" )
private UserService userService;
|