[Spring]mybatis-Spring

내용
xmlconfig
javaconfig
SqlSessionTemplate
진행일시
2021/03/19
속성

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
복사