[JAVA] JDBC Properties

쥬니·2022년 10월 14일
0

공부

목록 보기
8/11

❗ 개인적으로 공부했던 내용을 복습하고 정리하기 위한 글입니다! 따라서 내용이 정확하지 않을 수 있습니다!

📄 Properties

Properties는 Map계열 중 하나의 자료구조이며, key값과 value값을 세트로 저장한다. 또한 key값과 value의 값을 String형으로 다룬다.

사실 Collection에 관련해서 포스팅을 할 때 잠깐 다루긴 했었다.(여기!) 그런데 너무 대충 다루고 갔었다... 그땐 몰랐지, Properties가 꽤나 중요한 것이라는 걸...

왜쓸까?

우선 Properties는 주로 외부설정파일을 읽어오거나, 파일형태로 출력하고자 할 때 쓴다. 여기서 외부설정파일을 사용한다는 점에 주목하고 싶다. 외부파일로 설정하면 프로젝트를 재시작 할 필요가 없다는 아주 큰 장점이 있다! 보통 쿼리문을 XML파일로 만들어 사용하는데, 쿼리문 정렬 순서를 바꾼다거나 하면 xml파일만 수정하기 때문에 재시작이 필요없어진다. 로컬에서 돌리는 프로젝트가 아니라 실제 상용에서 돌리면 점검시간 같은 게 필요없어진다.

📃 driver.properties

사용방법

#driver.properties
password=JDBC
url=jdbc\:oracle\:thin\:@localhost\:1521\:xe
driver=oracle.jdbc.OracleDriver
username=JDBC

이런식으로 driver.properties 파일을 만들어주었다. 이 파일 안에는 드라이버와 관련된 데이터들을 설정하였다.

그 다음, Connection객체를 만들 때, Properties객체를 통해 생성해 주었다. 먼저 Propertiesload()메소드를 통해, 파일을 불러와주고, Properties안에 있는 key를 불러와 주면 된다.

	Properties prop = new Properties();
	try {
			prop.load(new FileInputStream("resources/driver.properties"));

			Class.forName(prop.getProperty("driver"));
			conn = DriverManager.getConnection(prop.getProperty("url"),
											   prop.getProperty("username"),
											   prop.getProperty("password"));


		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

📜 mapper.xml

Mapper는 주로 쿼리문을 안에 적어두고 사용한다. 위에도 말했지만, 간단히 쿼리문만 수정할 때, 이 파일 안의 쿼리문을 고쳐주고, 재시작 할 필요가 없다는 엄청난 장점이 있다!

사용방법

Properties객체에 loadFromXML() 메소드를 통해 파일을 불러온다. 이때 주의할 점은 loadFromXML()메소드를 사용해야 한다는 점이다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>mapper.xml</comment>
	<entry key="selectAllName">
		SELECT 
			TNAME 
		FROM 
			TEST
	</entry>
</properties>

mapper.xml을 위와같이 만들어 준 후,

prop.loadFromXML(new FileInputStream("resources/mapper.xml"));

Properties객체의 loadFromXML()메소드를 통해 파일을 읽어왔다.

String sql = prop.getProperty("selectAllName");

그 후, 실행할 쿼리문(sql)에 getProperty()메소드를 통하여, 키값을 호출해 준다.

전체 코드

		Connection conn = null;
		Properties prop = new Properties();
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		try {
			prop.load(new FileInputStream("resources/driver.properties"));
			
			Class.forName(prop.getProperty("driver"));
			conn = DriverManager.getConnection(prop.getProperty("url"),
											   prop.getProperty("username"),
											   prop.getProperty("password"));
			
			prop.loadFromXML(new FileInputStream("resources/mapper.xml"));
			
			String sql = prop.getProperty("selectAllName");
			pstmt = conn.prepareStatement(sql);
			rset = pstmt.executeQuery();
			
			while(rset.next()) {
				System.out.println(rset.getString("TNAME"));
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

실행 결과


DB에서 확인해본 Resultset과,

콘솔에서 확인해 본 Resultset이 같음을 확인할 수 있다!(성공적으로 작동된다~)

🔖 마치며

귀찮게 따로 파일로 빼야해? 하겠지만, 이렇게 빼두면 코드 중복을 정말 줄일 수도 있다! 그리고... 쿼리문 같은 경우에 수정 하고 프로젝트 빌드를 다시 안 해도 된다는 장점이 있다는 걸 이제 알았다... 그동안 쿼리문 하나 고치고 빌드하고 또하나 고치고 또 빌드하고... 정말 징글징글 했다.
또 이렇게 파일로 빼면 장점이 하나 더 있다! 원격 저장소에 올릴 때(깃헙같은 곳) DB접속 정보가 적혀있는 driver.properties 파일을 빼고 올리면 나름 보안을 유지할 수 있다는 장점이 있다! 물론 지금은 로컬DB로 올렸기 때문에 막 올려도 상관 없지만... 팀별로 프로젝트를 할 때 이 방법을 쓰면 정말 좋을 것 같다. 아니 꼭 써야겠다.
끝!😁

0개의 댓글