리타의 저장소

JAVA | Java에서 DB 커넥션을 얻는 방법 #2 (feat. PreparedStatement) 본문

Dev/Backend

JAVA | Java에서 DB 커넥션을 얻는 방법 #2 (feat. PreparedStatement)

ريتا 2025. 10. 11. 23:31

Java

 

신기한 점 발견

앞서 Java에서 DB 커넥션을 얻는 방법 #1에서 DriverManager & DataSource 방식에 대해서 알아보다보니, 실제 소스에 Oracle 커넥션 맺는 부분이 당연히 DataSource 방식일거라 생각했는데 아니었다. PostgreDbcp와 다르게 Oracle의 ConnectionDbcp는 .getConnection() 메서드를 까보니, DriverManager 방식으로 커넥션을 생성 중이더라.

 

 

분명 DriverManager방식은 실제 운영하는 서비스에서는 잘 안쓰인다고 했는데, 왜 이렇게 쓰인걸까,,,?

찾아보니 이건 그냥 DriverManager.getConnection() 방식도 아니었다.

소스에서 젤 중요한 부분은 "jdbc:apache:commons:dbcp:...” 부분이다.

 

🫙소스 예시 

public Connection getConnection(){
    Connection con = null;
    try {
        con = DriverManager.getConnection("jdbc:apache:commons:dbcp:tarimall");

        printDriverStats();
       } catch(SQLException ex) {
        ex.printStackTrace();
    }
    return con;
}

 

 

✅ 여기서 DriverManager.getConnection("jdbc:apache:commons:dbcp:tarimall")

✅ 이건 "apache commons dbcp 커넥션 풀"  DriverManager를 통해 불러오는 방식이다.

 

번외 - jdbc:apache:commons:dbcp:tarimall 은 어디에 등록되어있나? (이건 나중에 다시 짚어볼 예정이다!)
결론만 말하면, 처음엔 context.xml / server.xml을 보면 답이 나올 줄 알았는데, 그냥 getConnection()이 위치하고 있는 클래스 내부에 선언되어있었음.. 수동 등록 중...

 

 

결과적으로, 우리 회사 소스는 ConnectionDbcp.setupDriver() 메서드 내부에서 "tarimall"이라는 이름으로 커넥션 풀을 수동 등록해주고 있었고, 이후 DriverManager.getConnection("jdbc:apache:commons:dbcp:tarimall")으로 만들어놓은 풀에서 커넥션을 빌려오는 구조였다.

 

그럼 이게 정확히 뭐냐?

  • 일반적으로 DriverManager.getConnection(url, user, password)는 DB 직접 연결을 하는데 ??
  • jdbc:apache:commons:dbcp:XXX 이 포맷은 Apache Commons DBCP 가 등록해놓은 "JDBC 드라이버 대행자" 역할을 한다.
  • 즉, 실제 DB랑 연결하는 게 아니라, ➡️ 등록된 커넥션 풀(pool: tarimall) 에서 커넥션을 꺼내는 것.

정리

  • 겉은 DriverManager지만,
  • 실제로는 DataSource를 통해 커넥션 풀에서 커넥션을 꺼내오는 셈.
    구분 설명
    표면상 DriverManager 사용
    실제 동작 DBCP 커넥션 풀에서 커넥션 빌려오기
    왜 이렇게 썼을까? 전통적인 Commons DBCP 1.x 방식. 별도로 DataSource 객체 주입 안 해도 되게 하려고
    지금 관점에서는? 약간 구식 방법. 요즘은 직접 DataSource 주입받아서 쓰는 걸 선호한다고 한다
  • DriverManager를 통해 DBCP ConnectionPool 안의 커넥션을 요청하는 방식.

 

결론 : "jdbc:apache:commons:dbcp:tarimall"의 의미

  • jdbc:apache:commons:dbcp: → DBCP 드라이버를 통한 요청
  • tarimall → DBCP 설정 파일(또는 컨텍스트)에 등록된 커넥션 풀 이름

즉, "tarimall"이라는 이름의 커넥션 풀에서 커넥션을 가져온다. ConnectionDbcp.getConnection()은 겉으로는 DriverManager를 쓰지만, 실제로는 Apache Commons DBCP 커넥션 풀을 통해 커넥션을 빌려오는 구조다.

우리 회사쪽에서 쓴 DriverManager 에서 커넥션을 생성하는 방식은, 직접 연결과 다르게 빌렸는 방식이라. 마치 커넥션 풀에서 빌려다 쓰는것과 같은 느낌이 난다는 것!!

DriverManager.getConnection("jdbc:apache:commons:dbcp:tarimall")

 

왜 이런 형태로 사용하게 된건지는 우리 쇼핑몰이 영업이 잠정 중단되었기 때문에 선임들에게 물어볼 수는 없었다.

하지만, 나에겐 ChatGPT라는 동반자가 있어서, 어떤 이유로 이렇게 사용했던 것인지 물어봤다.

 

GPT 曰

과거에는, Java 코드에서 DataSource를 직접 주입하거나 관리하는 게 불편했어.

그래서 톰캣 같은 WAS(Web Application Server) 환경에서

server.xml이나 context.xml에 DataSource를 미리 등록해놓고,

거기에 "타리킴" 같은 이름을 붙였어.

그리고 Java 코드에서는형식으로 요청하는 거야.

jdbc:apache:commons:dbcp:풀 이름

그럼 코드는 단순하고, 커넥션 풀은 서버단에서 관리할 수 있어서 편한거지!

 

 

그렇다네요,, 여하튼 정리해보면..

 

→ DriverManager.getConnection("jdbc:apache:commons:dbcp:tarimall")

→ Commons-DBCP 커넥션 풀에서 커넥션을 빌려온다.

 

요즘은,

  • Spring Boot나
  • 직접 HiKariCP DataSource 설정 을 통해
  • DriverManager 없이 DataSource 객체 직접 관리 하는 방식을 더 선호한다고 한다.
  • HikariCP가 훨씬 가볍고 빨라서 (DBCP 보다 2~3배 빠른 수준)

 

참고..

아무래도 우리 쇼핑몰 같은경우 오픈한지 꽤 오래 되었기도해서, 일부 이런 부분이 남아있는 것으로 보인다. 내가 담당하는 파트를 제외하고는 운영소스가 원체 오래 돼서 일일히 다 까볼 생각은 미처 하지 못했는데, 다시 정상화가 되려는 조짐이 보여서 소스를 다시 찬찬히 훑고 있는데 요즘은 소스 분석하는게 은근 재미있다. 

 

요즘 방식 엿보기

  • Spring Boot + HikariCP 조합으로,
  • DataSource 객체를 직접 주입받아 사용한다고 한다.
@Autowired
private DataSource dataSource;

Connection conn = dataSource.getConnection();

 

 

깔끔하면서, 관리도 쉽게 말이다.