❗ 개인적으로 공부했던 내용을 복습하고 정리하기 위한 글입니다! 따라서 내용이 정확하지 않을 수 있습니다!
Properties는 Map계열 중 하나의 자료구조이며, key값과 value값을 세트로 저장한다. 또한 key값과 value의 값을 String형으로 다룬다.
사실 Collection에 관련해서 포스팅을 할 때 잠깐 다루긴 했었다.(여기!) 그런데 너무 대충 다루고 갔었다... 그땐 몰랐지, Properties가 꽤나 중요한 것이라는 걸...
우선 Properties
는 주로 외부설정파일을 읽어오거나, 파일형태로 출력하고자 할 때 쓴다. 여기서 외부설정파일을 사용한다는 점에 주목하고 싶다. 외부파일로 설정하면 프로젝트를 재시작 할 필요가 없다는 아주 큰 장점이 있다! 보통 쿼리문을 XML파일로 만들어 사용하는데, 쿼리문 정렬 순서를 바꾼다거나 하면 xml파일만 수정하기 때문에 재시작이 필요없어진다. 로컬에서 돌리는 프로젝트가 아니라 실제 상용에서 돌리면 점검시간 같은 게 필요없어진다.
#driver.properties
password=JDBC
url=jdbc\:oracle\:thin\:@localhost\:1521\:xe
driver=oracle.jdbc.OracleDriver
username=JDBC
이런식으로 driver.properties
파일을 만들어주었다. 이 파일 안에는 드라이버와 관련된 데이터들을 설정하였다.
그 다음, Connection
객체를 만들 때, Properties
객체를 통해 생성해 주었다. 먼저 Properties
의 load()
메소드를 통해, 파일을 불러와주고, 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
는 주로 쿼리문을 안에 적어두고 사용한다. 위에도 말했지만, 간단히 쿼리문만 수정할 때, 이 파일 안의 쿼리문을 고쳐주고, 재시작 할 필요가 없다는 엄청난 장점이 있다!
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로 올렸기 때문에 막 올려도 상관 없지만... 팀별로 프로젝트를 할 때 이 방법을 쓰면 정말 좋을 것 같다. 아니 꼭 써야겠다.
끝!😁