DataSource(데이터소스)Bean(빈) 이란? in Spring(스프링) 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"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<!-- HikariCP configuration -->
<bean id="hikariConfig1" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="ldgeao99"/>
<property name="password" value="1234"/>
</bean>
<!-- HikariCP Bean -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig1"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" primary="true">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:/com/spring/mapper/FruitMapper.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 어노테이션에 기반한 선언적 트랜잭션 관리, @Transactional 어노테이션을 찾아 동작하게 해준다. -->
<tx:annotation-driven />
<context:component-scan base-package="com.spring"/>
<mybatis-spring:scan base-package="com.spring.mapper"/>
</beans>
Database 관련 config 에서 언급되는 'DataSource'의 역할
- DataSource는 존재하는 connection 객체를 pool에서 꺼내 반환해준다.
(만약 pool이 비어있다면 connection 객체를 생성하여 반환해준다)
- 스프링에서 Database와 상호작용 할 때 직접적으로 새로운 connection을 만들거나 열지 않으며
DataSource에게 connection을 요청하는 방식으로 진행된다.
- 즉, connection pool을 관리하는 역할을 하는 객체라고 보면 될거같다. 혹은 connection pool과 동일시해도 될거 같기도?
Database 관련 config 에서 언급되는 'SqlSessionFactory '의 역할
'org.mybatis.spring.SqlSessionFactoryBean'
- 어플리케이션이 시작할 때 딱 한 번만 생성된다.
- MyBatis 프레임워크와 관련된 클래스로 SqlSession 인스턴스를 만드는데 사용된다.
바로 위에서 언급되는 'SqlSession'의 역할
- MyBatis와 관련된 SqlSessionFactory 빈에 의해 생성되어지는 객체이다.
- SQL 문을 실행하고 결과(select 연산결과 등)를 Java 객체에 매핑하기 위한 기본 API를 제공한다.
- 새로운 SqlSession 객체가 생성된다는 것은 새로운 트랜잭션이 시작된다는 것을 의미하기도 한다.
- 즉, 단일 Transaction 단위의 작업을 나타내는 MyBatis 개체이다.
- insert, update, delete, select을 포함하는 SQL 문을 실행하는 방법을 제공하며 트랜잭션 관리 및 리소스 정리도 제공한다.
- 예상컨데 실행흐름상 컨넥션 풀에있는 컨넥션 객체를 이용해서 SQL문을 실행하고 그 결과를 Java객체에
매핑시켜주기도 하는 존재가 아닐까 싶다. DAO에 자동으로 주입된다는 얘기도 있었음.
예전에 낮은 수준의 개발 방법으로 DAO 클래스 내부의 함수를 직접 작성했을 때 이뤄지는 일련의 과정을 이 객체가 해주는게 아닐까? (try catch가 감싸진 영역에서 SQL문 해석, 예외 발생시 트랜잭션 롤백, connection 객체 사용 후 반납, SQL 처리결과 반환 등)
Database 관련 config 에서 언급되는 'TransactionManager'의 역할
'org.springframework.jdbc.datasource.DataSourceTransactionManager'
- 스프링 프레임워크의 컴포넌트로 multiple transactional resources 간의 트랜잭션을 조정하기 쉽게 만든다.
- 트랜잭션을 시작, 커밋 및 롤백하기 위한 간단한 API를 제공합니다.
- 필요에 따라 변경사항을 commit 하거나, rollback하여 트랜잭션을 관리한다.
- 즉, 스프링에서 DB와 관련된 작업들을 트랜잭션 형태로 관리할 수 있도록 해주는 존재가 아닐까.
@Transactional 어노테이션도 사용 가능하도록 해주고.
원래 이게 없이 mybatis mapper로 작업을 진행하면 한 줄 성공할 때 마다 바로 commit되는 형태로 동작했음.
출처 : ChatGTP