자바

자바 - 데이터베이스 입출력

록's 2023. 2. 13. 09:44
728x90
반응형

JDBC 개요

 

JDBC 라이브러리

  • 자바는 데이터베이스(DB)와 연결해서 데이터 입출력 작업을 할 수 있도록 JDBC 라이브러리 (java.sql 패키지)를 제공
  • JDBC는 데이터베이스 관리시스템(DBMS)의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성

 

 

 

JDBC Driver

  • JDBC 인터페이스를 구현한 것으로, DBMS마다 별도로 다운로드받아 사용
  • DriverManager 클래스: JDBC Driver를 관리하며 DB와 연결해서 Connection 구현 객체를 생성
  • Connection 인터페이스: Statement, PreparedStatement, CallableStatement 구현 객체를 생성하며, 트랜잭션 처리 및 DB 연결을 끊을 때 사용
  • Statement 인터페이스: SQL의 DDL과 DML 실행 시 사용
  • PreparedStatement: SQL의 DDL, DML 문 실행 시 사용. 매개변수화된 SQL 문을 써 편리성과 보안성 유리
  • CallableStatement: DB에 저장된 프로시저와 함수를 호출
  • ResultSet: DB에서 가져온 데이터를 읽음

 

 

DBMS 설치

 

 

Oracle 설치

  • Enterprise Edition 설치 파일 다운로드:
    https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#19c
  • C:\Oracle\WINDOWS.X64_193000_db_home

  • 프로그램에서 사용할 DB 계정을 생성하기 위해 SQL Plus에서 다음 SQL 문을 실행

 

 

원격 연결

  • 원격 연결 요청을 수락하기 위해 Net Configuration Assistant를 실행
  • [시작] 메뉴 - [Oracle] - [OraDB19Home1] - [Net Configuration Assistant]

방화벽 해제

  • Oracle을 설치한 운영체제의 방화벽 설정에서 1521 포트를 개방
  • Windows Defender 방화벽 대화상자에서 [인바운드 규칙]을, 오른쪽 작업 창에서 [새 규칙]을 선택해 설정 변경

 

 

 

 

Client Tool 설치

 

SQL Developer

  • Oracle DB 모델링에서부터 DB 상태 확인, SQL 스크립트 및 PL/SQL 개발 등 용이한 무료 Client Tool
  • 설치 파일 다운로드: https://www.oracle.com/tools/downloads/sqldev-downloads.html
  • C:\Oracle\sqldeveloper
  • 설치 후 [새로 만들기/데이터베이스 접속 선택] 대화상자에서 설정 후 테스트

 

 

DB 구성

 

데이터베이스 구성

  • 테이블, 시퀀스, 프로시저, 함수를 생성하여 데이터베이스를 구성

 

 

 

DB 연결

 

데이터베이스 연결

  • 클라이언트 프로그램에서 DB와 연결하려면 해당 DBMS의 JDBC Driver가 필요
  • ① DBMS가 설치된 컴퓨터의 IP 주소, ② DBMS가 허용하는 포트(Port) 번호, ③ 사용자(DB 계정) 및 비밀번호 ④ 사용하고자 하는 DB 이름 필요

 

 

 

JDBC Driver 설치

DB 연결

  • Class.forName() 메소드는 문자열로 주어진 JDBC Driver 클래스를 BuildPath에서 찾고, JDBC Driver를 메모리로 로딩

 

 

데이터 저장

 

INSERT

  • users 테이블에 새로운 사용자 정보를 저장하는 INSERT 문 실행
  • INSERT 문을 String 타입 변수 sql에 문자열로 대입

 

  • 매개변수화된 SQL 문을 실행하기 위해 Connection의 prepareStatement() 메소드로부터 PreparedStatement를 얻음

  • 값을 지정한 후 executeUpdate() 메소드를 호출하면 SQL 문이 실행되면서 users 테이블에 1개의 행이 저장

  • close() 메소드를 호출하면 PreparedStatement가 사용했던 메모리 해제

 

 

 

데이터 수정

 

UPDATE

  • JDBC를 이용해서 UPDATE 문을 실행

  • prepareStatement() 메소드로부터 PreparedStatement를 얻고, ?에 해당하는 값을 지정
  • executeUpdate() 메소드를 호출. 수정된 행의 수가 리턴

 

 

DELETE

  • JDBC를 이용해서 DELETE 문 실행. 매개변수화된 DELETE 문을 String 타입 변수 sql에 대입

  • prepareStatement() 메소드로부터 PreparedStatement를 얻고 ?에 값을 지정한 후, executeUpdate로 SQL 문을 실행

 

 

데이터 읽기

 

ResultSet 구조

  • SELECT 문에 기술된 컬럼으로 구성된
    행(row)의 집합

  • 커서cursor가 있는 행의 데이터만 읽을 수 있음
  • first 행을 읽으려면 next() 메소드로 커서 이동

 

 

데이터 행 읽기

  • 커서가 있는 데이터 행에서 각 컬럼의 값은 Getter 메소드로 읽음
  • SELECT 문에 연산식이나 함수 호출이 포함되어 있다면 컬럼 이름 대신에 컬럼 순번으로 읽어야 함
 

사용자 정보 읽기

  • 사용자 정보를 가져오는 SELECT 문. prepareStatement() 메소드로부터 PreparedStatement를 얻고, ?에 값을 지정
  • executeQuery() 메소드로 SELECT 문을 실행해서 ResultSet을 얻음.
  • if 문을 이용해서 next() 메소드가 true를 리턴할 경우에는 데이터 행을 User 객체에 저장하고 출력

 

 

 

 

 

 

 

 

 

 

게시물 정보 읽기

  • boards 테이블에서 bwriter가 winter인 게시물의 정보를 가져오기

  • bwriter가 winter인 게시물 정보를 가져오는 SELECT 문. prepareStatement() 메소드로부터 PreparedStatement를 얻고, ?에 값을 지정

  • executeQuery() 메소드로 SELECT 문을 실행해서 ResultSet을 얻음

 

  • while 문을 이용해서 next() 메소드가 false를 리턴할 때까지 반복해서 데이터 행을 Board 객체에 저장하고 출력한다

 

  • Blob 객체에 저장된 바이너리 데이터를 얻기 위해서는 입력 스트림 또는 배열을 얻어냄

 

  • Blob 객체에서 InputStream을 얻고, 읽은 바이트를 파일로 저장

 

 

프로시저와 함수 호출

 

 

프로시저와 함수

  • Oracle DB에 저장되는 PL/SQL 프로그램. 클라이언트 프로그램에서 매개값과 함께 프로시저 또는 함수를 호출하면 DB 내부에서 SQL 문을 실행하고, 실행 결과를 클라이언트 프로그램으로 돌려줌
  • JDBC에서 프로시저와 함수를 호출 시 CallableStatement를 사용. 프로시저와 함수의 매개변수화된 호출문을 작성하고 Connection의 prepareCall() 메소드로부터 CallableStatement 객체를 얻음

  • 프로시저도 리턴값과 유사한 OUT 타입의 매개변수를 가질 수 있기 때문에 괄호 안의 ?중 일부는 OUT값(리턴값)일 수 있음

 

  • prepareCall() 메소드로 CallableStatement을 얻으면 리턴값에 해당하는 ?는 registerOutParameter() 메소드로 지정하고, 그 이외의 ?는 호출 시 필요한 매개값으로 Setter 메소드를 사용해서 값을 지정

  • execute() 메소드로 프로시저 또는 함수 호출. Getter 메소드로 리턴값 얻음

 

 

프로시저 호출

  • IN 매개변수는 호출 시 필요한 매개값으로 사용되며, OUT 매개변수는 리턴값으로 사용

 

  • 매개변수화된 호출문을 작성하고 CallableStatement를 얻음

 

  • ?의 값을 지정하고 리턴 타입을 지정

 

  • 프로시저를 실행하고 리턴값 얻음

 

 

 

 

 

함수 호출

  • user_login()은 2개의 매개변수와 PLS_INTEGER 리턴 타입으로 구성
  • 함수를 호출하기 위해 매개변수화된 호출문을 작성하고 CallableStatement를 얻음
  • ?의 값을 지정하고 리턴 타입을 지정
  • user_login() 함수는 userid와 userpassword가 일치하면 0을, userpassword가 틀리면 1을, userid가 존재하지 않으면 2를 리턴

 

 

 

 

트랜잭션 처리

 

 

트랜잭션

  • 기능 처리의 최소 단위. 하나의 기능은 여러 소작업들로 구성
  • 트랜잭션은 소작업들이 모두 성공하거나 실패해야 함

  • 커밋은 내부 작업을 모두 성공 처리하고, 롤백은 실행 전으로 돌아간다는 의미에서 모두 실패 처리
  • JDBC에서 트랜잭션을 제어 시 Connection의 setAutoCommit() 메소드로 자동 커밋 기능을 꺼야 함

 

 

게시판 구현

 

 

메인 메뉴

  • main() 메소드는 BoardExample 객체를 생성하고 list() 메소드를 호출. list() 메소드는 게시물 목록을 출력하고 mainMenu() 메소드를 호출

메인 메뉴 선택 기능

  • 키보드 입력을 받기 위해 Scanner 필드를 추가. mainMenu() 메소드에서 키보드 입력을 받기 위해 nextLine() 메소드를 호출. 메뉴 선택 번호에 따라 해당 메소드를 호출

Board 클래스 작성

  • boards 테이블의 한 개의 행(게시물)을 저장할 Board 클래스를 작성.
  • 컬럼 개수와 타입에 맞게 필드를 선언하고, 롬복 @Data 어노테이션을 이용해서 Getter, Setter, toString() 메소드를 자동 생성

 

게시물 목록 기능

  • DB 연결이 필요하므로 Connection 필드를 추가하고, 생성자에서 DB 연결. boards 테이블에서 게시물 정보들을 가져와서 게시물 목록으로 출력하도록 list() 메소드를 수정

게시물 생성 기능

  • 메인 메뉴에서 ‘1.Create’를 선택했을 때 호출되는 create() 메소드 수정

게시물 읽기 기능

  • 메인 메뉴에서 ‘2.Read’를 선택했을 때 호출되는 read() 메소드 수정

게시물 수정 기능

  • read() 메소드에서 보조 메뉴 ‘1.Update|2.Delete|3.List’를 추가하고, 보조 메뉴에서 ‘1.Update’를 선택하면 update() 메소드가, ‘2.Delete’를 선택하면 delete() 메소드가 호출
  • update() 메소드는 매개값으로 받은 Board 객체를 수정해서 boards 테이블의 게시물 정보를 수정

 

게시물 삭제 기능

  • 게시물 수정 기능을 구현할 때 보조 메뉴에서 ‘2.Delete’를 선택했을 때 delete() 메소드가 호출. delete() 메소드를 수정해 매개값으로 받은 Board 객체에서 bno를 얻어 boards 테이블에서 해당 게시물을 삭제

게시물 전체 삭제 기능

  • 메인 메뉴에서 ‘3.Clear’를 선택했을 때 호출되는 clear() 메소드 수정

종료 기능

  • 메인 메뉴에서 ‘4.Exit’를 선택했을 때 호출되는 exit() 메소드 수정
 

 

728x90
반응형