∞. 기술 면접/4. 데이터베이스

14. 기술면접 - 데이터베이스 - JDBC (Java DataBase Connectivity)

THE HEYDAZE 2021. 10. 18. 16:17
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

JDBC 란
JDBC (Java Database Connectivity)DB에 접근할 수 있도록 Java 에서 제공하는 API 이다.

- JDBC 는 관계형 데이터베이스에 사용되는 SQL 문을 실행하기 위해 자바로 작성된 클래스와 인터페이스로 구성되어 있다
- 특정 데이터베이스나 특정 데이터베이스 매커니즘에 구애 받지 않는 독립적인 인터페이스를 통해 다양한
  데이터베이스에 접근하는 코드를 구현(mysql, oracle, mssql 등 추상화를 통해 접근가능)할 수 있도록 제공하는
  자바 클래스의 표준 집합이다
- JDBC 클래스는 자바 패키지 java.sql 과 javax.sql 에 포함되어 있다

데이터베이스 벤더들이 이러한 라이브러리를 각자 만든다면, 자바 프로그래머는 각 벤더가 만든 라이브러리 사용법을 익혀야되어 헷갈리고 복잡해질 수 있다 (메소드명이 다 제 각각이면 다 외워야 됨..)

JDBC 추상화

 

JDBC를 이용한 DB 접근

- 다음과 같은 순서로 이루어진다
  1. JDBC Driver 로딩
  2. Connection 맺기
  3. SQL 실행
  4. 자원 반환

1. JDBC Driver 로딩

Class.forName("com.mysql.jdbc.Driver"); // mysql 드라이버 로딩 - 현재는 com.mysql.cj.jdbc.Driver 를 사용한다

- Driver 란?
  - JDBC Driver 는 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터

 

2. Connection 맺기

Connection conn = null;

conn = DriverManager.getConnection(url, username, password);

DriverManager 는 이름 그대로 데이터베이스 벤더들이 JDBC API를 구현한 드라이버를 관리한다. DriverManager.getConnection() 메소드는 인자로 들어오는 값에 따라서 특정 데이터베이스 벤더가 구현한 Connection타입의 객체를 반환한다 Connection 객체가 생성은 데이터베이스와 연결이 확립되었음을 의미한다

3 ~ 4 는 기타 사이트 참고

 

JDBC가 DB에 접근하는 FLOW

 

 

Plain JDBC API의 문제점

- 쿼리를 실행하기 전과 후에 많은 코드를 작성해야한다.
ex) 연결 생성(Connection), 명령문(sql), ResultSet(ResultSet) 닫기(conn.close(), stmt.close(), rs.close()), 연결
- 데이터베이스 로직에서 예외 처리 코드를 수행해야 한다 ( try {...} catch {...} 로 함으로 가독성 떨어짐 )
- 트랜잭션을 처리해야 한다 (tx.begin(), tx.end())
- 이러한 모든 코드를 반복하는 것으로, 시간이 낭비된다

 

JDBC Template

JDBC Template 은 Spring JDBC 접근 방법 중 하나로, 내부적으로 Plain JDBC API를 사용하지만, 위와 같은 문제점들을
제거한 형태의 Spring 에서 제공하는 class 이다 (기존에 문제 있던 내용들을 추상화하였음)

 

Spring JDBC 가 하는 일

- 자원의 생성관 반환 (Connection, Statement, ResultSet 등)
- Statement 실행
- ResultSet Loop 처리
- Exception 처리와 반환
- Transaction 처리

 

레거시 프로젝트에서는 XML 기반으로 설정을 한 번만 하여 빈으로 등록한 후 사용한다

@Autowired
private JdbcTemplate jdbcTemplate;

public void test() {
  jdbcTemplate.query("select * from members", new RowMapper<Member>)() {
      public Member mapRow(ResultSet rs, int rowNum) throws SqlException {
        ... 로직
      }
  });
}

https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

Driver, Connection, Statement 과정이 사라졌으며, ResultSet 의 close 도 필요없어졌다

 

Spring JDBC 에서 개발자가 할 일

- 핵심적으로 해야될 작업만 해주면 나머지는 Framework 가 알아서 처리해준다.
  - datasource 설정 (url, username, password)
  - sql 문 작성
  - 결과처리(ResultSet)