2026/11/14

오늘의 이야기

Python으로 파일 인코딩(Encoding) 변환하기


인코딩 설명 하기



 


파일을 다루다 보면 UTF-8, EUC-KR, CP949 등의 인코딩 형식 때문에 한글이 깨지는 경우가 자주 발생한다. 이번 글에서는 Python으로 텍스트 파일의 인코딩을 변환하는 방법을 알아본다.


UTF-8 → EUC-KR 변환


with open("input.txt", "r", encoding="utf-8") as f:
text = f.read()

with open("output.txt", "w", encoding="euc-kr") as f:
f.write(text)

UTF-8 형식으로 저장된 파일을 읽은 후 EUC-KR 형식으로 다시 저장한다.


EUC-KR → UTF-8 변환


with open("input.txt", "r", encoding="euc-kr") as f:
text = f.read()

with open("output.txt", "w", encoding="utf-8") as f:
f.write(text)

국내 레거시 시스템에서 사용하는 EUC-KR 파일을 UTF-8로 변환할 때 유용하다.


바이너리(Binary) 방식으로 변환하기


with open("input.txt", "rb") as f:
data = f.read()

text = data.decode("cp949") # 원본 인코딩
new_data = text.encode("utf-8")

with open("output.txt", "wb") as f:
f.write(new_data)

파일을 바이트 단위로 읽고 직접 decode/encode를 수행하는 방법이다. 원본 인코딩을 정확히 알고 있을 때 사용하면 된다.


파일 인코딩 자동 확인하기


인코딩을 모를 경우 chardet 라이브러리를 사용해 추정할 수 있다.


import chardet

with open("input.txt", "rb") as f:
result = chardet.detect(f.read())

print(result)

실행 결과 예시


{
'encoding': 'EUC-KR',
'confidence': 0.99
}

chardet 설치


pip install chardet

마무리


Python에서는 open() 함수의 encoding 옵션만으로도 간단하게 인코딩 변환을 수행할 수 있다. 원본 인코딩을 모르는 경우에는 chardet를 활용하여 인코딩을 먼저 확인한 후 변환 작업을 진행하는 것이 안전하다.





오늘의 이야기


#스하리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/13

오늘의 이야기


#스하리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/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




오늘의 이야기

Python으로 파일 인코딩(Encoding) 변환하기 인코딩 설명 하기   파일을 다루다 보면 UTF-8, EUC-KR, CP949 등의 인코딩 형식 때문에 한글이 깨지는 경우가 자주 발생한다....