본문 바로가기
BACK-END/Java

[JAVA] API-JDBC

by 로햐 2021. 12. 7.

Ⅰ. JDBC

ⅰ. JDBC란?

Java와 DBMS 프로그램이 통신하는 방법을 만들어주는 API. java.sql 패키지에 들어있다.

 

ⅱ. Oracle에서 불러오기

Project의 Properties에 Java Build Path의 Labraries에 Add exterial JARs...로 ojdbc6을 추가.

 

※ ojdbc6이란?

오라클에서 제공하는 JDBC 드라이버. 오라클 내에 존재한다.

https://www.oracle.com/kr/database/technologies/appdev/jdbc.html

 


Ⅱ. 특징

ⅰ. 구조

MVC 패턴과 탬플릿을 활용하여 유기적으로 연결되어있는 클래스들을 만든다.

 

※ 참고할만한 디자인 패턴

  • MVC 패턴 : Model, View, Controller의 세 부분으로 나누어 각 클래스들의 독립적인 실행을 만든다.
  • 싱글톤 패턴 : 메모리 영역에 한번만 올리고 계속 활용하여 재사용하는 방식.
  • 빌더 패턴 : 생성, 표현 클래스를 분리하여 동일한 생산 절차로 여러 표현 클래스를 만드는 패턴
  • 전략 패턴(스트릿지) : 여러 알고리즘을 하나의 인터페이스를 통해 교체가능하게 만든 패턴.
  • 탬플릿 메소드 패턴 : 자주 사용되는 파트를 분리하여, static 메소드들만 구성되어있는 클래스를 만들어 프로그램 시작과 동시에 모든 메소드들을 불러 활용할 수 있게 만든 것.
  • DI 패턴 : 의존관계 주입(Dependency Injection). 싱글톤 처리 필요 없이, 객체저장소에 객체를 등록하고 @Inject 등의 어노테이션으로 객체 의존관계 형성.

ⅱ. 패키지 구분

MVC적용

  1. 서버와 통신하는 Model - Data Access Object : MVC
  2. 각 기능을 하는 클래스 Model - Value Object : MVC
  3. 정보를 가공하는 Controller : MVC
  4. 사용자에게 화면으로 보여주는 view : MVC

그 외

  1. DAO의 부하를 나눠주기 위해 연결만 담당하는 Service
  2. 중복되는 코드를 줄이기 위한 static 메소드만으로 이루어진 Template : Singleton or Template Method

Ⅲ. 기본 구조

ⅰ. 해야할 일

  1. 자바에서 드라이버 연결
  2. Connection 연결
  3. Statement/PreparedStatement 작업
  4. SQL 작업 및 결과 처리
  5. 자원반납

Ⅳ. Statement와 PreparedStatement

ⅰ. 정의

Statement : 완성된 SQL을 전달하고 결과를 처리하는 JDBC용 객체. Connection 객체를 통해 여러 질의를 날린다.

PreparedStatement : Statement와 동일하지만, SQL문이 미완성된 채로 먼저 질의를 하고, 실행 시간 동안 SQL문을 완성하여 결과를 받는다. Statement보다 처리 속도가 더 빠르다. 이 때 미완성된 SQL문의 비어있는 부분은 ?(위치 홀더)로 대체하여, SQL을 하나의 String으로 처리한다.

 

※읽어볼만한 자료

Naver - Garbage Collection과 Statement Pool

https://d2.naver.com/helloworld/4717


ⅱ. Java에서 SQL  작성 요령

oracle 자료형 java 자료형
NUMBER int/double(다른 숫자 자료형 가능)
VARCHAR2 String(char도 가능하지만 편한건 String)
CHAR
DATE Date

위치홀더(?)를 처리하는 방법.

pstmt.setString(1, studentName);//String의 경우
pstmt.setInt(2, studentAge);//Int의 경우

ⅲ. 설정 방법

  1. Add Extra jars... -> ojdbc6
  2. 변수 준비, SQL문 생성
    • 처리할 SQL이 DML문 : 처리한 행 수(int)로 반환
    • 처리할 SQL이 SELECT문 : 조회된 ResultSet을 반환. 
  3. 드라이버, 연결 생성 : 예외처리 필요.
    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");​
  4. 받을 객체 생성
    //Statement 사용 시
    stmt=conn.createStatement();
    
    
    //PreparedStatemenet 사용 시​
    pstmt=conn.prepareStatement(sql);
    pstmt.setString(1, studentName);
    pstmt.setInt(2, studentAge);
    //PreparedStatement의 경우 미완성된 SQL문을 완성하기 위해 위치홀더를 채우는 작업이 필요하다.
  5. sql 전달하고 결과 받기
    //DML 사용 시 작용된 행의 수를 반환(int)
    result = stmt.executeUpdate(sql);//Statement 사용 시
    result = pstmt.executeUpdate();//PreparedStatement 사용 시
    
    //SELECT 사용 시 조회된 객체들을 ResultSet으로 반환함
    rset = stmt.executeQuery(sql);//Statement 사용 시
    rset = pstmt.executeQuery();//PreparedStatement 사용 시​
  6. 결과 처리
    //DML 사용 시 트랜잭션 처리 필요
    if(result>0) conn.commit();
    else conn.rollback();
    
    //SELECT 사용 시 ResultSet을 리스트나 배열로 값을 받아오는 처리 필요
    while(rset.next())
    list.add(new Student(rset.getName(), rset.getAge(), rset.getClub());​
  7. 자원 반납
  8. 결과를 다른 클래스로 넘기기

 

Ⅴ. JDBC properties, xml

쿼리문이나 URL, driver 주소 등 하드코딩 되어있는 부분을 외부 파일로 불러 읽어들이는 방법.

서버나 프로그램을 재시작 하지 않아도 자동 적용된다(잠수함 패치가 이런건가?)

properties() : Map 계열과 유사. key=value의 형태. storeToXML()로 xml로 저장 가능.

 

※ xml 문서가 수정되더라도 서버를 내리거나 프로그램 강제 재시작이 일어나지 않고 24시간 서비스 하는 방법.

1. FileStream을 활용하여 xml을 Dao의 생성자에 넣기

public StudentDao() {
	try {
		prop.loadFromXML(new FileInputStream("resources/query.xml"));
	} catch (IOException e) {
		e.printStackTrace();
	}
}

2. 활용(insert student 하는 방법:DML의 경우)

int result = new studentDao().insertStudent(studentName, studentAge);

※번외. FileStream에서 xml을 통해 String을 key=value의 형태로 추출하는 방법.

prop.storeToXML(new FileOutputStream("resources/query.xml"), "query.xml");

더 알아보기

JPA : Java Persistence API. 애플리케이션과 JDBC의 사이에서 동작하면서 복잡한 SQL문의 사용을 줄이고 간편하게 개발할 수 있게 돕는 API.

'BACK-END > Java' 카테고리의 다른 글

[JDBC] Servlet Filter  (0) 2022.02.16
[JAVA] Sevlet, JSP  (1) 2022.01.16
[Java] API-Stream(Input & Output)  (0) 2021.11.25
[Java] API-Collection과 Map  (0) 2021.11.23
[Java] API 기초와 java.lang  (1) 2021.11.22