🍏 개발일기

EC2에서 JDBC 연결 확인 + Tomcat 배포 점검 가이드

보배 진 2026. 1. 22. 23:30

https://bobaejin.tistory.com/265

 

무료 배포 환경 구성.... 이어서 계속

💻 무료 배포 환경 구성 (EC2 + Tomcat + Oracle)1️⃣ EC2 생성 (무료티어)AWS 콘솔 → EC2 → Instances → Launch instancesAMI 선택: Amazon Linux 2023인스턴스 유형: t3.micro (무료)스토리지: 30 GB 기본 유지 (무료)보

bobaejin.tistory.com

이어서 계속..

 

 

 

sqlplus system/1234@XE

SQL에 접속

 

 

 

 

 

-- 특정 사용자 확인
SELECT username 
FROM dba_users 
WHERE username = 'KEVIN';

-- KEVIN 계정에 부여된 시스템 권한 조회
SELECT * 
FROM dba_sys_privs
WHERE grantee = 'KEVIN';

저번에 마무리 못 한 것을 이어서 하는 것이므로

오라클에서 이미 존재하는 사용자가 있는지 확인을 먼저 해보았

 

사용자를 확인해보니 KEVIN으로 어제 만들어 둔게 있었고

이어서 권한을 확인해보기 테이블 생성, DB 접속, 트리거 생성, 시퀀스 생성 .. 권한이 있는 것을 확인했다

 

 

 

 

sqlplus KEVIN/1234@localhost:1521/XE

그리고 KEVIN 계정으로 접속한다

 

 

 

 

이어서 어제 KEVIN 계정의 테이블 DDL 8개를 추출했는데

KEVIN 계정 테이블 DDL 8개를 한 번에 확인을 해보겠습니다

-- KEVIN 계정의 모든 테이블 확인
SELECT table_name
FROM all_tables
WHERE owner = 'KEVIN'
ORDER BY table_name;

조회 결과 8개의 테이블이 전부 보인다

 

 

 

 

 

 

 


 

EC2에 접속

ssh -i "C:\keys\ornably-key.pem" ec2-user@13.236.207.47

 

 

 

 

Tomcat 설치 폴더 찾기

# tomcat 폴더 찾기
sudo find / -name catalina.sh 2>/dev/null

이렇게 톰캣이 존재한다

▪️/home/ec2-user/tomcat9/bin/catalina.sh

▪️/home/ec2-user/tomcat9/apache-tomcat-9.0.111/bin/catalina.sh

 

 

 

 

 

Tomcat 프로세스 확인

ps -ef | grep tomcat

 

  • 실행 중이면 tomcat 관련 프로세스가 나옴
  • 아무 것도 안 나오면 Tomcat이 아직 시작되지 않은 상태

 

 

 

 

 

Tomcat 실행

chmod +x catalina.sh

실행 권한 확인

 

./catalina.sh start

Tomcat 시작

이제 Tomcat이 EC2에서 정상 실행 중

 

 

 

Tomcat 프로세스 확인

ps -ef | grep tomcat

지금 나온 ps -ef | grep tomcat 결과를 보면

Tomcat 프로세스가 정상 실행 중임을 알 수 있다

이제 브라우저에서 Tomcat 기본 포트인 8080으로 접근 가능하다

 

 

 

WAR 확인 및 접속

http://13.236.207.47:8080/BugSandwichOrnamentMall/ornamentListPage.do

DB 배포까지 다 한 줄 알았는데 아직도 안보임... 🔥🔥

 

 

 

 

 

지금 상태를 보면 Tomcat은 정상 실행됐고, WAR도 배포돼 있지만 웹 애플리케이션에서 DB 내용이 안 보이는 문제

즉, 배포 자체는 성공했지만 애플리케이션 → KEVIN DB 연결이 잘 안 된 것 같다

 

 

 


EC2에서 JDBC 연결 확인 + Tomcat 배포 점검 가이드

# Oracle SQL*Plus로 KEVIN 계정 접속
sqlplus KEVIN/1234@localhost:1521/XE

KEVIN 계정 DB 접속 테스트

 

SELECT table_name FROM user_tables;
SELECT COUNT(*) FROM ACCOUNT;
SELECT COUNT(*) FROM ITEM;

데이터가 조회되면 DB는 정상

 

 

출력 결과를 보면 

데이터 확인

ACCOUNT: 4행 | ITEM: 20행 다른 테이블도 이전에 확인했듯 데이터 존재

즉, DB 자체는 정상적으로 배포되고 데이터도 들어 있음

 

 

문제 포인트

cat /home/ec2-user/tomcat9/webapps/BugSandwichOrnamentMall/WEB-INF/classes/db.properties

 

PowerShell에서 시도한 위의 코드 이게 안 됨

이유: Windows PowerShell에서는 로컬 경로 기준이라 /home/ec2-user/... 경로를 찾을 수 없음

EC2 내부에서 SSH 접속 후 확인해야 함

 

지금 상태 결론

  1. DB는 정상 배포, 데이터 확인 완료
  2. Tomcat은 EC2에서 실행 중
  3. 웹에서 데이터가 안 보이는 문제 → 아마 JDBC 설정 문제 또는 WAR 파일에 올바른 DB 설정이 없음

 

 

 

EC2에 SSH 접속 후, WAR 폴더 내 WEB-INF/classes/db.properties 또는 context.xml 확인

SSH 접속 

ssh -i "C:\keys\ornably-key.pem" ec2-user@13.236.207.47

SSH 접속 이미 SSH 접속된 상태면 /home/ec2-user 경로에서 시작

접속 후 홈 디렉토리: /home/ec2-user

 

 

WAR 폴더 위치 확인

cd /home/ec2-user/tomcat9/webapps/BugSandwichOrnamentMall/WEB-INF/classes

여기 안에 db.properties 또는 context.xml이 있어야 함

 

 

DB 설정 파일 확인

cat db.properties

근데 지금 WAR 내부 WEB-INF/classes에 db.properties 파일이 없음

즉, 현재 애플리케이션에는 별도의 JDBC 설정 파일이 존재하지 않는 상태야.
이 경우 애플리케이션은 내부에 하드코딩되어 있거나, context.xml 또는 다른 방식으로 DB 연결을 하고 있을 가능성이 높다

 

 

 

그래서 이것저것 찾아봤더니

WEB-INF/classes 안에 db.properties도 없고, context.xml도 없음

있는 건 controller/, model/ 폴더뿐 → 코드만 있고 DB 설정 파일은 없음

즉, 지금 애플리케이션 DB 연결 정보가 WAR 내부에 하드코딩되어 있을 가능성이 높음.
그래서 브라우저에서 데이터가 안 보이는 문제 발생 중일 수 있음.

 

 

 

해결 방법 :  Tomcat에서 context.xml 생성

하려고 했는데 조건이 있었다

1️⃣ 조건 1: 애플리케이션 코드가 데이터소스를 참조해야 함

2️⃣ 조건 2: Tomcat 재시작

3️⃣ 조건 3: WAR 배포 경로 및 이름 확인

4️⃣ DB 계정/권한 확인

 

결론

코드가 JNDI를 사용하면 context.xml 생성 후 웹에서 데이터 표시 가능 ✅

코드가 DriverManager 하드코딩이면 context.xml만으로는 안 되고 코드 수정 필요 ⚠️

 

 

그러면서 갑자기 생각난 JDBCUtil

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="model.common.JDBCUtil" %>
<html>
<body>
<h2>KEVIN DB 연결 테스트 (전체 테이블 행 수)</h2>
<%
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    String[] tables = {"ACCOUNT", "ADDRESS", "CART", "ITEM", "ORDERS", "ORDERS_ITEM", "REVIEW", "WISHLIST"};

    try {
        conn = JDBCUtil.connect();

        if(conn == null){
            out.println("<b>DB 연결 실패! JDBCUtil.connect() 반환 null</b><br>");
        } else {
            for(String table : tables){
                try {
                    pstmt = conn.prepareStatement("SELECT COUNT(*) AS cnt FROM " + table);
                    rs = pstmt.executeQuery();
                    if(rs.next()){
                        out.println(table + " 테이블 행 수: " + rs.getInt("cnt") + "<br>");
                    }
                    rs.close();
                    pstmt.close();
                    pstmt = null;
                } catch(Exception e){
                    out.println("테이블 " + table + " 조회 중 오류: " + e.getMessage() + "<br>");
                    e.printStackTrace(new java.io.PrintWriter(out));
                }
            }
        }

    } catch(Exception e){
        out.println("오류 발생: " + e.getMessage() + "<br>");
        e.printStackTrace(new java.io.PrintWriter(out));
    } finally {
        if(pstmt != null){
            JDBCUtil.disconnect(conn, pstmt);
        } else {
            JDBCUtil.disconnect(conn);
        }
    }
%>
</body>
</html>

왜 웹에서 DB가 안 보였는지 이유를 알 수 있었다

아닐수도 있지만

 

  • JDBC 연결 완전히 하드코딩 되어 있음
  • 즉, Tomcat context.xml이나 db.properties 같은 설정을 만들어도 현재 코드는 참고하지 않음
  • 연결 URL은 localhost:1521/xe → EC2에서 실행 중인 DB는 맞음 (내부 접속 가능)

 

 

그래서 현재 환경 요약을 하면

1. JDBCUtil.java

DB 연결 완전히 하드코딩 (localhost:1521/xe, KEVIN, 1234)

DriverManager로 직접 연결 → context.xml 필요 없음

 

2. WAR 내부 : db.properties / context.xml 없음 → 코드가 하드코딩 연결을 사용

3. Tomcat : EC2에서 정상 실행 중, WAR 배포 완료

 


 

 

 현재 하드코딩된 JDBCUtil을 그대로 사용해서 Tomcat에서 DB 데이터가 바로 웹에서 보이도록 테스트하는 방법

 

 

test.jsp 생성

cd /home/ec2-user/tomcat9/webapps/BugSandwichOrnamentMall

Tomcat WAR 경로로 이동

 

vi test.jsp

 

test.jsp 파일 생성

 

 

내용 입력

<%@ page import="java.sql.*" %>
<%@ page import="model.common.JDBCUtil" %>
<html>
<body>
<h2>KEVIN DB 연결 테스트</h2>
<%
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {
        conn = JDBCUtil.connect();

        // ACCOUNT 테이블 행 수
        pstmt = conn.prepareStatement("SELECT COUNT(*) AS cnt FROM ACCOUNT");
        rs = pstmt.executeQuery();
        if(rs.next()){
            out.println("ACCOUNT 테이블 행 수: " + rs.getInt("cnt") + "<br>");
        }
        rs.close();
        pstmt.close();
        pstmt = null;

        // ITEM 테이블 행 수
        pstmt = conn.prepareStatement("SELECT COUNT(*) AS cnt FROM ITEM");
        rs = pstmt.executeQuery();
        if(rs.next()){
            out.println("ITEM 테이블 행 수: " + rs.getInt("cnt") + "<br>");
        }
        rs.close();
        pstmt.close();
        pstmt = null;

        // 필요하면 다른 테이블도 반복 추가 가능

    } catch(Exception e){
        out.println("오류 발생: " + e.getMessage() + "<br>");
        // JspWriter를 PrintWriter로 감싸서 StackTrace 출력
        e.printStackTrace(new java.io.PrintWriter(out));
    } finally {
        // pstmt가 null이면 disconnect(conn)만 호출
        if(pstmt != null){
            JDBCUtil.disconnect(conn, pstmt);
        } else {
            JDBCUtil.disconnect(conn);
        }
    }
%>
</body>
</html>

 

편집 모드

:wq : 편집 모드 종료

vi /home/ec2-user/tomcat9/webapps/BugSandwichOrnamentMall/test.jsp : test.jsp 열기 수정 모드

i : 편집 모드 진

 

 

Tomcat 재시작 (선택, 안전하게)

cd /home/ec2-user/tomcat9/bin
./catalina.sh stop
./catalina.sh start

 

 

http://13.236.207.47:8080/BugSandwichOrnamentMall/test.jsp

브라우저에서 확인

 

 

이렇게 완벽하게 DB 연결에 실패했습니다^^ 흐ㅜ흐..

Tomcat에서 JDBCUtil.connect()가 null을 반환하고 있다는 의미

즉, Tomcat에서 DB 연결 자체가 안 되고 있음

 

 

 

해결해보기

 

sudo systemctl status oracle-xe
sudo systemctl start oracle-xe

1. Oracle XE 서비스 켜져 있는지 확인

2. 안 켜져 있으면

 

실행 결과가 이렇게 나왔다

systemctl로 oracle-xe 서비스를 찾을 수 없음 → EC2에 Oracle XE 자체가 설치되어 있지 않거나 서비스가 등록되지 않음

그래서 Tomcat에서 localhost:1521/XE로 연결 시도해도 JDBCUtil.connect()가 null 반환 → DB 연결 실패

즉, 지금은 Tomcat에서 로컬 DB가 없어서 KEVIN DB에 연결 불가 상태

 

 

Oracle XE 설치 확인

rpm -qa | grep oracle

EC2에 Oracle XE 서버 자체는 설치되어 있지 않고

Oracle Instant ClientSQL*Plus만 설치되어 있음

즉, 로컬 DB(localhost:1521/XE)는 존재하지 않음 → Tomcat에서 연결 시도하면 항상 null 반환

 

 

 

외부 DB 서버 연결

이미 만든 KEVIN DB가 있는 서버 IP 사용

JDBCUtil 수정:

private static final String url = "jdbc:oracle:thin:@13.236.207.47:1521/XE";
private static final String user = "KEVIN";
private static final String password = "1234";

 

  • 13.236.207.47 → DB 서버 IP
  • 포트 1521 → 열려 있어야 함 (보안 그룹/방화벽)

 

package model.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUtil {
	private static final String driverName = "oracle.jdbc.driver.OracleDriver";
	private static final String url = "jdbc:oracle:thin:@13.236.207.47:1521:XE"; // <- 여기
	private static final String user = "KEVIN";
	private static final String password = "1234";
	
	public static Connection connect() {
		Connection conn = null;
		try {
			Class.forName(driverName);
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}		
		return conn;
	}
	
	public static void disconnect(Connection conn,PreparedStatement pstmt) {
		try {
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void disconnect(Connection conn) {
	    try {
	        if (conn != null && !conn.isClosed()) {
	            conn.close();
	        }
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	}
}

JDBCUtil  코드를 보면 "<-여기" 라고 되어 있는 부분을 수정했다

JDBCUtil.java를 이클립스에서 수정했으면 Tomcat에서 반영되도록 다시 빌드하고 배포해야한다

 

1️⃣ 프로젝트 빌드

  • 이클립스에서 프로젝트 선택 → 마우스 오른쪽 버튼 → Build Project
    • 자동 빌드 켜져 있으면 따로 안 해도 됨
    • 수동이면 Build Project 실행

2️⃣ WAR 파일 생성 (배포용)

  1. 프로젝트 선택 → Export → WAR file
  2. 저장 위치 지정 (예: E:\DATA_P\깃 배포\BugSandwichOrnamentMall.war)
  3. Export 클릭 → WAR 파일 생성

3️⃣ Tomcat에 업로드 & 배포

rm -rf /home/ec2-user/tomcat9/webapps/BugSandwichOrnamentMall

기존 웹앱 삭제 (선택)

 

 

scp -i "C:\keys\ornably-key.pem" "C:\Users\J\Desktop\BugSandwichOrnamentMall.war" ec2-user@13.236.207.47:/home/ec2-user/tomcat9/webapps/

Windows에서 PowerShell 열고

이렇게 하면 WAR 파일이 EC2 webapps/에 업로드됨

WAR 파일 업로드 (SCP 등 사용)

이제 WAR 파일이 EC2 Tomcat webapps 폴더에 성공적으로 업로드 됨

 

 

 

cd /home/ec2-user/tomcat9/bin
./catalina.sh stop
./catalina.sh start

Tomcat 재시작

 

 

http://13.236.207.47:8080/BugSandwichOrnamentMall/test.jsp

브라우저 접속

 

 

omcat test.jsp에서 바로 연결 확인