2026년 필수 JDBC 면접 질문 50가지 및 전문가 답변

JDBC 면접을 준비하려면 데이터베이스 연결, 성능 튜닝, 보안 모범 사례에 대한 깊은 이해가 필요합니다. 다음 50가지 질문은 리크루터가 우선시하는 핵심 개념과 실전 시나리오를 다룹니다.
👉 무료 PDF 다운로드: JDBC 면접 질문 및 답변
1) JDBC란 무엇이며 Java 애플리케이션에서 왜 중요한가요?
JDBC(Java Database Connectivity)는 Java 프로그램이 관계형 데이터베이스와 상호작용할 수 있게 하는 핵심 API입니다. SQL 실행, 결과 처리, 트랜잭션 제어를 표준화하여 MySQL, Oracle, PostgreSQL 등 간에 최소한의 변경으로 전환 가능한 데이터베이스 독립적 코드 작성을 가능하게 합니다.
2) 네 가지 JDBC 드라이버 유형과 주요 차이점은?
- 유형 1 (JDBC-ODBC 브리지): JDBC를 ODBC로 연결; 사용하기 쉽지만 ODBC 필요하고 느림.
- 유형 2 (네이티브 API): 네이티브 DB 라이브러리 호출; 유형 1보다 빠르지만 플랫폼 종속적.
- 유형 3 (네트워크 프로토콜): 미들웨어를 사용해 호출 변환; 데이터베이스 독립적이지만 네트워크 오버헤드 추가.
- 유형 4 (씬 드라이버): 순수 Java, DB와 직접 통신; 최고 성능과 이식성. 최신 앱 대부분이 유형 4 사용.
3) JDBC 프로그램의 수명 주기를 설명하세요.
- 드라이버 로드:
Class.forName("com.mysql.cj.jdbc.Driver")
DriverManager 또는 DataSource를 통해 Connection 수립.
Statement, PreparedStatement, CallableStatement 생성.
- SQL 실행 (쿼리, 업데이트, 프로시저).
- 해당하는 경우
ResultSet 처리.
- 모든 리소스 종료 (
try-with-resources 선호).
4) Statement, PreparedStatement, CallableStatement를 언제 사용해야 하나요?
- Statement: 정적 SQL; 일회성 쿼리에 적합.
- PreparedStatement: 매개변수화된 쿼리; SQL 인젝션 방지 및 사전 컴파일로 성능 향상.
- CallableStatement: 저장 프로시저 또는 함수; 복잡한 DB 로직 캡슐화.
5) JDBC에서 트랜잭션을 어떻게 관리하나요?
- 자동 커밋 비활성화:
conn.setAutoCommit(false)
- 여러 문장 실행.
- 성공 시
conn.commit(), 실패 시 conn.rollback().
자금 이체 같은 원자적 연산에 이 패턴 사용.
6) JDBC 커넥션 풀링의 장단점은?
- 장점: 커넥션 재사용, 지연 시간 감소, 부하 하에서 확장.
- 단점: 신중한 구성 필요; 갱신하지 않으면 스테일 커넥션 발생 가능.
HikariCP, Apache DBCP 같은 프레임워크가 업계 표준.
7) execute(), executeQuery(), executeUpdate() 차이점은?
execute(): 모든 SQL; ResultSet 생성 여부를 boolean으로 반환.
executeQuery(): SELECT 문; ResultSet 반환.
executeUpdate(): INSERT, UPDATE, DELETE; 영향받은 행 수 반환.
8) JDBC 성능을 개선하는 전략은?
- 사전 컴파일을 위해
PreparedStatement 사용.
addBatch()/executeBatch()로 배치 업데이트.
- 커넥션 풀링.
- 필요한 컬럼만 선택.
- 리소스 신속히 종료.
9) JDBC에서 배치 업데이트 설명.
PreparedStatement ps = conn.prepareStatement("INSERT INTO student VALUES(?,?)");
for(int i=1;i<=1000;i++){
ps.setInt(1,i);
ps.setString(2,"Name"+i);
ps.addBatch();
}
ps.executeBatch();
라운드트립 감소 및 처리량 증대.
10) ResultSet의 역할은?
ResultSet은 쿼리 결과를 보관합니다. 생성 플래그에 따라 순방향 전용, 스크롤 가능, 업데이트 가능할 수 있습니다.
11) JDBC와 ODBC 비교.
- JDBC: 순수 Java, 플랫폼 독립적, 고성능.
- ODBC: C 기반, 플랫폼 종속적, 네이티브 드라이버 필요.
12) JDBC 아키텍처 구성 요소는?
- JDBC API (Connection, Statement, ResultSet).
- 드라이버 매니저 (드라이버 등록).
- 드라이버 구현체 (유형 1-4).
- 데이터베이스 백엔드.
13) ResultSetMetaData와 DatabaseMetaData 차이점.
- ResultSetMetaData: 특정 쿼리의 컬럼 이름, 타입.
- DatabaseMetaData: 드라이버 이름, 데이터베이스 제품, 지원되는 SQL 기능.
14) Savepoints 사용법.
conn.setAutoCommit(false);
Savepoint sp = conn.setSavepoint("sp1");
// 연산들
conn.rollback(sp); // 부분 롤백
conn.commit();
15) RowSet과 변형 정의.
- JdbcRowSet – 연결됨.
- CachedRowSet – 연결 해제, 직렬화 가능.
- WebRowSet – XML 기반.
- FilteredRowSet – 필터된 뷰.
- JoinRowSet – 여러 RowSet 병합.
16) JDBC가 SQL 예외를 어떻게 처리하나요?
SQLException은 getErrorCode(), getSQLState(), getMessage() 제공. 실패 시 항상 로깅하고 롤백.
17) 배치 처리란?
여러 DML 문을 단일 라운드트립으로 그룹화; addBatch()와 executeBatch() 사용.
18) 문 유형 다시 나열.
- Statement – 정적 SQL.
- PreparedStatement – 매개변수화.
- CallableStatement – 저장 프로시저.
19) 효율적인 커넥션 관리.
커넥션 풀링이 된 DataSource 선호. 자동 정리를 위해 try-with-resources 사용.
20) JDBC Statement vs Hibernate Session.
- JDBC: 저수준, 수동 매핑.
- Hibernate: ORM, 캐싱, 자동 SQL 생성.
21) 자동 생성 키 조회.
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
22) BLOB과 CLOB 처리.
- BLOB – 바이너리 스트림.
- CLOB – 문자 스트림.
23) ResultSet을 스크롤 가능/업데이트 가능하게 만들기.
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEE");
rs.absolute(3);
rs.updateString("name", "UpdatedName");
rs.updateRow();
24) DataSource vs DriverManager.
- DriverManager – 단순, 풀링 없음.
- DataSource – JNDI 조회, 풀링, XA 지원.
25) PreparedStatement로 배치 처리.
for(int i=1;i<=5;i++){
ps.setInt(1,i);
ps.setString(2,"Student"+i);
ps.addBatch();
}
ps.executeBatch();
26) DatabaseMetaData 사용.
DatabaseMetaData dbmd = conn.getMetaData();
System.out.println("DB: " + dbmd.getDatabaseProductName());
27) execute 변형 요약.
- execute() – boolean.
- executeQuery() – ResultSet.
- executeUpdate() – int.
28) JDBC 리소스 종료.
try (Connection c = ds.getConnection();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * FROM EMPLOYEE")) {
while(rs.next()){ /* 처리 */ }
}
29) 일반적인 성능 최적화.
- 커넥션 풀링.
- Statement 대신 PreparedStatement.
- 배치 업데이트.
- 페치 크기 튜닝.
- 선택적 컬럼 조회.
30) 저장 프로시저 호출.
CallableStatement cs = conn.prepareCall("{call getEmployeeSalary(?)}");
cs.setInt(1,101);
ResultSet rs = cs.executeQuery();
31) JDBC 커넥션 풀링 내부 동작.
초기화 시 풀이 고정된 커넥션 세트 생성. 요청 시 커넥션 대여; 사용 후 반환하여 리소스를 메모리에 유지.
32) HikariCP 구성.
HikariConfig cfg = new HikariConfig();
cfg.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
cfg.setUsername("root");
cfg.setPassword("pw");
cfg.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(cfg);
33) DriverManager vs DataSource.
- DriverManager – 직접 연결, 풀링 없음.
- DataSource – 풀링, XA, JNDI.
34) "No suitable driver found" 일반적인 원인.
- 드라이버 JAR이 클래스패스에 없음.
- 잘못된 JDBC URL.
Class.forName() 누락 (Java 9 이전).
- 드라이버-DB 버전 불일치.
35) SQL 인젝션 방지.
- 항상 매개변수와 함께
PreparedStatement 사용.
- 사용자 입력 검증 및 정제.
- DB 권한 제한.
36) JDBC vs ORM (Hibernate).
- JDBC: 세밀한 제어, 수동 매핑, 경량.
- Hibernate: 자동 ORM, 캐싱, 학습 곡선 높음.
37) SQL 쿼리 로깅.
- 드라이버 로깅 활성화 (예: MySQL의
logger=com.mysql.cj.log.StandardLogger).
- P6Spy 또는 datasource-proxy로 가로채기 및 로깅.
38) JDBC로 안전한 멀티스레딩.
Connection 객체를 스레드 간 공유하지 않음.
- 스레드별로 풀에서 커넥션 대여.
try-with-resources로 리소스 종료.
39) Spring / Spring Boot에서의 JDBC.
Spring의 JdbcTemplate이 보일러플레이트, 예외 변환, 커넥션 풀링을 자동 처리.
40) JDBC 커넥션 상태.
- 초기화 → 열림 → 트랜잭션 중 → 커밋/롤백됨 → 닫힘.
41) 드라이버 유형 요약.
- 유형 1 – 저성능, ODBC 필요.
- 유형 2 – 네이티브, 중간 성능.
- 유형 3 – 미들웨어, 중간 성능.
- 유형 4 – 순수 Java, 최고 성능.
42) 트랜잭션 격리 수준.
- READ_UNCOMMITTED – 더티 리드.
- READ_COMMITTED – 기본값, 더티 리드 방지.
- REPEATABLE_READ – 반복 불가능한 리드 방지.
- SERIALIZABLE – 엄격한 격리, 팬텀 리드 방지.
43) 분산 (XA) 트랜잭션.
javax.sql.XADataSource와 JTA 매니저(Atomikos, Bitronix, Spring) 사용.
- 두 단계 커밋으로 여러 DB 간 커밋 조정.
44) JDBC 성능 프로파일링.
- P6Spy, datasource-proxy로 쿼리 로깅.
- Java Flight Recorder / JVisualVM으로 커넥션 사용량 모니터링.
- 데이터베이스 EXPLAIN 플랜으로 쿼리 튜닝.
- Prometheus + Grafana로 메트릭 수집.
45) JDBC 메모리 누수 방지.
try-with-resources로 ResultSet, Statement, Connection 항상 종료.
- 풀 타임아웃 구성 (maxIdleTime, maxLifetime).
- 범위 밖에서 ResultSet 보유하지 않음.
46) 마이크로서비스/클라우드에서의 JDBC.
- 경량 풀링을 위한 HikariCP.
- 스테이트리스 JDBC 세션.
- 읽기 복제본, 캐싱 (Redis).
- DB 페일오버를 위한 Resilience4j 서킷 브레이커.
47) 커넥션 실패 우아하게 처리.
for(int i=0;i<3;i++){
try(Connection c=ds.getConnection()){
break;
} catch(SQLTransientConnectionException e){
Thread.sleep(1000*(i+1));
}
}
48) 커밋, 롤백, 세이브포인트 차이.
- 커밋 – 모든 변경 사항 확정.
- 롤백 – 마지막 커밋으로 되돌림.
- 세이브포인트 – 부분 롤백 대상.
49) JDBC 메타데이터 유용성.
- 동적 스키마 검사.
- 데이터베이스 기능 확인.
- ORM 생성을 위한 툴링.
50) 엔터프라이즈 JDBC 모범 사례.
- 풀링된
DataSource 사용.
PreparedStatement 선호.
- 적절한 격리 수준으로 트랜잭션 처리.
- 배치 연산과 페이지네이션.
- 쿼리 로깅 및 모니터링.
- 예외 및 재시도 우아하게 처리.
🔍 실전 시나리오와 전략적 답변이 포함된 주요 JDBC 면접 질문
아래는 면접관이 기대하는 내용과 강력한 예시 답변이 포함된 10가지 신중하게 작성된 JDBC 면접 질문입니다.
1) JDBC란 무엇이며 왜 중요한가요?
예상 답변: JDBC는 데이터베이스 접근을 위한 Java API이며, SQL 실행, 결과 처리, 트랜잭션을 추상화하여 데이터베이스 독립적 코드를 가능하게 합니다.
2) JDBC 드라이버 유형 설명.
예상 답변: 네 가지 유형: JDBC-ODBC 브리지, 네이티브 API, 네트워크 프로토콜, 씬 드라이버. 오늘날 유형 4가 가장 일반적.
3) 커넥션을 효율적으로 관리하는 방법?
예상 답변: HikariCP 같은 커넥션 풀 사용; 요청마다 커넥션 열고 닫기 지양.
4) Statement, PreparedStatement, CallableStatement 구분.
예상 답변: Statement – 정적 SQL; PreparedStatement – 매개변수화, 인젝션 방지; CallableStatement – 저장 프로시저.
5) 수행한 JDBC 성능 최적화 사례 설명.
예상 답변: 문자열 연결을 PreparedStatement로 교체, 풀링 도입, 배치 삽입 사용; 응답 시간 40% 단축.
6) SQL 인젝션 방지 방법?
예상 답변: PreparedStatement 사용; 입력 검증; DB 권한 제한.
7) JDBC 커넥션 실패 해결.
예상 답변: URL, 자격 증명, 네트워크, 드라이버 JAR 확인; 로그 검토; 잘못 구성된 포트 수정.
8) JDBC에서 트랜잭션 관리.
예상 답변: 자동 커밋 비활성화, 연산 수행, 결과에 따라 커밋 또는 롤백; ACID 준수 보장.
9) JDBC로 해결한 까다로운 DB 이슈.
예상 답변: 대량 삽입에 배치 처리 구현, 시간을 분 단위에서 초 단위로 단축.
10) 빡빡한 마감일 하에서 JDBC 개선 사항 우선순위 지정.
예상 답변: 영향도 평가, 명확한 소통, 고영향 항목 우선 처리, 협업을 통한 SLA 준수.