[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) {}
        }
    }
}

GIS 공개소프트웨어 넥스젠의 지형에 대한 3차원 가시화

넥스젠은 DEM 데이터를 활용하여 경사도, 단면도를 측정할 수 있는 기능을 기본적으로 제공합니다. 이러한 기본 기능 위에 사용자가 원하는 지역을 선택해, 선택한 지역에 대한 3차원 지형 가시화 기능도 함께 제공하고 있는데요. 먼저 아래의 화면처럼 마우스를 통해 3차원으로 가시화 하고자 하는 지형을 선택합니다.

그러면 다음과 같이 3가지 형태로 지형에 대한 3차원 가시화 결과가 사용자에게 제공됩니다. 먼저 지형의 형상을 그물망으로 표시하는 와이어프레임 형태입니다.

다음은 석고상처럼 회색으로 지형을 간결하게 표현하는 솔리드 형태입니다.

그리고 다음은 항공영상을 지형에 맵핑한 형태입니다.

지형에 대한 3차원 가시화 기능은 사용자가 지도를 살펴보다가 실제 지형의 형태를 3차원으로 빠르게 파악하기 위한 목적에 맞게 개발된 기능으로 NexGen의 기본기능 중 하나입니다.

GeoService-Xr에서 동적으로 GeoData 추가 및 삭제하기

GeoService-Xr은 공간 데이터를 GeoData라는 단위로 처리합니다. 정확하게 일치하지는 않으나 GeoData는 GIS의 Layer와 매우 유사합니다. GeoData를 새롭게 추가하거나 삭제하기 위해서는 일단 GeoService-Xr의 실행을 중지시키고 geodata.xml 파일을 통해 GeoData를 수정한 후 다시 GeoService-Xr을 재기동시킵니다. 그러나 간혹 geodata.xml 파일의 수정이 아닌 GeoService-Xr의 실행 중에 GeoData를 추가 도는 삭제가 가능합니다.

아래는 추가되어진 GeoData를 삭제하는 RestAPI 명령의 한가지 예 입니다.

http://localhost/Xr?rmGD|muan_parc_a

위의 rmGD가 ‘remove GeoData’ 명령이고 muan_parc_a가 제거하고자 하는 GeoData 식별자입니다.

아래는 새로운 GeoData를 추가하는 RestAPI 명령의 한가지 예 입니다.

http://localhost/Xr?addGD|muan_parc_a|muan_db://public."parc_a"|5186

addGD가 ‘add GeoData’ 명령이고, muan_parc_a가 GeoData의 식별자이며 muan_db://public.”parc_a”가 DBMS의 식별자(muan_db)와 테이블명(public.”parc_a”)로 지정되는 추가하고자 하는 공간 데이터 Table입니다.

이처럼 동적으로 GeoData를 추가하고 삭제하는 기능을 통해 웹 기반에서, GIS 시스템에서 유연하게 공간데이터를 핸들링할 수 있는 기반을 제공하게 됩니다.

MySQL, MariaDB의 INSERT INTO … ON DUPLICATE KEY UPDATE …

MySQL(MariaDB)에서 동일한 Key 값이 이미 존재한다면 UPDATE 문을 호출하여 기존의 Row의 값을 변경하고, 동일한 Key 값을 가진 Row가 없다면 INSERT를 호출하는 SQL 문의 예입니다.

INSERT INTO 
    current_load_powerfactor 
    (ref_mRID, update_timeStamp, value) 
VALUES
    ("_1e1ccab5-250a-44a3-89d8-177e2d53e071", NOW(), 99) 
ON DUPLICATE KEY UPDATE 
    update_timeStamp=NOW(), value=99

위의 SQL은 current_load_powerfactor라는 테이블에 대해서, Primary Key로 잡힌 ref_mRID가 중복된 이미 존재하는 Row가 있다면, 중복된 Row의 값을 변경(UPDATE 문 실행)하고, 중복된 Row가 없다면 새로운 Row를 추가(INSERT)하라는 내용입니다.