본문 바로가기
Spring Framework

[Spring Framework] DB 커넥션 풀, HikariCP, MyBatis

by 쟈근꿈틀이 2022. 8. 3.
728x90


DB Connection Pool

 

DB 커넥션 풀이란, 데이터베이스와 연결된 Connection 객체를 미리 만들어 풀에서 관리하고, 요청이 발생하면 제공하고 사용이 끝나면 다시 Connection Pool에 반환하는 데이터 엑세스 패턴을 말한다.

미리 만들어진 Connection을 재사용하면 CPU의 부담과 시간을 줄일 수 있다는 장점이 있다.

 


HikariCP

 

HikariCP는 130kb의 가벼운 용량과 빠른 속도를 가지는 JDBC의 커넥션 풀 프레임워크이다.

즉, HikariCP는 DB 커넥션 풀을 관리해준다.

SpringBoot는 2.0 버전부터 기존에 커넥션 풀 관리를 위해 사용하던 Tomcat을 HikariCP로 교체했기 때문에,

spring-boot-starter-data-jpa나 spring-boot-starter-jdbc에 의존할 경우 자동으로 HikariCP가 포함된다.

 


Mybatis

 

Mybatis자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.
기존에는 DAO파일에 모든 SQL문을 작성했지만, MyBatis에서는 Mapper 파일에 SQL코드를 입력해 놓고 DAO 파일에서 필요할 때마다 가져와서 사용할 수 있다.

 

커넥션 풀 관련 라이브러리 추가
		<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>4.0.3</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
		<dependency>
		    <groupId>com.oracle.database.jdbc</groupId>
		    <artifactId>ojdbc6</artifactId>
		    <version>11.2.0.4</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>

 

Mybatis 관련 라이브러리 추가
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.10</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>2.0.7</version>
		</dependency>

 

hikariConfig -> DataSource -> SqlSessionFactoryBean 순서로 의존성 주입(xml 파일)
	<bean class="com.zaxxer.hikari.HikariConfig" id="hikariConfig" >
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="admin" />
		<property name="password" value="oracle" />
	</bean>
	
	<bean class="com.zaxxer.hikari.HikariDataSource" id="datasource" >
		<constructor-arg ref="hikariConfig" />
	</bean>
	
	<!-- SqlSessionFactoryBean: MyBatis 핵심 객체 -->
	<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
		<property name="dataSource" ref="datasource" />
		<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml"  />
	</bean>
    
    <mybatis-spring:scan base-package="com.my.megabox.repository"/>

sqlSessionFactoryBean객체의 mapperLocations 속성은 sql문이 작성된 Mapper파일의 위치를 나타낸다.

src/main/resources/mapper 폴더에 존재하고 이름이 Mapper로 끝나는 mapper파일을 찾으라는 의미이다.

 

mybatis-spring:scan태그의 base-package 속성으로는 Mapper 인터페이스 파일이 있는 가장 상위 패키지를 지정하면 된다. 세미콜론이나 콤마를 구분자로 사용해서 한개 이상의 패키지를 셋팅할 수 있다.

매퍼는 지정된 패키지에서 재귀적으로 하위 패키지를 모두 검색할 것이다.

 

hikariConfig -> DataSource -> SqlSessionFactoryBean 순서로 의존성 주입(java 파일)
@Configuration
//<mybatis-spring:scan base-package="com.db.basic.repository"/>
@MapperScan(basePackages = { "com.db.basic.repository" }) // 패키지가 여러 개이면 콤마로 각각 지정
public class DataBaseConfig {

//	<bean class="com.zaxxer.hikari.HikariConfig" id="hikariConfig">
//	<property name="driverClassName"
//		value="oracle.jdbc.driver.OracleDriver" />
//	<property name="jdbcUrl"
//		value="jdbc:oracle:thin:@localhost:1521:xe" />
//	<property name="username" value="admin" />
//	<property name="password" value="oracle" />
//	</bean>

	// @Bean: 리턴 값을 스프링에 빈으로 등록해줌
	@Bean
	public HikariDataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
		hikariConfig.setUsername("admin");
		hikariConfig.setPassword("oracle");

//	<bean class="com.zaxxer.hikari.HikariDataSource" id="dataSource">
//	<constructor-arg ref="hikariConfig"/>
//	</bean>

		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}

//	<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
//	<property name="dataSource" ref="dataSource"/>
//	<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
//	</bean>

	@Bean
	public SqlSessionFactoryBean sessionFactory() throws IOException {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource());

		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		sessionFactory.setMapperLocations(resolver.getResources("/mappers/**/*Mapper.xml"));
		return sessionFactory;
	}

}

xml파일이나 java파일을 통하여 의존성을 주입할 수 있다.

 

이때 클래스명 위에 적힌 Configuration 어노테이션의 의미를 알아보자!

스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아서 그 메소드의 반환 값을 빈으로 생성한다.

@Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다.

 

 

 

 

 

참고한 블로그

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wwwkang8&logNo=220989381100 

 

[MyBatis] MyBatis란 무엇인가?

●[MyBatis란?] 1. 객체 지향 언어인 자바의 관계형 데이터 베이스 프로그래밍을 보다 쉽게 도와주는 프...

blog.naver.com

https://mangkyu.tistory.com/75

 

[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)

기존의 Spring MVC에서는 xml을 활용하여 Bean을 등록하고 있었다. 하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들을 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션(Annotation, @)를 활

mangkyu.tistory.com

 

728x90