앞서 Spring 세팅에 있어, 스프링 컨테이너를 실행하고 ComponentScan을 통해 스프링 Bean 관리 하는 내용까지 살펴보았다.
이제 DataBase 연결과 관련한 세팅에 대해 다뤄보겠다.
단, DB 설치와 관련한 내용은 다루지 않으며 Oracle 11g XE가 설치된 상황을 전제로 설명한다.
먼저, Spring MVC 에서 Oracle 데이터베이스에 연결하기 위한 설정 방법을 단계별로 작성해보겠다.
[ 사용환경 ]
- Spring Framework 5.0.7
- Java 11
- Oracle 11g XE
- HikariCP 4.0.3
- Maven 프로젝트
<1 단계>, Oracle 데이터베이스와 통신하기 위해 필요한 드라이버 설치가 필요하다.
이를 위해선 드라이버를 직접 다운받아 설치하거나 혹은 pom.xml에 추가하여 사용할 수 있으며,
지금은 간단하게 pom.xml을 통해 사용하며, 아래와 같이 작성한다.
( 만약 직접 설치하는 경우 java buildpath(실행환경) / web deployment assembly(배포환경) 에도 추가한다. )
<!-- Oracle JDBC 드라이버 의존성 추가 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
- ojdbc8 : Java 8 이상에서 사용 가능한 Oracle JDBC 드라이버 (Java 11과 호환)
- 19.3.0.0 : Oracle 11g XE와 호환되는 안정적인 버전
<2 단계>, Spring에서 JDBC를 사용하기 위해 Spring JDBC 추가가 필요하다.
JdbcTemplate, DataSource 등을 사용할 수 있도록 필요한 모듈로 pom.xml에 추가하여 사용 가능하다.
<!-- Spring JDBC 의존성 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
- 기존 Spring 버전과 동일하게 `${org.springframework-version}`을 사용
<3 단계>, HikariCP 커넥션 풀 추가하기.
pom.xml 파일에 HikariCP를 추가하여 사용할 수 있다.
<!-- HikariCP 커넥션 풀 라이브러리 추가 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
커넥션 풀이란
매번 새로운 데이터베이스 연결을 생성하는 것은 비효율적이기에
커넥션 풀은 미리 연결을 만들어 두고 재사용함으로써 성능을 향상시키고 리소스를 효율적인 관리를 도와준다.
- HikariCP는 고성능, 경량화된 JDBC 커넥션 풀 라이브러리
- DBCP2보다 빠르고 메모리 효율적
- Spring Boot의 기본 커넥션 풀로 사용
<4 단계>, database.properties 파일 생성 및 설정 및 HikariCP 커넥션 풀 설정.
DB 연결 정보를 별도로 관리하기 위해서 `database.properties` 파일을 생성한다.
[ 파일 위치 ]

database.properties의 내용
# ============================================
# Oracle JDBC 드라이버 설정
# ============================================
# Oracle JDBC 드라이버 클래스명
# - Oracle JDBC 드라이버의 클래스 경로
db.driver=oracle.jdbc.driver.OracleDriver
# Oracle 데이터베이스 연결 URL
# 형식: jdbc:oracle:thin:@호스트주소:포트번호:SID
# 예시:
# - 로컬 XE: jdbc:oracle:thin:@localhost:1521:XE
# - 원격 서버: jdbc:oracle:thin:@192.168.1.100:1521:ORCL
# - 서비스명 사용: jdbc:oracle:thin:@localhost:1521/ORCLPDB
# 실제 DB 정보로 변경 필요
db.url=jdbc:oracle:thin:@localhost:1521:XE
# Oracle 데이터베이스 사용자명
# 실제 사용자명으로 변경 필요
db.username=your_username
# Oracle 데이터베이스 비밀번호
# 실제 비밀번호로 변경 필요
db.password=your_password
# ============================================
# HikariCP 커넥션 풀 설정
# ============================================
# 최대 커넥션 수 (동시에 사용할 수 있는 최대 연결 수)
# 기본값: 10
# 권장: CPU 코어 수 * 2 + 1 (최대 10)
# 예: 4코어 CPU -> 4 * 2 + 1 = 9
db.maximumPoolSize=10
# 최소 유휴 커넥션 수 (항상 유지할 최소 연결 수)
# 기본값: maximumPoolSize와 동일
# 서버 부하가 적을 때도 최소한 이만큼은 유지
db.minimumIdle=3
# 커넥션을 얻기 위해 대기할 최대 시간 (밀리초)
# 기본값: 30000 (30초)
# 커넥션 풀이 가득 찰 때 최대 이 시간만큼 대기
db.connectionTimeout=30000
# 유휴 커넥션 타임아웃 (밀리초)
# 기본값: 600000 (10분)
# 사용하지 않는 커넥션이 풀에서 제거되기 전 대기 시간
db.idleTimeout=600000
# 커넥션 최대 생존 시간 (밀리초)
# 기본값: 1800000 (30분)
# 커넥션이 생성된 후 이 시간이 지나면 강제로 제거하고 새로 생성
# 데이터베이스의 타임아웃 설정보다 짧게 설정하는 것이 좋음
db.maxLifetime=1800000
수정해야 할 항목
- `db.url`: 실제 Oracle DB 주소와 포트 (예: `jdbc:oracle:thin:@localhost:1521:XE`)
- `db.username`: 실제 데이터베이스 사용자명
- `db.password`: 실제 데이터베이스 비밀번호
이처럼 별도 파일로 관리하는 이유
- 보안: 코드에 직접 하드코딩하지 않아 보안 위험 감소
- 유연성: 개발/운영 환경별로 다른 설정을 쉽게 적용 가능
- 유지보수: DB 정보 변경 시 한 곳만 수정으로 인한 편의
<5 단계>, root-context.xml에 properties 파일 로드 및 DataSource 빈 설정.
이제 root-context.xml 파일에 생성한 properties 파일을 로드하는 설정이 필요하다.
<5-1 단계> database.properties 파일 로드 설정
먼저, database.properties 파일의 값을 Spring에서 사용할 수 있도록 로드하기 위한 설정의 코드이다.( root-context.xml )
<!--
Properties 파일 로드 설정
- database.properties 파일의 값을 Spring에서 사용할 수 있도록 로드
- ${db.url}, ${db.username} 같은 형태로 값을 참조할 수 있게 해줌
- classpath:config/database.properties 경로에서 파일을 찾음
- src/main/resources/config/database.properties 파일이 자동으로 classpath에 포함됨
-->
<context:property-placeholder location="classpath:config/database.properties" />
- 'classpath:' 경로로 쓸 수 있는 이유는 프로젝트의 아래 파일에 설정된 내용이 있기 때문이다.

.classpath 파일의 내용 중 일부
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
kind="src": 소스 폴더로 인식
path="src/main/resources": 이 경로가 classpath에 포함됨
output="target/classes": 빌드 시 이 폴더로 복사됨
maven.pomderived="true": Maven이 자동으로 생성한 설정
위의 설정에 따라서, 프로젝트를 빌드하면 컴파일에 따라
' src/main/resources의 모든 파일 → target/classes로 복사 ' 과정을 거친다.
따라서 config/database.properties를 classpath:config/database.properties로 접근 가능하다.
Spring에서 classpath:config/database.properties를 사용하면:
1) Spring이 classpath에서 파일을 찾음
2) classpath = target/classes 폴더
3) 따라서 target/classes/config/database.properties를 찾음
4) 이 파일은 src/main/resources/config/database.properties에서 복사된 것
<5-2 단계> DataSource 빈 설정(HikariCP 설정)
- DataSource 객체를 Spring 빈으로 등록
- 해당 객체로 DB 연결을 관리
이를 위한 ( root-context.xml )에 해당 빈을 등록하는 설정값은 아래와 같다.
<!--
DataSource 빈 설정 (HikariCP 사용)
- 데이터베이스 연결을 관리하는 DataSource 객체를 Spring 빈으로 등록
- HikariDataSource: HikariCP의 커넥션 풀 구현체
- destroy-method="close": 애플리케이션 종료 시 커넥션 풀을 안전하게 종료
HikariCP 주요 property 설명:
- driverClassName: JDBC 드라이버 클래스명 (database.properties에서 읽어옴)
- jdbcUrl: 데이터베이스 연결 URL (HikariCP는 'url' 대신 'jdbcUrl' 사용)
- username: 데이터베이스 사용자명 (database.properties에서 읽어옴)
- password: 데이터베이스 비밀번호 (database.properties에서 읽어옴)
- maximumPoolSize: 최대 커넥션 수 (동시에 사용 가능한 최대 연결 수)
- minimumIdle: 최소 유휴 커넥션 수 (항상 유지할 최소 연결 수)
- connectionTimeout: 커넥션을 얻기 위해 대기할 최대 시간 (밀리초)
- idleTimeout: 유휴 커넥션이 풀에서 제거되기 전 대기 시간 (밀리초)
- maxLifetime: 커넥션의 최대 생존 시간 (밀리초)
${...} 형태는 database.properties 파일의 값을 참조.
-->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<!-- JDBC 드라이버 클래스명 -->
<property name="driverClassName" value="${db.driver}" />
<!-- 데이터베이스 연결 URL (HikariCP는 jdbcUrl 사용) -->
<property name="jdbcUrl" value="${db.url}" />
<!-- 데이터베이스 사용자명 -->
<property name="username" value="${db.username}" />
<!-- 데이터베이스 비밀번호 -->
<property name="password" value="${db.password}" />
<!-- 커넥션 풀 설정 (HikariCP 전용 속성) -->
<!-- 최대 커넥션 수 (기본값: 10) -->
<property name="maximumPoolSize" value="${db.maximumPoolSize}" />
<!-- 최소 유휴 커넥션 수 (기본값: maximumPoolSize와 동일) -->
<property name="minimumIdle" value="${db.minimumIdle}" />
<!-- 커넥션을 얻기 위해 대기할 최대 시간 (기본값: 30000ms = 30초) -->
<property name="connectionTimeout" value="${db.connectionTimeout}" />
<!-- 유휴 커넥션 타임아웃 (기본값: 600000ms = 10분) -->
<property name="idleTimeout" value="${db.idleTimeout}" />
<!-- 커넥션 최대 생존 시간 (기본값: 1800000ms = 30분) -->
<property name="maxLifetime" value="${db.maxLifetime}" />
</bean>
+) class 값은 아래와 같이 maven 라이브러리에 존재하는 경로를 의미한다.

이를 java 코드로 표현하면 아래와 같다.
import com.zaxxer.hikari.HikariDataSource;
HikariDataSource dataSource = new HikariDataSource();
댓글