1. Mybatis-Spring 에서 javaconfig와 xmlconfig 설정방법
ㅁ mybatis-spring순서 MVC패턴과 유사하다.
크게 Application → Service→DAO순으로 간다고 생각하자 그리고 그 사이에 각각 ServiceImpl, DAOImpl등이 껴있다.
1. javaconfig을이용한 방법
ㅁ Application
package com.greedy.section01.connection.javaconfig;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.greedy.section01.connection.javaconfig.config.ContextConfiguration1;
public class Application {
public static void main(String[] args) {
1.javaconfig을이용하기위해서 annotation방법을이용한다.
ApplicationContext context = new AnnotationConfigApplicationContext(ContextConfiguration1.class);
System.out.println("메뉴조회");
MenuService menuService = context.getBean("menuService", MenuService.class);
List<MenuDTO> menuList = menuService.selectMenuList();
for(MenuDTO menu : menuList) {
System.out.println(menu);
}
}
}
Java
복사
ㅁ Configuration
package com.greedy.section01.connection.javaconfig.config;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.greedy.section01.connection.javaconfig.Application;
1.configuratin 설정
@Configuration
2.ComponentScan설정후 범위에서 @있는거 다 스캔
@ComponentScan("com.greedy.section01.connection.javaconfig")
3. resources에 있는 properties를 참고하기위한 설정
@PropertySource("connection-info.properties")
public class ContextConfiguration {
@Value("${oracle.dev.driver}")
private String driver;
@Value("${oracle.dev.url}")
private String url;
@Value("${oracle.dev.username}")
private String username;
@Value("${oracle.dev.password}")
private String password;
destroy의 폐기라는 특징을 이용하여 close를 해준다.
@Bean(destroyMethod = "close")
BasicDataSource를 임포트를 해주기위해서는 commons-dbcp라이브러리가 필요
public BasicDataSource dataSource() {
/* commons-dbcp 라이브러리 추가
* hikary cp 추가로 볼 사람은 볼 것 */
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDefaultAutoCommit(false);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory(ApplicationContext context) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
1.자연스럽게 setter주입이 일어날수있도록 dataSource()를 넣어줌
factoryBean.setDataSource(dataSource());
factoryBean.setConfigLocation(context.getResource("com/greedy/section01/connection/javaconfig/config/mybatis-config.xml"));
2. return값으로 factoryBean.getObjcet로 반환
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(ApplicationContext context) throws Exception {
//sqlSession쪽 생성자라서
return new SqlSessionTemplate(sqlSessionFactory(context));
}
}
Java
복사
ㅁ Mybatis-config.xml
Configuration에서 factoryBean.setConfigLocation(context.getResource("com/greedy/section01/connection/javaconfig/config/mybatis-config.xml"));에 값을넣어주기위해서 mybayis-config.xml를 작성한다
configuration태그 설정후 그 안에 mappers태그 설정 후 mapper태그 설정후 MenuMapper.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>
<mappers>
<mapper resource="com/greedy/section01/connection/javaconfig/mapper/MenuMapper.xml"/>
</mappers>
</configuration>
XML
복사
ㅁ. MenuSerivce
MenuService부분은 interface로 작성한다. 그 이유는 MenuService부분을 상속받으면 메소드를 강제화할수 있고 유지보수에도 좋기 때문이다.
package com.greedy.section01.connection.javaconfig;
import java.util.List;
public interface MenuService {
List<MenuDTO> selectMenuList();
}
Java
복사
ㅁ MenuSeriveImpl
MenuService interface를 상속받을 MenuServiceImpl 클래스를 만들어준다 . 그리고 MenuService를 상속해주고 오버라이드를 해준다. 그리고 전역변수로 MenuDAO와 DB에 연결을할수 있는 SqlSessionTemplate를 선언해준다. 클래스위에 어노테이션 Service를선언해주기
생성자를 사용하고 생성자의 매개변수로 MenuDAO 와 SqlSessionTemplate를 넣어준다 그리고 어노테이션Autowired를 사용해주자
Override부분에 return 값으로 menuDAO에 메소드를 작성한 후 DB에접속할수 있게 전역변수로 선언한sqlSession을 매개변수로넣어서 전달해준다
package com.greedy.section01.connection.xmlconfig;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//서비스는 @Service 계층
@Service("menuService")
public class MenuServiceImpl implements MenuService{
private final MenuDAO menuDAO;
private final SqlSessionTemplate sqlSession;
@Autowired//Autowired는 생략하지않고 그대로쓰자
public MenuServiceImpl(MenuDAO menuDAO, SqlSessionTemplate sqlSession) {
this.menuDAO = menuDAO;
this.sqlSession = sqlSession;
}
@Override
public List<MenuDTO> selectMenuList() {
return menuDAO.selectMenuList(sqlSession);
}
}
Java
복사
ㅁ MenuDAO
MenuDAO도 마찬가지로interface로 작성해준다
package com.greedy.section01.connection.xmlconfig;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
public interface MenuDAO {
List<MenuDTO> selectMenuList(SqlSessionTemplate sqlSession);
}
Java
복사
ㅁ MenuDAOImpl
MenuDAO interface를 상속받을 MenuDAOImpl를 작성해주고 MenuDAO를오버라이드 해준다.
return 값으로 sqlSession을 이용한 Mapper이름과 Mapper.xml에서 id값으로 사용할 이름을 작성해준다
package com.greedy.section01.connection.xmlconfig;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
//DAO는 @Repository
@Repository("menuDAO")
public class MenuDAOImpl implements MenuDAO {
@Override
public List<MenuDTO> selectMenuList(SqlSessionTemplate sqlSession) {
//Mapper이름명시하기=(MenuMapper)이거는 mapper.xml에서 namesapce로 사용될 이름이다
return sqlSession.selectList("MenuMapper.selectMenuList");
}
}
Java
복사
ㅁ MenuMapper.xml
DAOImpl클래스에서 return값으로 MenuMapper.selectMenuList는 Mapper.xml에서 namespace MenuMapper와 <select id="selectMenuList>을 의미한다.
<?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="MenuMapper">
<resultMap type="com.greedy.section01.connection.xmlconfig.MenuDTO" id="menuResultMap">
<id property="code" column="MENU_CODE"/>
<result property="name" column="MENU_NAME"/>
<result property="price" column="MENU_PRICE"/>
<result property="categoryCode" column="CATEGORY_CODE"/>
<result property="orderableStatus" column="ORDERABLE_STATUS"/>
</resultMap>
<select id="selectMenuList" resultMap="menuResultMap">
SELECT
A.MENU_CODE
, A.MENU_NAME
, A.MENU_PRICE
, A.CATEGORY_CODE
, A.ORDERABLE_STATUS
FROM TBL_MENU A
WHERE A.ORDERABLE_STATUS = 'Y'
ORDER BY A.MENU_CODE
</select>
</mapper>
XML
복사
2.xmlconfig작성법
javaconfig에서 configuration클래스부분을 xml로 변환한게 xmlconfig부분이라고생각하자
전체적인 흐름은 다 같지만 MenuDAOImpl이 아닌 MenuDAO.xml을 사용한다 그리고 DAO인터페이스와 DAO.xml은 같은하위폴더에위치해야한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- javaconfig에서 ContextConfiguration을 xmlConfig로 바꾸는법 -->
<!-- context 스키마 추가 -->
<context:property-placeholder location="connection-info.properties"/>
<!-- 빈 스캐닝할 basePackager설정 -->
<context:component-scan base-package="com.greedy.section02.mapperscan"/>
<!-- SqlSessionTemplate 빈 등록 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
<!-- sqlSessionFactioryBean등록 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="com/greedy/section02/mapperscan/config/mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- basiDataSource 빈등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${oracle.dev.driver}"/>
<property name="url" value="${oracle.dev.url}"/>
<property name="username" value="${oracle.dev.username}"/>
<property name="password" value="${oracle.dev.password}"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
<!-- MenuDAO를 찾게해주기 여러개기저정 가능 , xml이랑 클래스 가있는곳까지-->
<mybatis-spring:scan base-package="com.greedy.section02.mapperscan.model.dao"/>
</beans>
XML
복사
ㅁ MenuDAO.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="com.greedy.section02.mapperscan.model.dao.MenuDAO">
<resultMap type="com.greedy.section02.mapperscan.model.dto.MenuDTO" id="menuResultMap">
<id property="code" column="MENU_CODE"/>
<result property="name" column="MENU_NAME"/>
<result property="price" column="MENU_PRICE"/>
<result property="categoryCode" column="CATEGORY_CODE"/>
<result property="orderableStatus" column="ORDERABLE_STATUS"/>
</resultMap>
<select id="selectMenuList" resultMap="menuResultMap">
SELECT
A.MENU_CODE
, A.MENU_NAME
, A.MENU_PRICE
, A.CATEGORY_CODE
, A.ORDERABLE_STATUS
FROM TBL_MENU A
WHERE A.ORDERABLE_STATUS = 'Y'
ORDER BY A.MENU_CODE
</select>
</mapper>
XML
복사
ㅁ MenuServiceImpl
xmlconfig는 MenuDAOImpl을 사용하지않고 MenuDAO.xml를 사용하기때문에 전역변수를 SqlsessionTemplate만선언하지만 매개변수는 동일하게 dao와 sqlSession을 넣어준다 그리고 override에 return부분에서는 sqlSession.getMapper(MenuDAO.class).selectMenuList(); 이용해준다
package com.greedy.section02.mapperscan.model.service;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.greedy.section02.mapperscan.model.dao.MenuDAO;
import com.greedy.section02.mapperscan.model.dto.MenuDTO;
@Service("menuService")
public class MenuServiceImpl implements MenuService {
private final SqlSessionTemplate sqlSession;
@Autowired
public MenuServiceImpl(MenuDAO menuDAO, SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<MenuDTO> selectMenuList() {
return sqlSession.getMapper(MenuDAO.class).selectMenuList();
}
}
Java
복사