코딩 개발/Spring

MyBatis 2탄 - SqlSessionTemplate, XML config

호소세 2023. 7. 11. 21:49
728x90
반응형

MyBatis 1탄 : https://pabeba.tistory.com/196

 

1탄에 이어서 2탄에서는 SqlSessionTemplate을 이용하여 더욱더 간편하게 sql을 실행해 보도록 합시다.

 

1탄에서의 모든 설정은 같은데 실행하는 메서드만 다릅니다. 

 

SqlSessionTemplate 으로 Sql 실행하기

새로운 글이니까 다시 한번 설정을 보도록 하겠습니다.

 

멤버의 총 인원수를 세는 함수를 만들어보겠습니다.

 

<AppConfig.java>

@Configuration 
@ComponentScan("myproject") 
public class AppConfig {
	@Bean	
	public DataSource dataSource() {
		BasicDataSource dataSource=new BasicDataSource();
		dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
		dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		dataSource.setUsername("pom");
		dataSource.setPassword("michuddai");
		return dataSource;
	}
	@Bean 
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		Resource []res=new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*Mapper.xml");
		sqlSessionFactoryBean.setMapperLocations(res);
		return sqlSessionFactoryBean.getObject();
	}
	@Bean  
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

<MemberMapper.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="member">
<select id="getTotalMemberCount" resultType="int">
SELECT COUNT(*) FROM spring_member
</select>
</mapper>

<TestGetMemberCount.java>

public class TestGetMemberCount {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(AppConfig.class);
		MemberDAO dao=(MemberDAO)ctx.getBean("memberDAOImplVer2");
		System.out.println(dao.getTotalMemberCount());
		ctx.close();
	}
}

자 이렇게 준비를 마치고 memberDAOImplVer2.java를 생성해 볼까요?

 

<memberDAOImplVer2.java>

@Repository // 영속성 계층 persistence layer 에 적용하는 컴포넌트 애너테이션
public class MemberDAOImplVer2 implements MemberDAO {
	private Logger log=LoggerFactory.getLogger(getClass());
	private SqlSessionTemplate template;
	@Autowired 
	public MemberDAOImplVer2(SqlSessionTemplate template) {
		super();
		this.template = template;
		log.debug(template.toString());
	}
	@Override
	public int getTotalMemberCount() {					
		return template.selectOne("member.getTotalMemberCount");
	}
}

1. SqlSessionTemplate을 의존성 주입을 통해 할당받습니다.

2. SqlSessionTemplate은 내부에 있는 SqlSessionFactory를 이용하여 SqlSession을 관리합니다.

3. template을 이용하면 사용과 반납을 작성하지 않아도 되고 그저 한 줄 작성하면 끝나게 됩니다.

 

이게 template을 이용하는 전부입니다.

 

이것을 이용하기 위해 지금까지 connection을 만들고 datasource를 만들고 dbcp를 만들고 sqlsessionfactory를 만들고 이랬던 것입니다. 기초를 알고 있으니 이해가 더 잘 됩니다.

 

이번에는 javaconfig 파일이 아닌 xml config 파일을 이용해서 MyBatis를 실행해 보겠습니다.

 

XML config 파일로 MyBatis 실행하기

예전에도 xml 파일을 이용하여 제어의 역전을 알아보았는데요. 

https://pabeba.tistory.com/188

 

이번에는 xml 을 이용하여 MyBatis를 실행해 보려고요.

기존에는 AppConfig 자바 Config 파일을 이용했다면 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"
	xsi:schemaLocation="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.xsd">
	<bean id="dbcp" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName"
			value="oracle.jdbc.OracleDriver" />
		<property name="url"
			value="jdbc:oracle:thin:@:1521:xe" />
		<property name="username" value="" />
		<property name="password" value="" />
	</bean>
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dbcp" />
		<property name="mapperLocations"
			value="classpath:/mappers/*Mapper.xml" />
		<property name="configuration">
			<bean class="org.apache.ibatis.session.Configuration">
				<property name="mapUnderscoreToCamelCase" value="true" />
			</bean>
		</property>	
	</bean>
	<bean id="sqlSessionTemplate"
		class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"></constructor-arg>
	</bean>
	<context:component-scan
		base-package="myproject" />
</beans>

설정 파일을 보면 겁이 나는 것이 당연합니다. 하지만 마주해보세요. 특히 AppConfig.java 파일과 비교하면서 보세요.

 

1. dbcp 관련 설정 비교

Bean 작성 - Driver 연결 - url연결 - username 작성 - password 작성

코드로 작성했냐, 설정파일로 작성했냐의 차이입니다.

 

2. SqlSessionFactory 설정 비교

Bean 작성 - SqlSessionFactoryBean 이용해서 dataSource 주입 - Mapper.xml 파일 설정 및 매핑 - resource 파일 factorybean에 저장 

 

아! 그리고 설정 하나 다른 것은 추가한 것이 맞습니다.

보통 DB 테이블에 저장할 때는 언더스코어 (_)를 이용하여 저장하고 Java 코드는 Camel Case를 이용하여 저장하기 때문에 그것을 자동으로 변환해 주는 설정을 해준 것입니다.

 

Java Config에서 사용하려면 

org.apache.ibatis.session.Configuration conf=new org.apache.ibatis.session.Configuration();
conf.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(conf);

이 문장을 작성하면 됩니다.

 

3. SqlSessionTemplate 비교

이 비교는 직접 확인해보면 바로 알 수 있습니다.ㅎㅎ

 

이렇게 하고 Test Code 실행하면 똑같이 잘 나오게 됩니다.

 

소감

요새 메리골드 마음 세탁소라는 책을 읽는데, 힐링이 아주 잘 됩니다.

좋은 구절이 너무 많은데 저는 이 말이 가장 좋았습니다.

"너 자신을 잃어가면서까지 지켜야 할 관계는 어디에도 없어. 설령 그게 가족이나 사랑하는 사람이라 할지라도. 너 자신보다 중요한 건 없어."

이 말이 참 맞는게 자기 자신이 없는데 남을 어떻게 만나고 어떻게 공부를 하고 어떻게 돈을 벌겠습니까. 또한 저는 그렇게 생각합니다. 자기 자신을 잘 지키는 사람이야 말로 사랑받을 수 있고, 다른 사람도 잘 지킬 수 있다고 생각합니다.

이기적으로 살아가라는 말은 아닙니다. 하지만 자신을 지킬 줄 알아야 합니다.

우리 모두 건강하게 잘 살아가 보아요.

반응형