DB 작업 - JDBC 1편

Seculoper·2020년 12월 4일
2

0. 개요

개발을 할 때 가장 중요한 것은 무엇일까?
객체지향적 개발? 깔끔한 UI? 완벽한 인프라 설계?
물론 셋뿐만 아니라 모두 중요하지만, 개발의 총 과정을 생각해보면, DB 작업이 절반 이상의 중요성을 지닌다고 생각한다.

그 이유는 서비스든 웹 사이트든 뭐든간에
"서버와 클라이언트간에 데이터가 오가는 것"이기 때문이다.

때문에 아무리 코드를 잘 짰다고 하더라도, DB 작업이 제대로 되지 않았으면, 툭하면 알 수 없는 오류를 내뱉을 것이다.

그만큼 중요한 DB 작업을 JAVA는 어떻게 처리하는지, 한번 알아보자!


1. JDBC란?

Jaba DataBase Connectivity의 약자로, 위에서 말한 것처럼 자바에서 DB 작업을 하기위한 API이다.

아마 자바로 하는 대부분의 DB 작업 방법은 이 JDBC를 기반으로 만들어졌을 것이다.
따라서 가장 오리지널한 DB API라고 할 수 있기 때문에, 이 방법을 잘 숙지한다면 응용한 뒤의 방법도 이해하기 쉬울 것이다.


2. JDBC 구조

구조는 다음과 같다

(출처:https://velog.io/@withcolinsong/JDBC%EB%9E%80)
위의 블로그 그림이 가장 깔끔하게 잘 설명해서 가져왔다.

자바의 높은 이식성을 그대로 이어받은 API라고 할 수 있다.

각 DB와의 연결을 드라이버라는 것을 통해 하고 있으며,
이 때문에 어떤 한 DB에 종속적으로 적용되지 않는다.

DB를 바꿔야 할 때, 드라이버만 바꿔준다면, 코드의 수정이 없어도 잘 쓸 수 있다.


3. 과정

과정을 설명한 그림을 보기전에 먼저 생각을 해보자.

위의 구조에서 각 DB와의 접점은 JDBC 드라이버로 하고 있었다.
그렇다면 JDBC에는 이런 드라이버들을 관리해주는 매니저 역할이 필요할 것이다.

그리고 DB 서버와 연결해야 하니, 당연히 연결 정보(ID나 비밀번호 등)도 필요하다.

연결이 되었으면 쿼리를 날리기 위해 쿼리문이 필요할 것이고,
실패했든 성공했든 결과값을 받아올 객체도 필요할 것이다.

이 흐름을 그림으로 잘 정리하면 다음과 같다.
(출처: https://www.edwith.org/boostcourse-web/lecture/16734/)
코드와 함께 차례차례 설명해보면,
1. Driver 로드
DriverManager로 어떤 DB를 사용할 것인지 드라이버를 로드한다.
(mysql을 예시로 들겠다)

Class.forName("com.mysql.cj.jdbc.Driver");

각 DB마다 고유한 드라이버 이름이 있다. 이것은 검색을 해보면 잘 나올 것이다.


2. Connection 얻기
: DB를 결정 후, 연결을 위해 연결 정보(DB 서버 url, ID, PW등)를 입력한다.

// 연결 정보 입력
String dburl = "jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "";

// 정보 등록-> 커넥션 얻기
Connection connect = DriverManager.getConnection(dburl, username, password);

DB도 서버이므로 당연히 접속하기 위한 주소가 필요하다!
주소의 형식은 저렇게 생겼다ㅇㅅㅇ


3. 메서드 처리
여기까지는 뭘하던 변하지 않는 동일한 작업이다.
때문에 메서드로 생성해놓고 사용하는 것이 좋다.

// 커넥션 얻어오는 메서드
public static Connection getConnection() throw Exception {
    // 드라이버 로드
    Class.forName("com.jdbc.cj.mysql.Driver");
    
    // 연결 정보 입력
    String dburl = "jdbc:mysq://localhost:3306/mydb";
    String username = "root";
    String password="";
    
    // 커넥션 생성 및 반환
    Connection conn = DriverManager.getConnection(dburl, username, password);
    return conn;
    }

4. Statement 작성
: 이제 연결이 완료됬다! 실행하고픈 쿼리문을 작성해준다.

먼저 쿼리문을 날리기 위한 틀을 생성해주는데,
이 틀이란 "이 객체로 쿼리를 날릴꺼임~!"이라는 것을 의미한다

// stat 틀 생성
Statement stat = conn.createStatement();

그 다음 원하는 쿼리문을 아래처럼 써준다.

// 조회 구믄
stat.excuteQuery("SELECT * FROM USER");

이 메서드를 실행하면, conn을 이용해 DB로 쿼리를 실행한다.


5. ResultSet에 담기
: 쿼리문을 실행하고 반환된 값을 ResultSet이란 객체에 담는다.

ResultSet rs = stat.excuteQuery("SELECT * FROM USER");

6. ResultSet에서 값 꺼내오기
: 이것은 내용이 길어지므로 다음편에서 설명하겠다 : )


7. 커넥션 반환하기
: 가장 중요한 부분이다!
잘 써놓고 반환하지 않으면, 자원만 낭비되는 사태가 발생한다.
반환 작업은 사용했던 객체를 역순으로 닫아주면 된다.

rs.close();
stat.close();
conn.close();

8. 마무리
: 위의 과정을 모두 적어보면 다음과 같다.

// 커넥션 얻어오는 메서드
public static Connection getConnection() throw Exception {
    // 드라이버 로드
    Class.forName("com.jdbc.cj.mysql.Driver");
    
    // 연결 정보 입력
    String dburl = "jdbc:mysq://localhost:3306/mydb";
    String username = "root";
    String password="";
    
    // 커넥션 생성 및 반환
    Connection conn = DriverManager.getConnection(dburl, username, password);
    return conn;
}

// 쿼리문 실행
Statement = conn.createStatement();    
Result rs = stat.excuteQuery("SELECT * FROM USER");

/** ResultSet에서 결과값 꺼내기 **/

// 커넥션 닫아주기
rs.close();
stat.close();
conn.close();

큰 흐름을 보기 위해서 몇 과정은 생략하였다.
다음 편에선 CRUD와 함께 자세한 방법을 알아보도록 하겠다.

profile
보안이 취미인 개발자(수학자)입니다.

0개의 댓글