▶ XML(eXtensive Markup Language) : 단순화된 데이터 기술 형식
- XML을 사용하려는 이유
- DB 연결 정보, SQL문 등 수정이 빈번한 내용을 코드에 직접 작성하면 효율성 떨어짐
- 이유) Java에서는 코드가 조금 수정되어도 전체 코드를 다시 컴파일하여 시간이 상대적으로 오래 소요됨
- XML 외부 파일을 이용하면 XML 파일의 내용을 바꿔도 XML 파일을 읽어오는 코드는 변하지 않음
- → 컴파일 미실행하여 시간 효율 상승함 - XML은 Key,Value 형식의 Map으로, 문자열만 저장
- Map <String, String> == Properties 클래스
- Properties 컬랙션 객체
1) Key, Value가 <String, String>으로 타입이 제한된 Map
2) XML 파일을 생성하고 읽어오는데 특화
▶ CreateXML Class
public class CreateXML{
public static void main(String[]args){
properties prop = new Properties();
try{
// 출력할 내용을 저장할 XML 파일 생성
FileOutputStream fos = new FileOutputStream("member-sql.xml");
// storeToXML 메소드 사용해서 XML 파일 저장
prop.storeToXML(fos, "DB Connection Data");
} catch (IOException e) {
e.printStackTrace;
}
}
}
▶ LoadXML Class
public class LoadXML{
public static void main(String[] args){
Properties prop = new Properties();
try{
// 외부 XML 파일 읽어오기(Properties 객체 사용)
prop.loadFromXML(new FileInputStream("driver.xml"));
System.out.println("driver: " + prop.getProperty("driver"));
// Property : 속성(데이터)
// prop.getProperty : XML에서 얻어온 값 중 Key가 "driver"인 entry의 Value를 얻어옴
} catch (Exception e) {
e.printStackTrace();
}
}
}
▶ JDBCTemplate Class
public class JDBCTemplate{
/*
* DB 연결, 트랜잭션 제어, JDBC 자원 반환과 같은
* 반복적으로 사용되는 JDBC 관련 코드를 모은 클래스
*
* getConnection() 메소드
*
* commit(Connection)
* rollback(Connection)
*
* close(Connection | Statement | ResultSet) 메소드
* */
// 필드
private static Connection conn = null;
// 메소드
// 1) getConnection() : DB 연결 정보를 담고 있는 Connection 객체 반환 메소드
public static Connection getConnection(){
// 계속 공용으로 사용되는 conn 변수에 커넥션이 없거나(null), 이전 커넥션이 있었으나 닫힌 경우(close())
// -> 새로운 커넥션 필요
try{ // 하나의 프로그램엔 한 개의 커넥션만 사용
if(conn == null || conn.isClosed()){
// [Connection 객체 생성 준비]
// Properties 객체 생성
Properties prop = new Properties();
// Key,Value가 모두 String 타입으로 제한된 Map / XML 파일 입출력에 특화
// driver.xml 파일 읽어오기
prop.loadFromXML(new FileInputStream("driver.xml"));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
// [Connection 객체 생성]
// 1) JDBC 드라이버 메모리 로드
Class.forName(driver);
// 2) DriverManager 사용해 Connection 객체 생성
conn = DriverManager.getConnection(url,user,password);
// 3) 트랜잭션 제어를 위한 자동 커밋 비활성화
conn.setAutoCommit(false);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 2) close() 메소드
// 2-1) Connection 자원 반환 메소드
public static void close(Connection conn){
try{
// 참조하는 conn 변수가 존재하면서 닫혀있지 않은 경우
if(conn != null && !conn.isClosed()) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 2-2) Statement(부모), PreparedStatement(자식) 반환 메소드(다형성 적용)
public static void close(Statement stmt){
try{
// 참조하는 stmt 변수가 존재하면서 닫혀있지 않은 경우
if(stmt != null && !stmt.isClosed()) stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 2-3) ResultSet 반환 메소드
public static void close(ResultSet rs){
try{
// 참조하는 rs 변수가 존재하면서 닫혀있지 않은 경우
if(rs != null && !rs.isClosed()) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 3) 트랜잭션 제어
// 3-1) COMMIT
public static void commit(Connection conn){
try{
if(conn != null && !conn.isClosed()) conn.commit();
} catch (SQLException e){
e.printStackTrace();
}
}
// 3-2) ROLLBACK
public static void rollback(Connection conn){
try{
if(conn != null && !conn.isClosed()) conn.rollback();
} catch (SQLExceptin e) {
e.printStackTrace();
}
}