Tomcat + Java Oracle DB 연결 및 SELECT 조회하기
Java 웹 애플리케이션에서 Oracle DB를 연동할 때는 JDBC를 이용하여 연결하고, Tomcat 환경에서는 DataSource(JNDI)를 사용하는 것이 일반적입니다. 이번 글에서는 Oracle DB 연결 방법과 SELECT 결과 조회 방법을 정리합니다.
1. Oracle JDBC Driver 추가
Maven 프로젝트인 경우 pom.xml에 아래 의존성을 추가합니다.
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>23.3.0.23.09</version>
</dependency>
2. Oracle DB 직접 연결
Service Name 방식 (권장)
import java.sql.Connection;
import java.sql.DriverManager;
public class OracleConnectionTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@//192.168.0.10:1521/ORCL";
String user = "scott";
String password = "tiger";
try (Connection conn =
DriverManager.getConnection(url, user, password)) {
System.out.println("DB 연결 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
최근 Oracle 버전에서는 SID보다 Service Name 사용이 권장됩니다.
3. TNS Name을 이용한 연결
tnsnames.ora에 아래와 같이 등록되어 있다고 가정합니다.
MYDB=
(DESCRIPTION =
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.10)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=ORCL)
)
)
Java 코드에서는 TNS Alias만 사용하면 됩니다.
String url = "jdbc:oracle:thin:@MYDB";
Connection conn =
DriverManager.getConnection(url, "scott", "tiger");
TNS_ADMIN 설정
Oracle JDBC Driver가 tnsnames.ora를 찾을 수 있도록 설정합니다.
# Linux
export TNS_ADMIN=/oracle/network/admin
또는
-Doracle.net.tns_admin=/oracle/network/admin
4. Tomcat DataSource 설정
운영 환경에서는 DriverManager 대신 DataSource를 사용하는 것이 좋습니다. 커넥션 풀을 사용하여 성능을 향상시킬 수 있습니다.
context.xml 또는 server.xml 설정
<Resource
name="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@MYDB"
username="scott"
password="tiger"
maxTotal="30"
maxIdle="10"/>
Java 코드
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:/comp/env");
DataSource ds =
(DataSource) envCtx.lookup("jdbc/MyDB");
try (Connection conn = ds.getConnection()) {
System.out.println("DB 연결 성공");
}
5. SELECT 단건 조회
import java.sql.*;
public class SelectTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@//localhost:1521/ORCL";
String user = "scott";
String password = "tiger";
String sql =
"SELECT EMPNO, ENAME, SAL FROM EMP WHERE EMPNO = ?";
try (
Connection conn =
DriverManager.getConnection(url, user, password);
PreparedStatement pstmt =
conn.prepareStatement(sql)
) {
pstmt.setInt(1, 7369);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
int empno = rs.getInt("EMPNO");
String ename = rs.getString("ENAME");
int sal = rs.getInt("SAL");
System.out.println("사번 : " + empno);
System.out.println("이름 : " + ename);
System.out.println("급여 : " + sal);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6. SELECT 다건 조회
String sql =
"SELECT EMPNO, ENAME, JOB, SAL FROM EMP";
try (
Connection conn =
DriverManager.getConnection(url, user, password);
PreparedStatement pstmt =
conn.prepareStatement(sql);
ResultSet rs =
pstmt.executeQuery()
) {
while (rs.next()) {
int empno = rs.getInt("EMPNO");
String ename = rs.getString("ENAME");
String job = rs.getString("JOB");
int sal = rs.getInt("SAL");
System.out.println(
empno + " | " +
ename + " | " +
job + " | " +
sal
);
}
}
7. DTO 객체에 담기
Employee 클래스
public class Employee {
private int empno;
private String ename;
private int sal;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
}
List로 저장
List<Employee> list = new ArrayList<>();
while (rs.next()) {
Employee emp = new Employee();
emp.setEmpno(rs.getInt("EMPNO"));
emp.setEname(rs.getString("ENAME"));
emp.setSal(rs.getInt("SAL"));
list.add(emp);
}
8. 컬럼 타입별 조회 방법
rs.getString("NAME"); // VARCHAR2
rs.getInt("AGE"); // NUMBER
rs.getLong("ID"); // NUMBER
rs.getDouble("AMOUNT"); // NUMBER
rs.getDate("REG_DT"); // DATE
rs.getTimestamp("CRT_DT"); // TIMESTAMP
정리
- Oracle 연동은 JDBC Driver를 통해 수행한다.
- Service Name 방식 사용을 권장한다.
- TNS Name 사용 시 TNS_ADMIN 설정이 필요하다.
- Tomcat 환경에서는 DataSource(JNDI) 방식을 권장한다.
- SELECT 결과는 ResultSet 객체를 이용하여 조회한다.
- 실무에서는 ResultSet 데이터를 DTO 객체에 담아 List로 반환하는 패턴을 가장 많이 사용한다.

