[구디아카데미] Properties 클래스

최주영·2023년 4월 19일
0

JDBC

목록 보기
3/5
post-thumbnail

[구디아카데미]

✅ Properties

  • Properties 클래스는 Hashtables의 하위 클래스
  • Hashtables를 상속 받았기 때문에 Map의 속성 즉, KeyValue를 갖는다.
  • HashMap과 큰 차이가 없지만, Properties 클래스는 파일 입출력을 지원
  • key=value 형식으로 작성 된 파일을 key와 value 로 나누어 저장할 때 유용

주요함수

getResource

  • 클래스 기준으로 상대적인 위치의 리소스를 가져오는 메소드
  • "/" -> 루트부터 bin까지의 경로가 다 나옴 (bin = 클래스파일이 저장되는 곳)

getPath

  • File 객체를 생성할 때 넣어준 경로를 그대로 반환
  • getResource 메소드와 같이 사용

getProperty

  • 해당 파일의 상대적 정보를 가져오는 메소드

load

  • 해당 파일의 파일 정보를 불러오는 메소드

💡Properties 에서 sql문이 인식이 잘 안될 경우
이클립스 -> Project -> clean 클릭

package com.jdbc.common;

import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {
// ✅ Template 패턴
//  코드 재사용이 유용함
//  Connection 객체 생성과 각 JDBC 연결에 필요한 객체를 닫아줄 때, 트렌잭션 처리할 때
// 일일이 계속 선언할 필요 없이 메소드로 만들어 놓고 호출해서 편리하게 사용하는 방법이다

	//Connection 객체를 생성해주는 기능을 제공
	public static Connection getConnection() {
		Connection conn = null;
		// 파일과 연결하기 위해서는 절대경로가 필요함
		String path = JDBCTemplate.class.getResource("/driver.properties").getPath();
		// "/" -> 루트부터 bin까지의 경로가 다 나옴 (bin = 클래스파일이 저장되는 곳) 
		// "/driver.properties" -> driver.properties 경로 
	
		try {
			Properties driver = new Properties(); // Properties 객체 생성
			driver.load(new FileReader(path)); // 파일을 읽어야하므로 IOException 예외처리를 해줘야함
			
			
			Class.forName(driver.getProperty("drivername")); // 키값으로 밸류값 알수 있음
			conn = DriverManager.getConnection(driver.getProperty("url")
												,driver.getProperty("user")
												,driver.getProperty("pw"));
			conn.setAutoCommit(false);
		}catch(ClassNotFoundException e) {//Class.forName로 오라클 클래스정보를 얻지못할 때 필요한 예외처리
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}catch(IOException e) { // FileReader 클래스로 인해 예외처리
			e.printStackTrace();
		}
		
		return conn;  
	}
	
	//connection, Statement, Result 객체를 닫아주는 기능 제공
	public static void close(Connection conn) {
		try {
			if(conn != null && !conn.isClosed()) {
				conn.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Statement stmt) {
		try {
			if(stmt!=null && !stmt.isClosed()) {
				stmt.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet rs) {
		try {
			if(rs!=null && !rs.isClosed()) {
				rs.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	//트렌젝션을 처리하는 기능을 제공
	public static void commit(Connection conn) {
		try {
			if(conn!=null && !conn.isClosed()) {
				conn.commit();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}

	public static void rollback(Connection conn) {
		try {
			if(conn!= null && !conn.isClosed()) {
				conn.rollback();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
}

// resources 폴더 안의 driver.properties 파일
drivername=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=student   
pw=student



// MemmberDao 클래스
package com.jdbc.model.dao;

import static com.jdbc.common.JDBCTemplate.close;

import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.jdbc.common.JDBCTemplate;
import com.jdbc.model.dto.MemberDTO;

public class MemberDao {
	private Properties sql = new Properties();
	
	{ // 제일 먼저 실행되는 초기화블록에다 넣어줘야함!
      // 왜냐하면 sql문이 실행되기전에 먼저 파일을 불러와야하기 때문이다
		try {  // 루트밑에 빈밑에 패키지 밑에 member 밑에 파일이름
			String path=MemberDao.class.getResource("/sql/member/member_sql.properties").getPath();
			sql.load(new FileReader(path));
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public List<MemberDTO> selectAllMember(Connection conn){
		Statement stmt = null;
		ResultSet rs = null;
		// String sql = "SELECT * FROM MEMBER";
		String sql = this.sql.getProperty("selectMemberAll");
		List<MemberDTO> members = new ArrayList();
		
		
		
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while(rs.next()) {
				members.add(getMember(rs));
			}
			
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCTemplate.close(rs);
			JDBCTemplate.close(stmt);
		}
		return members;
	}

import static com.jdbc.common.JDBCTemplate.*;
// JDBCTemplate 클래스안의 static 메소드들을 클래스명 생략해서 사용 가능
기존에는 JDBCTemplate.getConnection()으로 호출해야한다면 앞에 클래스명 생략이 가능하다!

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

1개의 댓글

comment-user-thumbnail
2023년 4월 19일

우왕~ 이해가 쏙쏙!

답글 달기