### <dataSource>태그란?

MyBatis 설정 파일에서 사용되는 태그로 MyBatis가 연동하는 데이터베이스에 대한 데이터 소스(dataSource)를 설정할 때 사용하고 driver 클래스명 , 데이터베이스 접속 주소, 아이디, 비번을 여기에 설정한다.

type 속성은 사용할 데이터 소스 구현 유형을 지정한다.

 

<dataSource type="POOLED">
	<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
	<property name="url" value="JDBC:oracle:thin:@localhost:1521:XE" />
	<property name="username" value="본인의 아이디" />
	<property name="password" value="본인의 비밀번호" />
</dataSource>

 

 


<datasource type="pooled">

type="POOLED"은 풀링(pooling)된 데이터 소스를 사용하겠다는 의미이다.

풀링된 데이터 소스는 데이터베이스 connection pool을 사용하여 데이터베이스 연결을 관리한다.

 

connection pool 개념

connection pool은 미리 여러개의 DB 연결을 생성해두고, 애플리케이션에서 필요할 때 이들을 재사용하는 방식으로 동작하는 것을 말한다.

connection pool을 사용하면 연결을 여러 번 생성하고 닫는 시간이 줄어들어 성능이 향상되며, 동시 접속자 수가 많아져도 시스템이 안정적으로 동작할 수 있게 된다.


MyBatis에서 제공하는 3가지 데이터 소스 유형

UNPOOLED: 풀링되지 않은 데이터 소스로, 매 요청마다 새로운 연결을 생성하고 닫습니다. 성능 측면에서는 권장되지 않습니다.
POOLED: 풀링된 데이터 소스로, 연결 풀을 사용하여 연결을 재사용합니다. 일반적인 사용처에 권장됩니다.
JNDI: Java Naming and Directory Interface를 사용하여 서버 컨테이너에 저장된 데이터 소스를 찾아 사용합니다. 주로 Java EE 컨테이너에서 사용됩니다.



### getResourceAsReader() 메서드란?

텍스트 기반의 xml 문서를 읽어들이고 각 태그들은 DTD에 의해서 해석을 시키는 데

그걸 읽어드리기 위해서는 해당 경로를 잡아주어야 합니다.
그것을 읽어드리는 게 Resources가 갖고 있는 getResourceAsReader() 메서드이고

이때 반환 타입은 reader 클래스 타입입니다.

 


public class MemberDAO {
	// 멤버 변수로 SqlSessionFactory를 저장 받을 변수 선언
	public static SqlSessionFactory sqlMapper = null;
	
	public MemberDAO() {
	}
	
	// getInstance() 메서드는 우리가 만든 메서드로
	private static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
		// 위에서 선언한 변수가 null일 경우에만 
			try {
				String resource = "mybatis/SqlMapConfig.xml"; // 1.
				Reader reader = Resources.getResourceAsReader(resource); // resource 경로에 있는 파일을 읽어들이는 메서드
				// 새로운 SqlSessionFactory 객체를 만들어 리턴 시키겠다
				sqlMapper = new SqlSessionFactoryBuilder().build(reader); // 2.
				// sqlMapper가 만들어져야지만 sqlSession 객체를 갖다 쓸 수가 있고
				// sqlSession  객체를 얻어내야지만 마이바티스를 제공해주는 각종 메서드를 사용 할 수 있음
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
}
위의 코드에서 
Resources.getResourceAsReader(resource)는 resource 경로에 있는 파일을 읽어들이는 메서드이고,
이 때 메서드가 반환하는 값은 Reader 클래스의 객체이다.

 

더보기

Reader 클래스는 자바 I/O 패키지에서 제공하는 추상 클래스로, 입력 스트림을 다루기 위한 기본 클래스
getResourceAsReader() 메서드는 파일을 읽어들이는 기능을 수행하고

이를 Reader 클래스의 객체로 반환하기 때문에, 반환 타입이 Reader 클래스 타입

 


반환 타입이 클래스 타입이라는게 어떤 의미일까?

그리고 참고로 내가 가장 와닿지 않았던 "반환 타입이 Reader 클래스 타입"이라는 표현에 대해 부연 설명을 하자면

해당 메서드getResourceAsReader()를 호출했을 때 반환되는 값이 Reader 클래스의 인스턴스(객체)라는 의미이다.

 

즉, 메서드가 실행되고 나서 반환되는 데이터의 형태가 Reader 클래스의 형태라는 것을 의미한다.

Reader 클래스는 자바의 I/O 패키지에 포함되어 있어서, 텍스트 데이터를 다룰 때 사용된다.

이 클래스를 이용하면 파일의 내용을 한 줄씩 읽거나 처리할 수 있다.

 

따라서 반환된 Reader 객체를 활용하여 파일의 내용을 읽고 처리할 수 있게 된다.

### commit이란?

commit은 DB에 영구적으로 저장하는 것을 말한다.
commit을 실행하지 않으면 실행창(브라우저나 sqlDeveloper등)을 껐다 키게 되면

실행한 쿼리문이 적용되기 전 상태에 머물러있게 된다.

 

### 트렌젝션이란?

이전에 기존 프로젝트들에서는 쿼리 별로 기능을 분류했다면

트랜젝션은 (여러 개의 쿼리 사용하는) 작업들을 기능 별로 나눈 것을 말한다.


스프링에서 mybatis를 사용하는 방법에 대해 배우는 과정에서

 Mybatis는 트렌젝션 기능을 가지고 있기 때문에 select는 Database의 변화가 없어 괜찮지만
 insert, update, delete는 commit 시켜줘야 session의 정보가 table에 반영이 된다.

라는 사실을 알게 되었다.

 

즉, DAO에서 commit을 해주지 않으면 웹브라우저에서는 변동 사항을 확인 할 수 있지만

DB에는 반영이 되지 않는다는 것이다.

 

 

JDBC를 관리하는 xml 파일에서 아래와 같은 코드를 작성하게 되면 autocommit 기능이 꺼지게 되고

직접 commit을 작성해주어야 한다.

<transactionManager type="JDBC" />

 

그럼 위의 코드를 작성하지 않고 자동으로 커밋 되는 게 더 편리하지 않냐고 묻는다면
커밋은 주로 트렌젝션 단위로 실행하기 때문에 자동 커밋을 실행하는 것을 추천하지 않는다.

 

커밋은 트렌젝션 단위 별로 실행!
롤백: 트랜젝션 수행 전으로 돌아가는 것

+ Recent posts