본문 바로가기
Java/Spring

Spring) DB 접속을 위한 설정

by 박채니 2022. 8. 18.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


DB 계정 및 테이블 생성

-- (관리자계정) spring2 일반계정 생성
alter session set "_oracle_script" = true;

create user spring2
IDENTIFIED by 비밀번호
default tablespace users;

alter user spring2 quota unlimited on users;

grant connect, resource to spring2;

-- (spring 계정) 
-- dev 테이블 생성
create table dev(
    no number,
    name varchar2(100) not null,
    career number not null,
    email varchar2(200) not null,
    gender char(1),
    lang varchar2(100) not null,
    created_at date default sysdate,
    constraint pk_dev_no primary key(no),
    constraint ck_dev_gender check(gender in ('M', 'F'))
);

create sequence seq_dev_no;

DB 접속을 위한 설정

 

#6. spring-jdbc, mybatis, dbcp, ojdbc8

pom.xml

<!-- #6. spring-jdbc, mybatis, dbcp, ojdbc8 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>
<!-- Database Connection Pool -->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>21.1.0.0</version>
</dependency>

Database Connection Pool (DBCP)

- 웹 컨테이너(WAS)가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 오면 Connection 객체를 빌려주고 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법

 

datasource.properties

###################################################
# datasource.properties
###################################################
datasource.driverClassName = oracle.jdbc.OracleDriver
datasource.url = jdbc:oracle:thin:@localhost:1521:xe
datasource.username = spring2
datasource.password = 비밀번호

두 레벨 이상으로 작성해줘야 하므로, datasource.~으로 작성해주었습니다.

 

 

#6.1. datasource 빈 등록

root-context.xml

<!-- #6.1 datasource 빈 등록 -->
<!-- properties 파일을 읽어오는 태그 -->
<context:property-placeholder location="classpath:datasource.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${datasource.driverClassName}"></property>
    <property name="url" value="${datasource.url}"></property>
    <property name="username" value="${datasource.username}"></property>
    <property name="password" value="${datasource.password}"></property>
</bean>

properties 파일을 읽어오기 위해 context namespace가 필요하며, 추가해주었습니다.

 

 

#6.2 mybatis SqlSessionFactoryBean, SqlSessionTemplate 빈 등록

root-context.xml

<!-- #6.2 mybatis SqlSessionFactoryBean, SqlSessionTemplate 빈 등록 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:mapper/**/*-mapper.xml" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!-- SqlSession 구현체. Dao구현클래스에 DI되어 실행됨 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFacotryBean" index="0"/>
</bean>

sqlSessionFactoryBean 하위에 dataSource property에서 name="dataSource"는 SqlSessionFactoryBean의 setDataSource 메소드를 의미하며, ref="dataSource"는 위에서 등록해놓은 BasicDataSource 빈의 id값을 의미합니다.

 

또한 mapperLocations의 value에서 "classpath*:mapper/**/*-mapper.xml"는

classpath*: → 복수 개의 파일

mapper/**/*-mapper.xmlmapper 하위의 어느 폴더이든 무슨무슨 -mapper.xml로 끝나는 파일 의미

 

반면에, configLocation의 value에서 "classpath:mybatis-config.xml"은 해당 파일 단 하나를 의미합니다.

 

SqlSessionTemplate은 SqlSession 인터페이스의 구현체로 추후 Dao 구현클래스에 DI되어 실행됩니다.

생성자로 sqlSessionFactoryBean을 받아 생성됩니다.

 

demo-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="demo">
  
</mapper>

 

mybatis-config.xml

<?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>
<!-- 
	자식 태그는 다음 순서로 작성할 것!
	properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, 
	environments?, databaseIdProvider?, mappers?
 -->
  
  <settings>
  	<setting name="jdbcTypeForNull" value="NULL"/> <!-- null 데이터 전달 시 그대로 null로 대입 -->
  	<setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
  
  <typeAliases>
  	<package name="com.ce.spring2"/> <!-- 해당 패키지 하위에 있는 클래스들을 소문자로 변환하여 별칭등록 -->
  </typeAliases>

</configuration>