
Spring Starter Project
dependencies 모듈, 라이브러리 추가
JDBC API, Oracle Driver, Mybatis Framework

JDBC 프레임 워크 (하나의 정형화된 틀)
CRUD
Create 생성
Read 조회
Update 수정
Delete 삭제
=> 자주해야하는 일
쉽게 하려고 SQL 수행 JDBC 코드 짧게 쓰고 쉽게 쓰기위해 사용하는 게 MyBatis
MyBatis -> XML 파일 형태 많이 사용 (JDBC와 비슷함)
http://www.mybatis.org/mybatis-3/ko
공식홈페이지
Service 단에서 Connection 제어 및 Commit Rollback 안 함
SqlSession => Connection + MyBatis
SqlSession 이 실행되는 과정

공장 가동되려면 객체 형태로 돼있어야함
Factory Bean -> Spring이 생성 + 관리
내부 설정들 작성해놓은 파일 => mybatis-config.xml
mybatis-config.xml 직접 만들어서 설정들 작성할 거
=> 토대로 SqlSession Factory Bean 생성됨
공장에서 SqlSession Template 만듦
SqlSession + 트랜잭션
mapper.xml 안에 sql 쿼리문들 다 써놓을 것(sql 모음)
이걸 읽어와서 selectOne selectList selectMap insert update delete 메서드들을 이용해서 sql문을 실행시킬 수 있음
STS4 에서 xml 사용하려면 MarketPlace 이용해야함
Help -> Eclipse Marketplace -> xml enter -> Eclipse XML Editors and Tools 3.33 Install 클릭
-> confirm -> accept 체크 -> Finish
Document Type Definition
마이바티스에서 사용하기 위한 xml 파일
window -> preferences -> xml -> xml catalog -> User Specified Entries 클릭 -> Add 클릭 ->
config
Location에 http://mybatis.org/dtd/mybatis-3-config.dtd
Key에 -//mybatis.org//DTD Config 3.0//EN
mapper
http://mybatis.org/dtd/mybatis-3-mapper.dtd
-//mybatis.org//DTD Mapper 3.0//EN
-> Apply and Close
DTD 설정 중 하나 불러서 xml 파일 만들 수 있음
src/main/resources 에 mybatis-config.xml 만듦
config 설정 파일용 xml 만들 때 사용


window -> preferences -> XML (Wild Web Developer) -> Download external ~ 체크 -> Apply and Close
ctrl + c ctrl + v
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<settings>
<!-- Java -> DB로 INSERT,UPDATE 시 Java의 null 값을 DB의 NULL로 인식하도록 설정-->
<setting name="jdbcTypeForNull" value="NULL" />
<!-- DB의 UnderScore (_) 표기법 <-> Java의 Camel 표기법
두 표기법이 서로 변환 될 수 있도록 매핑하여
Java 필드명(memberId)과 DB 컬럼명(MEMBER_ID)가 서로 연결되게 함
-->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
java 에서 null == 참조하는 게 없다
db 에서 null == 값 자체가 없다
src/main/resources 에 mappers 폴더 만들고 그 안에 mapper.xml 만들어줌


mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="Mapper 인터페이스 경로 작성(필수)">
<!-- 아래 태그는 만들자마자 삭제해야함 삭제 안하면 오류 발생 -->
<!-- <cache-ref namespace=""/> -->
</mapper>
Spring 과 Mybatis 연결해서 사용할 수 있게 해줄 거
Hikari Connection Pool
Connection : DB 연결 정보를 담고있는 객체
getConnection oracle 정보 db driver 등등 담아뒀음
(이게 있어야 JDBC 수행 가능)
Pool : 웅덩이, 수영장 (모여있는 곳)
Connection Pool : Connection이 모여있는 곳
servlet -> service(getConnection == 커넥션 생성) -> dao 호출 하고 다시 돌아감
service 단에서 connection close 하고 반환
요청 올 때마다 생성하고 닫고 반복했었음
connection pool 은 빌려줬다가 가져감
Server 실행 시 DB와 연결된 Connection을 일정 개수 생성 -> 클라이언트 요청 시 만들어진 Connection 대여 -> 요청이 처리 완료되면 다시 Connection 반납 받음
=> 생성/소멸(반환) 걸리는 시간이 현격히 감소
대기열 세워둘 수 있음 + DB 연결 과부하 예방
JDBC 이용하려면 JDBC API 필요
프로젝트 만들 때 JDBC API 추가해뒀음
ORACLE Driver 도 추가해뒀음
DB 연결 시 @ConfigurationProperties 어노테이션 사용하는데 configuration-processor 필요함 프로젝트 생성시 추가해뒀음
src/main/resources 폴더 안에 config.properties 파일 생성
(application.properties 와 동일 선상에 존재)
안해주면 한글 다 깨져서 들어옴
save as UTF-8
오라클 DB 연결 정보들 넣어둘 거임
application.properties 아닌 config.properties 생성하는 이유
연결 정보 다 올려두고 안에 내용으로 DB 연결
github에 안 올리려고 (보안문제)
application.properties 는 없으면 안돼서 github 안 올릴 수 없음
config.properties 안에 넣을 내용
#오라클 DB 연결 정보
spring.datasource.hikari.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.hikari.jdbc-url=jdbc:oracle:thin:@IP주소:포트번호:DB이름
spring.datasource.hikari.username=계정명
spring.datasource.hikari.password=비밀번호
Connection Pool에 관한 설정들
# HikariCP Connection Pool Properties
#풀이 연결을 사용할 수 있을 때까지 대기하는 최대 시간(ms)을 지정
spring.datasource.hikari.connection-timeout=30000
#풀의 최대 연결 수 설정
spring.datasource.hikari.maximum-pool-size=50
#연결이 풀에서 유휴 상태로 있을 수 있는 최대 시간(ms)을 지정
spring.datasource.hikari.idle-timeout=600000
#연결 풀의 이름을 지정
spring.datasource.hikari.pool-name=MyHikariCP
#자동 커밋 끄기
spring.datasource.hikari.auto-commit=false
package com.home.todo.common.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
/* @Configuration
* - 설정용 클래스임 명시
* + 객체로 생성해서 내부 코드를 서버 실행시 모두 수행 (설정 내용 토대로 DB 연결)
*
* @PropertySource("classpath:/config.properties")
* classpath == src/main/resources
* config.properties 파일을 읽어와서 DBConfig 클래스에서 사용하겠다는 어노테이션
*
* @PropertySource("경로")
* - 지정된 경로의 properties 파일 내용을 읽어와 사용
* - 사용할 properties 파일이 다수일 경우
* 해당 어노테이션을 연속해서 작성하면 됨
*
* @ConfigurationProperties(prefix="spring.datasource.hikari")
* - @PropertySource 로 읽어온 properties 파일의 내용 중
* 접두사 (앞부분, prefix)가 일치하는 값만 읽어옴
*
* @Bean
* - 개발자가 수동으로 생성한 객체의 관리를
* 스프링에게 넘기는 어노테이션
* (Bean 등록)
*
* DataSource : Connection 생성 + Connection Pool 지원하는 객체를
* 참조하기 위한 Java 인터페이스
* (DriverManager 대안, Java JNDI 기술 이용)
*
* @Autowired
* - 등록된 Bean 중에서 타입이 일치하거나, 상속관계에 있는 Bean 을
* 지정된 필드에 주입
* == 의존성 주입(DI, Dependency Injection, IOC 관련 기술)
* */
@Configuration // 설정용 클래스임을 명시한 어노테이션
@PropertySource("classpath:/config.properties")
public class DBConfig {
// 필드
// org.springframework.context.ApplicationContext;
@Autowired // (DI, 의존성 주입)
private ApplicationContext applicationContext; // application scope 객체 : 즉, 현재 프로젝트
// 이미 Spring이 ApplicationContext를 Bean 으로 관리하고 있어서 @Autowired 로 연결해주기만 하면 됨
// ************* HikariCP 설정 (2가지) *************
@Bean
@ConfigurationProperties(prefix="spring.datasource.hikari")
public HikariConfig hikariConfig() {
/* @ConfigurationProperties 이 어노테이션은
* DBConfig 클래스에 있는 @PropertySource 이 어노테이션과 연계됨
*
* config.properties 파일 안에 접두사가 spring.datasource.hikari 인 것들을
* 전부 불러와 HikariConfig 객체 생성하겠다는 것
*
* config.properties 에 담긴 정보들을 이용해서 Connection 을 만들겠다는 것
*
* 객체를 만들어서 반환 Spring 이 관리 @Bean 추가
* */
return new HikariConfig();
}
// 만들어진 HikariConfig 이용해서 datasource 만들 거
@Bean
public DataSource dataSource(HikariConfig config) {
/* HikariConfig 이용해서 만들 거 위에 만들어놓은 HikariConfig가
* 자동으로 매개변수로 들어와서 연결됨
*
* 매개변수 HikariConfig config
* -> 등록된 Bean 중 HikariConfig 타입의 Bean 이 Spring 에 의해서 자동으로 주입
*
* config.properties 설정 내용 + HikariCP 로 HikariDataSource 생성
*
* DataSource 는 interface 형식으로 상속받은 자식들이 대입하는 형태로 객체화
* */
DataSource dataSource = new HikariDataSource(config);
return dataSource;
}
// ************* Mybatis 설정 *************
// SqlSession -> Mybatis 를 지원하는 객체
@Bean
public SqlSessionFactory sessionFactory(DataSource dataSource) throws Exception {
/* Mybatis 를 쓸 수 있게 해주는 객체
* Bean 으로 만들려면 DataSource 필요
* */
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
// mapper.xml(SQL) 파일이 모이는 경로 지정
// -> Mybatis 코드 수행 시 mapper.xml을 읽을 수 있음
// sessionFactoryBean.serMapperLocations("현재프로젝트.자원.어떤파일");
// DBConfig 필드 부분에 현재프로젝트를 선언해둘 거
sessionFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/**.xml") );
// .xml 로 끝나는 모든 파일의 SQL 을 모아서 세팅을 해준다는 거
// 해당 패키지 내 모든 클래스의 별칭을 등록
// Mybatis 이용할 때 패키지명.클래스명 이렇게 불러야하는데 별칭 등록해서
// 짧게 불러서 쓰려고 하는 설정
/* Mybatis 는 특정 클래스 지정 시 패키지명.클래스명을 모두 작성해야함
* 너무 길어서 짧게 부를 별칭을 설정
*
* setTypeAliasesPackage("패키지") 이용 시
* 클래스 파일명이 별칭으로 등록됨
*
* ex) com.home.todo.model.dto.Todo --> Todo 로만 부를 수 있음
* 별칭 등록으로 클래스명으로 짧게 부를 수 있음
* */
sessionFactoryBean.setTypeAliasesPackage("com.home.todo");
// mybatis 설정 파일 경로 지정 mybatis-config.xml 파일에 setting 만 해두고 연결 X
// sessionFactoryBean 에 연결
sessionFactoryBean.setConfigLocation(
applicationContext.getResource("classpath:/mybatis-config.xml") );
// 설정 내용이 모두 적용된 객체 반환
return sessionFactoryBean.getObject();
}
// SqlSessionTemplate : Connection + DBCP + Mybatis + 트랜잭션 제어 처리
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sessionFactory) {
return new SqlSessionTemplate(sessionFactory);
}
// DataSourceTransactionManager : 트랜잭션 매니저(제어 처리)
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}