JDBC(Java Data Base Connectivity)

underlier12·2020년 1월 28일
1

JDBC

목록 보기
1/1

본 후기는 뉴렉처 자바 JDBC 강의를 보고 작성하였습니다.

01. JDBC란

자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API입니다. JDBC는 자바의 표준 에디션에서 지원하는 기술로서, 접속하려는 DBMS 서버에 따라서 JDBC 드라이버가 필요합니다. 출처

JDBC의 필요성

개발자가 SQL문을 통해 직접 DB에 접근할 때

image.png

사용자가 UI를 통해 간접적으로 DB에 접근 할 때

image.png

DB에 따라 SQL문이 달라지는 불편함 등으로 인해 JDBC(Java Data Base Connectivity)를 통해 각 DB 드라이버와 연계되며 이를 통해 편리하게 DB에 접근하도록 할 수 있다.

image.png

JDBC 사용 순서

  1. 드라이버 로드
  2. '연결' 생성
  3. '문장' 실행
  4. '결과 집합' 사용

02. DBMS와 JDBC Driver

설치

Oracle DBMS

  1. 다운로드 링크에서 Database Express Edition을 받는다.
  2. 압축을 푼 뒤 관리자 권한으로 setup.exe파일을 실행한다.

설치한 서버 프로그램으로 직접 접근은 불가하며 클라이언트 프로그램(sqlplus / sql developer)을 통해 접근 및 명령어(인증/실행/결과확인) 사용이 가능하다.

image.png

SQL Plus 는 콘솔 기반 DBMS 접근 도구

JDBC Driver

  1. 다운로드 링크에서 JDBC Driver를 받는다. (구글 검색으로 찾는 것을 추천 / 사이트 내부에서 찾기 힘듬)

JDBC Driver 포함 시키기

우선 Java perspective가 아니라면 아래와 같이 변경을 해주고 해당 아이콘이 보이지 않는다면 Window > Perspective > Open Perspective 메뉴 항목으로 가서 열어 준다.

![image.png](https://images.velog.io/post-images/underlier12/aa3bfc20-3fe5-11ea-a0b5-8d2d58b5ef86/image.png

프로젝트 생성 후 프로젝트 우측 클릭 > Build Path > Configure Build Path 를 선택하면 아래와 같은 창이 뜨며 Add External JARs를 선택해 다운로드 받은 JDBC Driver 파일(ojdbc8.jar)을 추가해준다.

image.png

03. JDBC 기본 코드

JDBC를 이용하는 코드

메모리 상에 드라이버를 올리고 연결이 된 후 실행문을 수행하고 그에 따른 결과를 얻는 순서

  1. Class.forName("oracle.jdbc.driver.OracleDriver"); 를 통해 객체화
  2. Connection con = DriverManager.getConnection(...); 를 통해 연결 객체 획득
  3. Statement st = con.createStatement(); 실행문
  4. ResultSet rs = st.executeQuery(sql); 결과 반환

image.png

image.png

image.png

image.png

image.png

04. 쿼리 실습

DB 테이블의 구성

image.png

image.png

image.png

테이블 만들기

Oracle SQL Plus로 접속하여 로그인을 한 뒤 위의 명령어들을 통해 테이블들을 생성한다.

실패하고 결국 DBMS 강좌를 먼저 수강하여 SQL Developer로 테이블 생성하였다

쿼리문 기본 구성

'JDBCPrj'라는 프로젝트를 생성한 뒤 아래와 같은 내용으로 Program.java를 작성한다.(NOTICE 테이블의 TITLE 필드 값을 가져와 출력하는 코드)

image.png

오라클 드라이버(ojdbc8.jar)를 Library에 필히 추가해야 하며 NOTICE 테이블 내에 데이터 하나 이상을 삽입해 둬야 한다.(ORACLE은 COMMIT 명령을 통해 강제 커밋을 해줘야 한다)

SQL

INSERT INTO NOTICE VALUES(1, 'JDBC란 무엇인가?', 'NEWLEC', 'AAA', SYSDATE, 0, '');
COMMIT;

Program.java

package ex1;

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

public class Program {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String url = "jdbc:oracle:thin:@[ip 주소]:1521/xepdb1";
		String sql = "SELECT * FROM NOTICE";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "NEWLEC", "****");
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
		
		if(rs.next()) {
			String title = rs.getString("TITLE");
			System.out.println(title);			
		}
		
		rs.close();
		st.close();
		con.close();
	}

}

url에 중간에 본인 컴퓨터의 ip 주소가, Connection에 비밀번호는 실제 비밀번호가 들어간다.

05. 문제

아래에서 볼 수 있듯 각 필드에 맞는 데이터를 가져오기 위해 알맞는 메소드를 찾아 적용하고 DB 내 모든 데이터가 출력될 수 있도록 작성하라.

image.png

요구사항

  1. 알맞는 메소드 적용
  2. 반복문을 활용한 모든 데이터 출력

Homework.java

package ex1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

public class Homework {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String url = "jdbc:oracle:thin:@59.15.156.101:1521/xepdb1";
		String sql = "SELECT * FROM NOTICE";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "NEWLEC", "root");
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
      
		while(rs.next()) {
			int id = rs.getInt("ID");
			String title = rs.getString("TITLE");
			String writerId = rs.getString("WRITER_ID");
			Date regDate = rs.getDate("REGDATE");
			String content = rs.getString("CONTENT");
			int hit = rs.getInt("hit");
			System.out.printf(" id : %d, title : %s, writerId : %s, "
					+ "regDate : %s, content : %s, hit : %d\n",
					id, title, writerId, regDate, content, hit);
		}
		
		rs.close();
		st.close();
		con.close();
	}

}

06. 문제 2

위의 내용에서 조회수가 10 이상인 데이터만 출력하라

image.png

요구사항

  • 조회수가 10 이상인 데이터만 출력

Homework.java

package ex1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

public class Homework {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String url = "jdbc:oracle:thin:@59.15.156.101:1521/xepdb1";
		String sql = "SELECT * FROM NOTICE";
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = DriverManager.getConnection(url, "NEWLEC", "root");
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql);
		
		while(rs.next()) {
			int id = rs.getInt("ID");
			String title = rs.getString("TITLE");
			String writerId = rs.getString("WRITER_ID");
			Date regDate = rs.getDate("REGDATE");
			String content = rs.getString("CONTENT");
			int hit = rs.getInt("hit");
			
			if(hit > 9) {
				System.out.printf(" id : %d, title : %s, writerId : %s, "
						+ "regDate : %s, content : %s, hit : %d\n",
						id, title, writerId, regDate, content, hit);				
			}
		}
		
		rs.close();
		st.close();
		con.close();
	}

}

SQL문을 활용하는 것이 더 바람직하다. 이미 필터링된 데이터만 출력하는 것이 반복문을 돌면서 확인 후 출력하는 것보다 효율적이다.

Solution

아래와 같이 java에서 조건문을 이용하는 것보다 SQL문으로 미리 필터링 된 데이터를 가져오는 것이 역할 상 적합하다.

image.png

지적하는 것을 정확히 틀렸다. 실수를 다시 반복하지 말자.

07. 역할

자바는 UI 레이아웃과 데이터 전달에만, 데이터 연산/가공처리는 데이터베이스가 담당하도록 설계해야 옳은 역할 분담이 되겠다.

image.png

profile
logos and alogos

4개의 댓글

comment-user-thumbnail
2020년 2월 11일

정보 너무 감사합니다^^ 이 사이트는 처음인데 친구추가 기능은 없는 것 같아 아쉽네요 ㅜㅜ!

1개의 답글
comment-user-thumbnail
2020년 5월 16일

안녕하세요.
질문이 있는데 이클립스에서 XE가 아닌 XEPDB1로 접속하고 싶은데 계속 에러가 나서 여쭤봅니다.
혹시 SID 이름을 바꿔주셨나요? 아니면 그냥 URL뒤에 SID 이름 작성하는 부분에 XEPDB1만 바꾸셨는데 되신건가요?

1개의 답글