Ⅰ. 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적용
- 서버와 통신하는 Model - Data Access Object : MVC
- 각 기능을 하는 클래스 Model - Value Object : MVC
- 정보를 가공하는 Controller : MVC
- 사용자에게 화면으로 보여주는 view : MVC
그 외
- DAO의 부하를 나눠주기 위해 연결만 담당하는 Service
- 중복되는 코드를 줄이기 위한 static 메소드만으로 이루어진 Template : Singleton or Template Method
Ⅲ. 기본 구조
ⅰ. 해야할 일
- 자바에서 드라이버 연결
- Connection 연결
- Statement/PreparedStatement 작업
- SQL 작업 및 결과 처리
- 자원반납
Ⅳ. 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의 경우
ⅲ. 설정 방법
- Add Extra jars... -> ojdbc6
- 변수 준비, SQL문 생성
- 처리할 SQL이 DML문 : 처리한 행 수(int)로 반환
- 처리할 SQL이 SELECT문 : 조회된 ResultSet을 반환.
- 드라이버, 연결 생성 : 예외처리 필요.
Class.forName("oracle.jdbc.driver.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
- 받을 객체 생성
//Statement 사용 시 stmt=conn.createStatement(); //PreparedStatemenet 사용 시 pstmt=conn.prepareStatement(sql); pstmt.setString(1, studentName); pstmt.setInt(2, studentAge); //PreparedStatement의 경우 미완성된 SQL문을 완성하기 위해 위치홀더를 채우는 작업이 필요하다.
- sql 전달하고 결과 받기
//DML 사용 시 작용된 행의 수를 반환(int) result = stmt.executeUpdate(sql);//Statement 사용 시 result = pstmt.executeUpdate();//PreparedStatement 사용 시 //SELECT 사용 시 조회된 객체들을 ResultSet으로 반환함 rset = stmt.executeQuery(sql);//Statement 사용 시 rset = pstmt.executeQuery();//PreparedStatement 사용 시
- 결과 처리
//DML 사용 시 트랜잭션 처리 필요 if(result>0) conn.commit(); else conn.rollback(); //SELECT 사용 시 ResultSet을 리스트나 배열로 값을 받아오는 처리 필요 while(rset.next()) list.add(new Student(rset.getName(), rset.getAge(), rset.getClub());
- 자원 반납
- 결과를 다른 클래스로 넘기기
Ⅴ. 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 |