Java의 .properties 파일 읽기

Java는 알면 참 편한 기능들이 많습니다. 그중 Properties 라는 클래스인데요. 이 클래스는 Windows의 INI 파일과 같은 기능을 합니다. DB에 대한 연결정보를 파일로 저장해 놓고 사용하는 용도로 가장 많이 쓰이는데요. 이런 경우 db.proerties라는 파일명으로 자주 작명됩니다.

Java의 새로운 프로젝트를 생성하고 main 함수가 있는 클래스를 EntryMain이라고 한다면 프로젝트가 다음과 같이 구성되어 있다고 합시다. 물론 이 구성은 실제 제가 테스트한 것 입니다.

위의 구성을 보면 config에 db.properties 라는 파일도 보입니다. 이 파일에 db에 대한 연결정보를 가지고 있으며 내용은 다음과 같습니다.

driver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/postgres
username=postgres
password=#goodday#

이제 이 db.properties에 담겨진 정보를 읽기 위해 Properties라는 클래스를 사용하는 코드는 다음과 같습니다.

package tstMyBatis;

import java.io.IOException;
import java.io.Reader;
import java.util.Properties;

public class EntryMain {

	public static void main(String[] args) {
		String resource = "config/DB.properties";
		Properties properties = new Properties();
		
        try {
    		Reader reader = Resources.getResourceAsReader(resource);
    		properties.load(reader);

        	System.out.println(properties.getProperty("driver"));
			System.out.println(properties.getProperty("username"));
			System.out.println(properties.getProperty("password"));
			System.out.println(properties.getProperty("url"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

실행해 보면, db.properties 파일을 담겨져 있는 4개의 정보가 콘솔에 표시되는 것을 볼 수 있을 것입니다. 안되다면, 코드에 오타는 없는지.. 그리고 Clean을 해보시기 바랍니다. Clean을 통해 bin 디렉토리에 config/db.properties가 복사되는 것을 보장하기 때문입니다.

[Java] 오늘 날짜, 어제 날짜

Java에서 오늘 날짜를 구하기 위한 코드입니다. 집계 서비스를 만들기 위해 사용한 코드인데요.

GregorianCalendar today = new GregorianCalendar();

int Year = today.get(Calendar.YEAR);
int Month = today.get(Calendar.MONTH);
int Date = today.get(Calendar.DATE);
int Hour = today.get(Calendar.HOUR_OF_DAY);

GregorianCalendar 클래스를 생성할 때 파라메터를 주지 않으면 오늘 날짜에 대한 객체가 생성됩니다. 주의할 점은 GregorianCalendar의 1월을 0부터 시작하므로, 필요시에 월의 값에 1을 더해줘야 합니다.

참고로 get 매서드에서 사용할 수 있는, 각 시간의 단위를 얻기 위해서 사용할 수 있는 값은 다음과 같습니다.

  • Calendar.YEAR – 년도
  • Calendar.MONTH – 월(0~11)
  • Calendar.DATE – 일
  • Calendar.AP_PM – 오전/오후
  • Calendar.HOUR – 시
  • Calendar.MINUTE – 분
  • Calendar.SECODE – 초

이제 여기서 한단계 더 나아가.. 어제는? 한달전은? 일주일전은? 어떻게 알 수 있을까.. 아래의 코드는 위의 today를 기준으로 1일 전을 나타내는 코드입니다.

today.add(Calendar.DAY_OF_MONTH, -1);

위의 코드를 이용하면 특정 날짜를 기준으로 원하는 날짜를 정확하게 파악할 수 있을 것입니다. GregorianCalendar 에서 기본적으로 사용하는 TimeZone은 OS에서 설정된 나라로 지정됩니다. 이 TimeZone은 setTimeZone 매서드를 통해 재변경이 가능합니다. 아래의 코드는 Europe/London에 대한 TimeZone으로 변경하는 코드 예입니다.

TimeZone timeZone = TimeZone.getTimeZone("Europe/London");
today.setTimeZone(timeZone);

끝으로 GregorianCalendar 객체의 시간을 다양하게 표현하기 위해 SimpleDateFormat 클래스를 사용할 수도 있습니다. 아래의 코드는 SimpleDateFormat 클래스르 사용해 원하는 형식으로 시간을 표현하는 코드 예입니다.

GregorianCalendar today = new GregorianCalendar();
SimpleDateFormat format = new SimpleDateFormat("yyyy년 MM월 dd일 aa hh시 mm분 ss초");
String strTime = format.format(today.getTime());

Oracle 12c 설치 후 계정 생성 및 JDBC 연결 테스트

오라클 12c(12.2.0.1.0)을 설치하고 계정을 생성하고 필요한 권한을 부여한 후 테이블을 생성해 몇가지 데이터를 INSERT해서 최종적으로 JDBC로 연결해 쿼리를 날려 데이터를 받는 테스트를 하고 몇가지 내용을 정리합니다. 참고로 오라클 12c에는 기본적으로 공간 데이터 처리를 위한 기능이 같이 설치가 됩니다.

오라클을 설치하고 다음 명령을 통해 계정을 생성하고 해당 계정에 필요한 권한을 부여합니다. Console 창에서 실행한 경우입니다.

# sys 계정으로 접속
sqlplus / as sysdba

# 계정 생성(로컬 사용자가 아닌 공통 사용자 생성의 경우 반드시 c##을 붙여줘야 함)
create user c##dip2k identified by PASSWORD;

# 계정 잠근 해제
alter user c##dip2k account unlock;

# 로그인 및 테이블 생성 권한 부여
grant connect, resource to c##dip2k

# Tablespace 권한 부여(INSERT 문 실행 가능하도록 함)
alter user c##dip2k default tablespace users quota unlimited on users;

이제 다시 sqlplus를 실행해 앞서 생성한 계정으로 로그인하고 test_mytable이라는 이름의 테이블을 생성하고 데이터를 추가합니다. 그리고 오라클용 JDBC jar 파일을 다운로드 받고 다음 java 코드를 통해 연결을 테스트합니다.

package test_oracle_jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MainEntry {
    public static void main(String[] args) {
        String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        String USER = "c##dip2k";
        String PASSWORD = "PASSWORD";
        String query = "SELECT * from test_mytable";
		
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
		
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
			
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            stmt = conn.createStatement();
            rs = stmt.executeQuery(query);
			
            while(rs.next()) {
                String v = rs.getString(1);
				
                System.out.println(v);
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null) rs.close();
                if(stmt != null) stmt.close();
                if(conn != null) conn.close();
            } catch(SQLException e) {}
        }
    }
}

MariaDB의 JDBC 연결

MySQL에서 파생된 MariaDB를 프로젝트에 사용하고 있는데요. 이 MariaDB를 Java에서 연결해 필요한 데이터를 조회하기 위해 JDBC를 사용하는 코드를 정리해 둡니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class MainEntry {
    public static void main(String[] args) {
        Connection con = null;
        PreparedStatement pstmt = null;   
        ResultSet rs = null;

        try {
            Class.forName("org.mariadb.jdbc.Driver");
			
            con = DriverManager.getConnection(
                "jdbc:mariadb://100.100.100.7:3306/dbname",
                "userId",
                "password");
						
            pstmt = con.prepareStatement("select * from his_bus_voltage");
			
            rs = pstmt.executeQuery();
			
            while(rs.next()) {
                //.
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null) {
                    rs.close(); // 선택 사항
                }
				
                if(pstmt != null) {
                    pstmt.close(); // 선택사항이지만 호출 추천
                }
			
                if(con != null) {
                    con.close(); // 필수 사항
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

MariaDB의 JDBC 라이브러리는 공식 사이트인 https://downloads.mariadb.org/connector-java/에서 다운로드받았으며, 이 글을 작성할 때는 mariadb-java-client-2.0.3.jar를 사용하였습니다.

[golang] 배열을 포인터로 전달하는 함수

Go는 배열을 함수로 전달할때 배열의 전체를 복사한 값 형식으로 함수에 전달합니다. 결국 함수 안에서 해당 배열의 요소를 변경하여도 파라메터로 전달되어진 그 원래의 배열에 변경이 생기지 않습니다. 그러나 이 배열을 포인터로 전달하면 함수 내부에서 변경되는 대상이 원본이므로 변경 내용을 유지됩니다. 아래는 배열을 포인터 타입으로 함수에 전달하는 예제입니다.

package main

import "fmt"

func f(a *[3]int) {
	a[1] = 100
}

func main() {
	a := [3]int{1, 2, 3}

	f(&a)

	fmt.Println(a[1])
}