HikariCP
root-context.xml에 다음 코드를등록합니다.
<!-- [HikariCP] ConnectionPoor -->
<!-- [HikariConfig] 객체 hikariconfig 빈 등록 -->
<bean id="hikariconfig" class="com.zaxxer.hikari.HikariConfig">
<!-- ds객체에 주입 하기 위해 setter()를 통한 주입 - HikariDataSource의 필드 초기화 -->
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="username" value="week"/>
<property name="password" value="week"/>
</bean>
<!-- [HikariDataSource] 객체 ds 빈 등록 / DataSource역할 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<!-- ds객체에 hikariconfig객체 의존성 주입 -생성자를 통한 의존성 주입 -->
<constructor-arg ref="hikariconfig"/>
</bean>
<!--Spring-JDBC 쿼리문 수행객체 / hikaricp에서도 호환가능-->
<!-- [JdbcTemplate] 객체 jdbcTemplate 빈 등록 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- jdbcTemplate에 dataSource객체 의존성 주입 - setter()를 통한 의존성 주입 -->
<property name="dataSource" ref="ds"/>
</bean>
<!-- MyBatis 핵심객체 SqlSessionFactory 빈 등록 / 데이터소스를 주입해야합니다. -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:/mappers/**/*.xml" />
</bean>
<!-- mybatis쿼리문 수행객체를 설정 / SqlSessionTemplate방식-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- 매퍼의 인터페이스를 스캔하는 설정 / MapperInterface방식 -->
<mybatis-spring:scan base-package="com.spring.mvc.board.repository"/>
천천히 코드를 살펴보며 각각의 기능과 의존성관계를 설명하겠습니다.
HikariCP 공통 빈 등록
[ HikariConfig ]
@DB정보를 주입하는 HikariCP의 라이브러리 HikariConfig입니다.
<bean id="hikariconfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="username" value="week"/>
<property name="password" value="week"/>
</bean>
HikariConfig의 각 필드에 setter()로 DB정보들을 주입합니다.
hikariconfig라는 이름으로 빈 등록을 합니다.
만약 hikariconfig에서 setter()로 DB정보를 주입받지 않았다면, HikariDataSource가 어딘가로 부터 실행, 로드될때 NullPointerException이 발생하게 됩니다.
[ HikariDataSource ]
@ DB정보를 담아주는 DataSource 역할을 제공하는 HikariDataSource 입니다
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariconfig"/>
</bean>
스프링 커넥션풀을 사용할때 DriverManagerDataSource를 컨테이너에 빈 등록 해줍니다.
이때 각 필드에 DB정보를 받으면서 정보를 담고있을 그릇 역할 DataSource기능을 동시에 해줬습니다
HikariCP는 DataSource의 기능을 따로 분리해 빈 등록된 DB정보를 HikariDataSource에 의존성주입 시켜줍니다.
JdbcTemplate 나 SqlSessionFactory가 HikariDataSource에 의존성을 갖게 되므로, 만약 이 과정을 거치지 않는다면 빈객체를 받기 때문에 쿼리문 수행시 NullPointerException 에러가 발생합니다.
HikariCP와 JdbcTemplate
HikariCP 와 JdbcTemplate 빈등록 및 의존성 주입과 관계도입니다
[빈등록,의존성주입 완료 코드]
<!-- [HikariCP] ConnectionPoor -->
<!-- [HikariConfig] 객체 hikariconfig 빈 등록 -->
<bean id="hikariconfig" class="com.zaxxer.hikari.HikariConfig">
<!-- ds객체에 주입 하기 위해 setter()를 통한 주입 - HikariDataSource의 필드 초기화 -->
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="username" value="week"/>
<property name="password" value="week"/>
</bean>
<!-- [HikariDataSource] 객체 ds 빈 등록 - DataSource역할 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<!-- ds객체에 hikariconfig객체 의존성 주입 -생성자를 통한 의존성 주입 -->
<constructor-arg ref="hikariconfig"/>
</bean>
<!-- [JdbcTemplate] 객체 jdbcTemplate 빈 등록 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- jdbcTemplate에 dataSource객체 의존성 주입 - setter()를 통한 의존성 주입 -->
<property name="dataSource" ref="ds"/>
</bean>
[JdbcTemplate]
◎ JdbcTemplate를 jdbcTemplate라는 bean id로 스프링 컨테이너에 빈등록합니다.
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- jdbcTemplate에 dataSource객체 의존성 주입 - setter()를 통한 의존성 주입 -->
<property name="dataSource" ref="ds"/>
</bean>
기존에 사용하던 JDBC로직을 템플릿화 시켜놓은것이 JDBC Template입니다.
구현하는 기능들을 미리 따로 선언해놓고 통합 메서드로 구현해놓은것입니다.
메서드를 호출만해주면 가볍게 JDBC로직을 자동으로 처리되게 할수있고, close()도 자동으로 해줍니다.
스프링 JDBC 라이브러리이며, 입력,수정,삭제,조회 의 쿼리문을 수행해주는 메서드를 제공하는 JdbcTemplate입니다
JDBC의 장점을 유지하면서, 전통적 방식의 JDBC단점을 극복하여, 간결한 형태의 API사용법을 제공하며 기존방식에서 지원하지 않는 편리한 기능을 제공합니다.
HikariCP와 Mybatis,SqlSessionTemplate
HikariCP 와 Mybatis 그리고 Mybatis쿼리문을 수행해주는 SqlSessionTemplate 빈등록 및 의존성 주입과 관계도입니다.
[빈등록,의존성주입 완료 코드]
<!-- [HikariCP] ConnectionPoor -->
<!-- [HikariConfig] 객체 hikariconfig 빈 등록 -->
<bean id="hikariconfig" class="com.zaxxer.hikari.HikariConfig">
<!-- ds객체에 주입 하기 위해 setter()를 통한 주입 - HikariDataSource의 필드 초기화 -->
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="username" value="week"/>
<property name="password" value="week"/>
</bean>
<!-- [HikariDataSource] 객체 ds 빈 등록 - DataSource역할 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<!-- ds객체에 hikariconfig객체 의존성 주입 -생성자를 통한 의존성 주입 -->
<constructor-arg ref="hikariconfig"/>
</bean>
<!-- MyBatis 핵심객체 SqlSessionFactory 빈 등록 / 데이터소스를 주입해야합니다. -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:/mappers/**/*.xml" />
</bean>
<!-- mybatis쿼리문 수행객체를 설정 / SqlSessionTemplate방식-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- 매퍼의 인터페이스를 스캔하는 설정 / MapperInterface방식 -->
<mybatis-spring:scan base-package="com.spring.mvc.board.repository"/>
[SqlSessionFactoryBean]
◎ SqlSessionFactoryBean을 sqlSessionFactory라는 bean id로 스프링 컨테이너에 빈등록합니다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:/mappers/**/*.xml" />
</bean>
MyBatis 라이브러리 인 SqlSessionFactoryBean클래스는 sql문을 담아내는 빈이 있으며 그러한 빈을 만들어내는 공장 같은 클래스라고 보시면 됩니다.
이 클래스는 DB정보가 담긴 dataSource가 있어야만 작동을 수행할 수 있습니다.
따라서 SqlSessionFactoryBean은 DB정보가 담긴 dataSource에게 의존적이다 라고 합니다.
SqlSessionFactoryBean과 dataSource는 서로 의존관계입니다.
property태그로 setter()를 통해 SqlSessionFactoryBean의 필드에 dataSource 빈의 의존성주입과, 필드에 속성값을 주입합니다.
property name속성이 configLocation인 maybatis-config.xml은 데이터 저장빈 클래스 객체 별칭을 지정,관리합니다.
property name속성이 mapperLocations인 value속성에 등록된 해당 경로의 모든 xml파일은 mybatis 매퍼 xml태그로 쿼리문을 다루는 매퍼태그의 위치를 조정합니다.
만약 dataSource객체를 의존성 주입하지 않거나 SqlSessionFactory의 필드에 데이터를 주입해주지 않는다면 정보가 Null인 객체를 주입받기때문에 NullPointerException이 발생하게됩니다.
[ SqlSessionTemplate ]
◎SqlSessionTemplate를 sqlSession이라는 bean id로 스프링 컨테이너에 빈등록합니다.
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
MyBatis에서 쿼리문을 수행해주는 수행객체입니다. clearCache속성으로 임시메모리를 깨끗이 지워줍니다.
전통적인 JDBC방식에서는 PreparedStatement와 같은기능을 수행해주지 않을까 생각합니다.
SqlSessionTemplate의 sqlSession객체가 쿼리문을 수행하려고 할 때 DB정보를 담고있는 DataSourece, DataSource를 담고있는 sqlSessionFactory가 필요합니다.
따라서 SqlSessionTemplate는 sqlSessionFactory에 의존적이다 라고 합니다.
sqlSessionTemplate와 sqlSessionFactory는 의존관계입니다.
따라서 constructor-arg 태그로 생성자를 통해 의존성을 주입해 줘야 합니다.
만약 sqlSession객체를 의존성 주입하지 않는다면 정보가 Null인 객체를 주입받기때문에 NullPointerException이 발생하게됩니다.
[MapperInterface]
@mybatis Mapperxml파일을 빈으로 등록하기 위한 스캔 설정
<mybatis-spring:scan base-package="com.spring.mvc.board.repository"/>
Mapper xml을 빈등록 하기 위해서는 DAO 로 인식되어야하는데 그 기준을 인터페이스로 합니다.
우리가 JdbcTemplate나 SqlSessionTemplate를 사용할때에는 서비스 인터페이스의 구현을 받는 DAO 클래스가 있었습니다.
MapperInterface방식은 DAO클래스의 역할을 Mapper xml에서 대신해주기때문에 Mapper xml을 자체적으로 빈등록해야합니다.
이때 Mapper xml의 namespace 속성에 인터페이스를 등록하여 연결하는데 이는 인터페이스와 클래스가 서로 구현관계인것과 같습니다.
그러므로 먼저 인터페이스를 찾아서 해당 인터페이스를 namespace속성으로 등록한 Mapperxml 파일을 자동으로 찾아 컨테이너에 빈 등록 해주는 것이 바로 이 코드입니다.