요새 jsch를 유튜브 보면서 공부하고, 샘플 프로그램을 작성하고 있습니다. 유튜브에서, java의 properties 클래스를 이용해서 셋팅값을 넣는 것을 보았습니다. put 함수를 넣으니까 새삼 편하구나. 이렇게 느꼈습니다. 그러다가 문득, 이런 생각을 하게 되었습니다.

 


 Jdbc에서, 데이터베이스에 접근하기 위해서는, connection을 생성해야 합니다.

 

 

  위 프로그램에서는 getConn 메서드가 그러한 역할을 수행합니다. getConn 내부를 보겠습니다.

 

 

 Connection을 얻기 위해서, 3개의 정보를 넘겨줍니다. 접속할 주소, 유저 이름, 패스워드. 이렇게 3개입니다. 그런데, 이것을 java 파일 내에 하드코딩을 하고 있습니다. 이 방법은 그렇게 좋아보이지는 않습니다. 파일로 저장하고, 그 파일을 프로그램 내에서 불러와 보겠습니다.

 

 

 먼저, 저는 C의 Users 폴더의 cho 폴더 밑에 db_config.txt 파일을 만들었습니다.

 

 

 그리고 이런 식으로 3가지 정보를 저장합니다. 각각 디비에 접속할 주소, 유저 id, 접속 패스워드입니다. pw 부분은 암호화 해서 저장하면 좋을 듯 싶군요.

 


 Properties 클래스에는 InputStream을 받는 load 메서드가 있습니다. 이것을 이용하면 파일에서 속성값을 읽어올 수 있습니다. 어떤 식으로 읽어오는지는, 간단하게 뒤에서 후술하도록 하겠습니다.

 

 달라진 부분은 44번째 줄부터 47번째 줄입니다. properties 객체를 선언합니다. 그리고, FileInputStream인 fis를 생성하였는데요. 이것은, Users의 cho 밑에 있는 db_config와 연관이 있는 스트림입니다. 이 상황을 대략적으로 그려보면 아래와 같습니다.

 

 

 그러면, 파일에서 설정 내용을 읽을 겁니다. 그런데, 48번째 줄에서, String으로 강제 형변환을 하는 게 있습니다. inputStream을 인자로 받는 load를 호출하면, 내부적으로 load0을 호출하게 되는데요.

 

 이 메서드의 끝 부분을 보겠습니다.

 

 

 key하고 value를 put하는데, key도 String, Value도 String입니다. 그런데 왠 put? 왜 put이 갑자기 튀어나왔을까요?

 

 

 Properties는 HashTable을 extends한 클래스입니다. HashTable에서 put 메서드가 있습니다. 실제로 디버그를 해 보면, 해시테이블의 put 메서드를 호출함을 알 수 있습니다. get 메서드를 호출했을 때, table에서 키 값을 찾아서 Value를 뽑아옵니다.

 

 

 실제로 txt 파일에서 읽은 속성이 HashTable에 위와 같이 저장이 되어 있음을 알 수 있습니다. Key, Value 쌍으로 말입니다. 키 값이 jdbc.id인 경우, value 값이 root입니다. 즉, pr.get("jdbc.id")의 결과는, "root"가 나옵니다. 이것은 jdbc.id=root를 파일에 넣었는데요. 이 =을 기준으로 Key와 Value로 구분했다는 것을 의미합니다. 그런데, 2번째 jdbc.addr을 보면, Value 값에 =이 들어간다는 것을 알 수 있는데요. 무조건 =을 기준으로 분리하지는 않는다는 의미이기도 합니다.

 

 정확하게 어떻게 Key와 Value를 분리하는지는 load0 메서드를 보시면 되는데요. 여기에서는 굳이 언급하지 않도록 하겠습니다. 여기서 보아야 할 것은 id=cho 이런 식으로 설정 파일에 쓰고, 설정 파일을 properties에서 load를 하면, 속성들을 저장하는 map에 키는 "id"이고, value가 "cho"인 쌍이 들어간다는 것입니다. spring boot의 application.properties 파일을 이런 식으로 읽는지는 조금 더 찾아봐야 겠습니다.

 

 

 

 나머지는, catch 절에 몇 개의 exception이 추가되는 것 밖에 없습니다. java.util의 Properties 클래스를 보시다 보면, xml 파일을 처리하기 위한 함수들도 여러개 나오는데요. xml 파일을 불러와서 속성값을 처리하는 프로그램을 만들어 보시는 것도 괜찮은 공부가 되지 않을까 싶습니다.