### <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" />

 

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

 

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

 

 

필드는 클래스 안의 변수를 말하고 main( ) 등 메소드 안에서 정의한 변수는 필드라고 하지 않는다.

 

 

필드의 참조와 대입

같은 오브젝트 내의 필드를 참조/대입을 할 때 필드명을 그대로 사용한다.

 

 

Class Test {
	int a = 5;
    
	// 대입
	a = 9;

	// 참조
	b = a + 2;
}

 

 

다른 오브젝트의 필드를 참조/대입하기 위해서는 .(피리오드)를 사용한다.

=> 오브젝트명.필드명

 

// 대입
x.a = 5;

// 참조
b = x.a + 2;

 

피리오드를 언제 사용하는지가 조금 헷갈리는데 예시코드를 통해 오브젝트의 개념을 제대로 이해하였다.

 

예시코드

class Wdata {
	// 필드 정의
	int monday;
	int day;
	String sky;
}
class Weather {
	public static void main (String [] args) {
		Wdata today = new Wdata();
		today.month=10;
		today.day=5;
		today.sky="맑음";
		System.out.println(today.month + "월 " + today.day + "일 " + today.sky);
	}
}

 

한마디로 정리하지면

다른 클래스를 받아 생성한 오브젝트를 사용할 떄 피리오드를 붙여 사용하게 된다.

 

 

 

헷갈리지 말자! 정복하자!

 

이상 코딩하는 망고씨였습니다! 

생성자와 메소드의 개념이 헷갈려 찾아보는데 

 

생성자는 다른 클래스가 현 클래스를 객체로 만들 때 자동 호출되는 메서드(함수)를 뜻하고 객체의 초기화를 담당하는 특별한 메서드.... 

 

음.... 객체를 초기화...? 무슨말이지... 의미는 알겠다만 직관적으로 이해가.....

 

그래서!! 내가 간단히 설명해주겠다!!

 

객체를 초기화한다 = 객체를 생성하고 초기 상태로 설정한다.

 

이렇게 생각하니 막연하게 생각하던 생성자의 개념이 비로소 이해되었다!!


그 외에도 추가적으로 기억해야 할 생성자의 특징을 말해보자면

(내 기준 잘 까먹는ㅎㅎ 공부 블로그이기 때문에 양해 부탁..드림돠)

 

  • 생성자는 클래스와 동일한 이름을 가진다.
  • 반환타입을 명시하지 않는다!  => 그러므로 void 사용 불가!!

절대 절대 까먹지도 헷갈리지 말아야 할 개념이다.

 

 

 

 

헷갈리지 말자! 정복하자!

 

이상 코딩하는 망고씨였습니다! 

제네릭 타입은 자바에서 변수, 클래스, 메소드 등을 선언할 때 사용되는 타입 매개변수입니다. 

 

제네릭은 재사용성과 타입 안정성을 높이기 위해 도입된 기능! 컴파일 시점에서 타입을 확인 할 수 있게 해줍니다.

일반적으로 클래스나 메소드를 정의할 때, 특정한 타입을 사용하려면 해당 타입을 직접 지정해야 했습니다. 

 

예를 들어, 정수를 저장하는 동적 배열을 만들기 위해서는 int 타입의 배열을 선언해야 했습니다. 

그러나 제네릭을 사용하면 타입을 일반화할 수 있어, 재사용성이 높아지고 다양한 타입에 대해 유연하게 동작할 수 있습니다.



제네릭은 < > 기호로 표현되며, 선언할 때 타입 매개변수를 지정합니다. 


예를 들어, ArrayList은 제네릭을 사용한 컬렉션 클래스입니다.

ArrayList을 선언할 때 < > 안에 원하는 타입을 지정하여 사용할 수 있습니다.

 

아래는 ArrayList에 문자열을 저장하는 예시입니다:

ArrayList<String> list = new ArrayList<>();


위의 코드에서 ArrayList<String>은 문자열을 저장하는 ArrayList을 생성하는 것을 의미합니다. 

String은 여기서 제네릭 타입으로 사용되고, ArrayList의 요소 타입이 됩니다. 

 

이렇게 선언된 list는 문자열만 저장할 수 있으며, 컴파일러는 타입 체크를 통해 문자열 외의 다른 타입이 추가되지 않도록 검사합니다.

제네릭을 사용함으로써 코드의 유연성과 안정성을 높일 수 있으며, 재사용 가능한 클래스와 메소드를 작성할 수 있습니다.

 

 

 

 

헷갈리지 말자! 정복하자!

이상 코딩하는 망고씨였습니다!

+ Recent posts