Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

DataSource(데이터소스)Bean(빈) 이란? in Spring(스프링) Config 혹은 xml 본문

개인 공부/Spring

DataSource(데이터소스)Bean(빈) 이란? in Spring(스프링) Config 혹은 xml

이대곤 2023. 2. 7. 18:14

설정파일 예시

<?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

 

 

Comments