2026/11/12

오늘의 이야기

Tomcat + Java Oracle DB 연결 및 SELECT 조회하기


java



 


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로 반환하는 패턴을 가장 많이 사용한다.





오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/11

오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/10

오늘의 이야기

Tomcat SSL 설정 시 Tomcat을 새로 설치해야 할까?


톰캣



 


웹 서버를 HTTPS로 전환하기 위해 SSL 인증서를 적용할 때 많은 분들이 "Tomcat도 새로 설치해야 하나?"라는 고민을 합니다. 결론부터 말하면 대부분의 경우에는 Tomcat을 새로 설치할 필요가 없습니다.


결론


SSL 설정은 일반적으로 기존에 운영 중인 Tomcat에 인증서를 적용하는 작업입니다. 따라서 정상적으로 운영되고 있는 Tomcat이라면 SSL 설정 때문에 재설치를 진행할 필요는 없습니다.


일반적인 SSL 적용 절차



  1. SSL 인증서 준비

  2. Java Keystore 생성 또는 인증서 등록

  3. Tomcat server.xml 설정

  4. Tomcat 재시작


1. SSL 인증서 준비


다음과 같은 인증서를 사용할 수 있습니다.



  • 공인 인증서 (Let's Encrypt, DigiCert 등)

  • 사설(Self-Signed) 인증서


2. Java Keystore 생성


keytool -importkeystore \
-srckeystore certificate.pfx \
-srcstoretype PKCS12 \
-destkeystore keystore.jks

PFX 형식의 인증서를 Tomcat에서 사용할 수 있는 JKS(KeyStore) 형식으로 변환합니다.


3. server.xml 설정


Tomcat의 server.xml 파일에 HTTPS 커넥터를 설정합니다.


<Connector
port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150">

<SSLHostConfig>
<Certificate
certificateKeystoreFile="conf/keystore.jks"
certificateKeystorePassword="비밀번호"
type="RSA" />
</SSLHostConfig>

</Connector>

4. Tomcat 재시작


shutdown.sh
startup.sh

설정 변경 후 Tomcat을 재시작하면 HTTPS 접속이 가능합니다.


Tomcat 재설치가 필요한 경우


일반적인 SSL 적용에서는 재설치가 필요하지 않지만 다음과 같은 경우에는 새 버전 설치 또는 마이그레이션을 검토할 수 있습니다.



  • Tomcat 버전이 너무 오래된 경우

  • Java 버전과의 호환성 문제가 있는 경우

  • 운영 서버를 새 환경으로 이전하는 경우

  • 기존 설정 파일이 복잡하게 꼬여 있어 재구성이 더 효율적인 경우


정리


SSL 인증서를 적용한다고 해서 Tomcat을 새로 설치해야 하는 것은 아닙니다. 대부분은 기존 Tomcat 환경에 인증서를 등록하고 HTTPS 커넥터를 설정한 뒤, Tomcat을 재시작하는 것만으로 SSL 적용이 완료됩니다.


한 줄 요약
SSL 설정 = 인증서 적용 및 설정 변경 작업이며, 일반적으로 Tomcat 재설치는 필요하지 않습니다.




오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/09

[LottoAI] 1250회차 추천 번호

LottoAI 추천 리포트 - 1250회차

LottoAI는 당첨 번호를 예측하는 도구가 아니라, 과거 추첨 데이터에서 뽑은 약 20개의 통계 피처(출현 빈도, 갭, 이동평균, 페어/트리플 패턴, 엔트로피, 베이지안, 마르코프 체인 등)로 번호 조합을 점수화하고, 조합끼리 번호가 겹치지 않도록 다양성 기준으로 상위 5개를 뽑아 보여주는 통계 분석 리포트입니다.

지난 회차 결과 (1249회차)
실제 당첨 번호: (2, 11, 16, 25, 34, 35) (보너스 14)
지난 추천 최고 적중: 2개


이번 회차 추천 Top 5

순위 번호 특징 핵심 근거
1 7, 13, 15, 16, 19, 28 odd/even=4/2, sum=98, sum-profile=historical-edge, low-high-balance, overlap-minimized, collective-coverage-maximized transition_score 14.4%, bayesian_score 12.2%, markov_chain_score 9.4%
2 3, 9, 13, 18, 38, 44 odd/even=3/3, sum=125, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized transition_score 14.8%, bayesian_score 12.2%, markov_chain_score 9.8%
3 3, 6, 16, 29, 30, 31 odd/even=3/3, sum=115, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized transition_score 13.9%, gap 12.0%, bayesian_score 10.1%
4 7, 17, 22, 29, 33, 38 odd/even=4/2, sum=146, sum-profile=historical-center, low-high-balance, overlap-minimized, collective-coverage-maximized transition_score 14.2%, bayesian_score 10.5%, markov_chain_score 9.8%
5 15, 30, 33, 34, 37, 44 odd/even=3/3, sum=193, sum-profile=historical-edge, low-high-balance, overlap-minimized, collective-coverage-maximized transition_score 15.2%, gap 10.6%, bayesian_score 10.3%

검증 결과 (2026-09-27, 1~1243회 전체 데이터)

  • 사전에 정한 가설(핫넘버, 콜드넘버, 장기 미출현, 전이 관계 등 12개 전략)을 과거 데이터만으로 다음 회차를 맞히는 방식(워크포워드)으로 1043회차에 걸쳐 검증하고 다중 비교 보정을 적용한 결과, 무작위 선택보다 나은 전략은 하나도 없었습니다.
  • 12개 전략의 회차당 평균 적중은 0.744~0.824개로, 무작위 기댓값 0.8개와 통계적으로 구별되지 않습니다. 최근 100회에서만 좋아 보인 전략도 전체 구간에서는 재현되지 않았습니다.
  • 연속번호, 홀짝 비율, 번호 합계, 직전 회차 재등장, 번호 쌍 동시 출현 분포도 모두 완전 무작위 추첨과 구별되지 않습니다. 과거 번호에서 활용할 수 있는 패턴은 발견되지 않았습니다.
  • 이 리포트의 추천 모델도 무작위와 통계적으로 구별되지 않습니다. 즉 추천 번호는 무작위로 고른 번호보다 당첨 가능성이 높지 않습니다.

성능 통계 (2026-09-27 기준)

  • 실측 평가 이력 145건(약 29회차) 평균 적중 0.593개 - 랜덤 기댓값(0.8개)보다 낮습니다.
  • walk-forward 백테스트(1200~1240회차, 41회차 205게임): 모델 평균 적중 0.702개 vs 무작위 기댓값 0.8개 (p=0.10, 무작위와 통계적으로 구별되지 않음).
  • 역대 최고 적중은 6개 중 3개(5등 수준)이며, 4개 이상 적중한 적은 없습니다.
  • '후보 순위'는 생성된 후보 풀 안에서의 상대 순위일 뿐 당첨 확률이 아닙니다. 순위와 실제 적중 사이에 뚜렷한 상관관계는 관찰되지 않았습니다.
  • Top5는 서로 겹치지 않도록 다양화한 조합일 뿐, 다양성이 적중률이 더 높다는 뜻은 아닙니다.
  • 본 결과는 통계 기반 참고자료이며 당첨을 보장하지 않습니다.

오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/08

오늘의 이야기


#스하리1000명프로젝트,
In Korea verloren? Auch wenn Sie kein Koreanisch sprechen, hilft Ihnen diese App dabei, sich problemlos fortzubewegen.
Sprechen Sie einfach Ihre Sprache – es übersetzt, sucht und zeigt Ergebnisse in Ihrer Sprache an.
Ideal für Reisende! Unterstützt mehr als 10 Sprachen, darunter Englisch, Japanisch, Chinesisch, Vietnamesisch und mehr.
Probieren Sie es jetzt aus!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/07

오늘의 이야기

Java에서 Oracle 접속 시 "Could not commit with auto-commit set on" 오류 해결 방법


oracle 오류



 


Java 애플리케이션에서 Oracle DB에 접속하여 데이터를 처리하는 과정에서 다음과 같은 오류를 만날 수 있습니다.


java.sql.SQLException: Could not commit with auto-commit set on

이 오류는 대부분 JDBC의 Auto Commit 설정과 관련이 있습니다.




오류 원인


JDBC에서는 기본적으로 Auto Commit이 활성화(true)되어 있는 경우가 많습니다. Auto Commit이 활성화된 상태에서는 SQL 실행 후 자동으로 Commit이 수행됩니다.


그런데 개발자가 별도로 commit()을 호출하면 다음과 같은 오류가 발생할 수 있습니다.


Connection conn = DriverManager.getConnection(url, id, pw);

System.out.println(conn.getAutoCommit()); // true

// SQL 처리

conn.commit(); // 예외 발생 가능

즉, 이미 자동으로 Commit이 수행되고 있는데 다시 Commit을 요청했기 때문에 발생하는 문제입니다.




잘못된 예제


conn.setAutoCommit(true);

// INSERT, UPDATE 수행

conn.commit(); // Could not commit with auto-commit set on



해결 방법 1. commit() 제거


트랜잭션을 직접 관리할 필요가 없다면 Auto Commit을 그대로 사용하고 명시적인 commit() 호출을 제거하면 됩니다.


conn.setAutoCommit(true);

// SQL 수행

// conn.commit(); 제거



해결 방법 2. 수동 트랜잭션 관리


여러 개의 SQL을 하나의 트랜잭션으로 관리해야 한다면 Auto Commit을 비활성화해야 합니다.


conn.setAutoCommit(false);

try {

// SQL 수행

conn.commit();

} catch (Exception e) {

conn.rollback();

}

이 경우 개발자가 직접 Commit과 Rollback을 제어할 수 있습니다.




원인 확인 방법


오류가 발생하는 위치 직전에 Auto Commit 상태를 확인해보는 것이 좋습니다.


System.out.println("AutoCommit = " + conn.getAutoCommit());

결과가 true인데 conn.commit()을 호출하고 있다면 해당 오류의 원인일 가능성이 매우 높습니다.




Spring 환경에서는?


Spring Framework에서 @Transactional을 사용하는 경우에는 트랜잭션을 Spring이 관리합니다.


따라서 서비스 코드에서 직접 commit()이나 rollback()을 호출하면 예상치 못한 오류가 발생할 수 있습니다.


이 경우에는 Spring의 트랜잭션 관리 기능에 맡기는 것이 올바른 방법입니다.




정리



  • Auto Commit이 true인 상태에서 commit() 호출 시 오류가 발생할 수 있다.

  • 자동 커밋을 사용할 경우 commit()을 제거한다.

  • 직접 트랜잭션을 관리하려면 setAutoCommit(false)를 설정한다.

  • Spring의 @Transactional 사용 시에는 직접 Commit을 호출하지 않는다.


"Could not commit with auto-commit set on" 오류가 발생하면 가장 먼저 conn.getAutoCommit() 값을 확인하는 것이 문제 해결의 출발점이다.





오늘의 이야기


#스하리1000명프로젝트,
แพ้เกาหลีเหรอ? แม้ว่าคุณจะพูดภาษาเกาหลีไม่ได้ แต่แอปนี้จะช่วยให้คุณเดินทางได้อย่างง่ายดาย
เพียงพูดภาษาของคุณ ระบบจะแปล ค้นหา และแสดงผลลัพธ์เป็นภาษาของคุณ
เหมาะสำหรับนักเดินทาง! รองรับมากกว่า 10 ภาษา รวมถึงภาษาอังกฤษ ญี่ปุ่น จีน เวียดนาม และอื่นๆ อีกมากมาย
ลองตอนนี้!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/11/06

오늘의 이야기


#스하리1000명프로젝트,

Lost in Korea? Even if you don't speak Korean, this app helps you get around easily.
Just speak your language—it translates, searches, and shows results back in your language.
Great for travelers! Supports 10+ languages including English, Japanese, Chinese, Vietnamese, and more.
Try it now!

https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




오늘의 이야기

Tomcat + Java Oracle DB 연결 및 SELECT 조회하기 java   Java 웹 애플리케이션에서 Oracle DB를 연동할 때는 JDBC를 이용하여 연결하고, Tomcat 환경에...