[데이터베이스] - JDBC를 이용해서 DB 연동과 사용을 해보자

yeom yaloo·2023년 12월 13일
0

FISA

목록 보기
19/61

JDBC API를 사용해서 데이터베이스 연결 방법과 사용 방법을 알아보자

  • 해당 작업은 어떠한 코드 리팩토링 없이 사용 방법과 사용 순서를 알아보는 포스팅입니다.
  • 다음 포스팅을 통해서 지금 이 코드를 공통화 작업과 분리를 해서 사용할 수 있는지에 대해서 설명하겠~

[JDBC에 관해서..]

1. JDBC란?

  • 자바에서 데이터베이스와 연결하기 위한 자바 API
  • JDBC는 자료를 쿼리하거나 업데이트 하는 방식을 제공한다.

2. JDBC를 이용해서 데이터베이스 연동 프로세스

  1. 데이터베이스 실행(시작)
    ㅤ- DB 접속 전에 DB와의 통신을 위한 드라이버 설치 작업
  2. 데이터베이스 접속
    ㅤ- 접속 sw 설치(=Connection)
  3. sql문장 작성
  4. sql 문장 실행(ctrl+enter)
  5. 결과 확인(활용)
    ㅤ- insert/update/delete = 테이블의 행수
    ㅤ- select = 검색된 테이블 구조

[사용 전에..]

1. 환경은 어떠냐면..

  • 본인은 우분투 위에 깔린 데이터베이스와 JDBC API를 연동해서 사용할 것이다.

[JDBC 사용법]

1. Statement를 이용한 방법


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/* 가장 기본적인 CURD 로직 구현하기
 * JDBC API 이해하기
 * 
 *	개발 단계
 *	  - driver 로딩 -> 접속 -> sql 문장 생성 객체 생성
 *		-> sql 문장 실핼 -> 결과 활용 -> 자원 반환 
 *
 *	서버 접속 후 쓰지 않는 자원은 반환해주는 것이 좋다.
 * 
 * */
public class JDBCBasic {

	// mysql
	public static void main(String[] args) {
		try {
			
			// 0. 드라이버 로딩
			Class.forName("com.mysql.cj.jdbc.Driver");

			// 1. 접속 - getConnection에서 예외 던지는거? -> 상위타입으로 처리 Exception
			// jdbc:db_종류://db_주소:db_포트번호/사용_데이터베이스
			// Connection con =
			// DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/fisa", "root",
			// "root");
			Connection con = DriverManager.getConnection(
					"jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "user01", "user01");

			System.out.println(con);

			// 2. sql 문장 실행 객체 생성
			/*
			 * 2-1. Statement 객체 생성 2-2. 검색 - 검색 결과는 결과 집합 구조의 테이블 형식으로 옴 - result set이라고 이를
			 * 표현한다. 2-3. 검색된 데이터 활용 - 검색된 데이터를 result set으로 돌려줄때 이를 반복문을 통해서 사용할 수 있다. - 이떄
			 * 사용하는 반복문은 while문이 권장된다. - 데이터가 존재하면 boolean next()를 이용해서 포인터 이동 - 데이터가 있으면
			 * true - row는 개별적으로 하나씩 접근해서 뽑을 수 있다.(하나의 row를 전체 뽑는 것이 아니다.) - next()는 더이상
			 * 데이터가 없으면 자동 종료가 된다.
			 */
			Statement stmt = con.createStatement();

			// 3. sql 문장 실행
			ResultSet rs = stmt.executeQuery("select * from dept");

			// 4. 결과 활용 (result set을 이용해서 결과 활용 코드)
			while (rs.next()) {
				System.out.println(rs.getInt(1) + " " + rs.getString("dname"));
			}

			// 자원 반환(접속 해제) - 누락 금지
			/*
			 * ResultSet -> Statement -> Connection 순으로 자원을 반환해야 한다.
			 * 
			 */
			rs.close();
			stmt.close();
			con.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

1-1. 드라이버 로딩

  • Class.forName("com.mysql.cj.jdbc.Driver");: 해당 드라이버가 등록되었는지 확인하기 위해서 진행한다. 보통 해당 작업은 한 번만 수행된다. java 애플리케이션이 시작될 때, 애플리케이션의 초기화 과정에서 드라이버를 로드하고 등록하는 것이 일반적이다.

1-2. DriverManager를 이용한 데이터베이스 접속

  • Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:8777/fisa?useSSL=false&allowPublicKeyRetrieval=true", "user01", "user01");: 앞선 포스팅에서 getConnection 안에 들어갈 String url 관련 포스팅을 진행했다.

  • mysql의 경우엔 버전 8부터 보안강화로 config 파일을 수정해서 address bind 부분을 수정해주어야 한다. (0.0.0.0으로 변경하는 이유는 모두 접속을 가능하게 하기 때문이다.)

1-3. sql 문장 실행 객체 생성

Statement stmt = con.createStatement();: Connection 객체를 이용해서 Statement 객체를 생성해준다.

1-4. sql 문장 실행

ResultSet rs = stmt.executeQuery("select * from dept"); : 해당 작업에선 직접 executeQuery() 안에 쿼리문을 작성해주고 ResultSet을 반환 받는다.

1-5. 결과 활용

while (rs.next()) {
	System.out.println(rs.getInt(1) + " " + rs.getString("dname"));
}
  • ResultSet.next()의 경우엔 해당 ResultSet이 다음 값이 있는지를 확인할 수 있는 메서드로 해당 작업은 반복문을 통해 사용하는데 이때는 for문이 아닌 while문을 이용하여 해당 처리를 진행한다.

1-6. 자원 반환하기

rs.close();
stmt.close();
con.close();
  • 자원을 닫는 순서는 가장 먼저 얻는 것을 가장 늦게 닫는 방식이다.
  • 이는 스택 자료구조를 생각하면 된다. Connection -> Statement -> ResultSet 순으로 객체를 생성하고 ResultSet -> Statement -> connection 순으로 자원을 해제하는 것을 의미한다.
profile
즐겁고 괴로운 개발😎

0개의 댓글