'Java'에 해당되는 글 6건

  1. JAVA Date 날짜 계산 CLASS
  2. HBase 테스트 소스 (3)
  3. IE에서 엑셀 다운로드 구현시 에러가 나는경우 (3)
  4. Java Collections API에 대해 모르고 있던 5가지 사항, Part 1 (1)
  5. 자바에서interface와abstract에관해
  6. ResourceBundle의 활용

JAVA Date 날짜 계산 CLASS



http://magefister.blog.me/50096917826 
항상 자바 날짜 계산하는 방법을 기억하지 못해서 찾아다녔었는데.
여기에 잘 정리가 되어 있군요.
이제 고민않고 저기로 가면 되겠습니다. 
저작자 표시 비영리 변경 금지
신고

HBase 테스트 소스



hbase 구성을 한 후, shell 테스트를 진행해보고 java와 연결하는 테스트를 진행하였다.
필요한 jar 파일은 아래와 같습니다.

commons-configuration-1.6.jar

commons-lang-2.5.jar

commons-logging-1.1.1.jar
guava-r09.jar
hadoop-auth-0.23.1.jar
hadoop-core-1.0.1.jar
hbase-0.92.0.jar
log4j-1.2.16.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
zookeeper-3.4.2.jar  

위 jar 파일을 import 해준 후 테스트 하시기 바랍니다.
테스트 소스는 아래와 같습니다.

package hbase;


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.HColumnDescriptor;

import org.apache.hadoop.hbase.HTableDescriptor;

import org.apache.hadoop.hbase.MasterNotRunningException;

import org.apache.hadoop.hbase.ZooKeeperConnectionException;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HBaseAdmin;

import org.apache.hadoop.hbase.client.HTable;

import org.apache.hadoop.hbase.client.Put;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.util.Bytes;


public class HBaseExample2 {

/**

* @param args

*/

public static void main(String[] args) {

// connection

Configuration config = HBaseConfiguration.create();

config.set("hbase.master", "umx1"); // master info

config.set("hbase.zookeeper.quorum", "umx1");

try {

HBaseAdmin ha = new HBaseAdmin(config);

// test라는 table이 없으면 생성함

if (ha.isTableAvailable("test") == false) {

System.out.println("'test' not exist!");

System.out.println("create 'test'");

HTableDescriptor tableDs = new HTableDescriptor("test");

tableDs.addFamily(new HColumnDescriptor("cf"));

ha.createTable(tableDs);

} else { // test라는 table이 있으면 삭제함

System.out.println("'test' exist!");

System.out.println("disable 'test'");

ha.disableTable("test");

System.out.println("drop 'test'");

ha.deleteTable("test");

System.out.println("create 'test'");

HTableDescriptor tableDs = new HTableDescriptor("test");

tableDs.addFamily(new HColumnDescriptor("cf"));

ha.createTable(tableDs);

}

HTable table = new HTable(config, "test");

// table에 데이터 넣기

System.out.println('\n' + "put 'test', 'row1', 'cf:qf1', 'value1'");

Put p = new Put(Bytes.toBytes("row1"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf1"), Bytes.toBytes("value1"));

table.put(p);

System.out.println("put 'test', 'row2', 'cf:qf2', 'value2'");

p = new Put(Bytes.toBytes("row2"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf2"), Bytes.toBytes("value2"));

table.put(p);

System.out.println("put 'test', 'row3', 'cf:qf1', 'value3'");

p = new Put(Bytes.toBytes("row3"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf1"), Bytes.toBytes("value3"));

table.put(p);

// table의 모든 row 가져오기

Scan s = new Scan();

System.out.println('\n' + "scan 'test'");

//s.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qf1"));

//s.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("qf2"));

ResultScanner scanner = table.getScanner(s);

try {

for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {

System.out.println("Found row: " + rr);

}

} finally {

scanner.close();

}

// table에 데이터 넣기

System.out.println('\n' + "put 'test', 'row4', 'cf:qf2', 'value4'");

p = new Put(Bytes.toBytes("row4"));

p.add(Bytes.toBytes("cf"), Bytes.toBytes("qf2"), Bytes.toBytes("value4"));

table.put(p);

// 특정 row의 value 가져오기

System.out.println('\n' + "get 'test', 'row4', 'cf:qf2'");

Get g = new Get(Bytes.toBytes("row4"));

Result r = table.get(g);

byte[] value = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("qf2"));

String valueStr = Bytes.toString(value);

System.out.println("GET: " + valueStr);

} catch (MasterNotRunningException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ZooKeeperConnectionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}


저작자 표시 비영리 변경 금지
신고

IE에서 엑셀 다운로드 구현시 에러가 나는경우



IE환경에서 page Context Type을 이용한 excel downloading 구현하였습니다. 그런데 다음과 같은 에러가 뜨더군요.


혹시나 싶어서 구글크롬에서 다운로드를 해봤습니다.
근데 다운로드가 잘되네요.
아~~이놈의 IE 정말;;; 세션 문제 이후 나를 계속 괴롭히네요.

그래서 기존에 사용하던 잘되던 소스를 뒤지고 뒤졌습니다.
일단 위 에러는 response.setHeader("Pragma", "public"); 와 같이 해서 처리했습니다.
하지만 읽기에도 아직 부자연스럽네요.

좀더 찾아봐야겠습니다.
현재까지 제가 적용해본 옵션은 아래와 같습니다.
빨간 글씨는 제가 변경해서 성공한(?) 부분입니다.
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Pragma", "public");
response.setHeader("Expires", "0");
response.setHeader("Content-Disposition", "attachment; filename=downloadExcelFile.xls");
response.setHeader("Content-Description", "JSP Generated Data");
response.setHeader("Cache-Control", "max-age=0");
인터넷 검색을 해보니, 이 같은 이슈가 많이 존재하는 것 같습니다.

아래는 제가 참고한 사이트에서 가져온 내용입니다.
죄송하지만..저도 살짝 참고 링크로 ^^

1.구글신 검색 참고사이트

2.html header에 대한 더 많은 정보를 원하시면 (그러나 영어의 압박 ;;;)
좀더 깔끔한 정리 : http://www.mnot.net/cache_docs/


저작자 표시 비영리 변경 금지
신고

Java Collections API에 대해 모르고 있던 5가지 사항, Part 1



부제 : Java Collections 사용자 정의 및 확장하기

http://www.ibm.com/developerworks/kr/library/j-5things2.html

IBM 기술문서에 올라온 자료입니다.
배열보다 유용한 Collections에 대한 내용입니다.

1. Collections 트럼프 배열
배열의 성능은 Java Collections 라이브러리의 성능에 미치지 못하고 있다고 합니다.
따라서, 배열을 Collections 클래스로 최대한 빨리 변환해서 사용하라고 권장하고 있습니다.
아래는 배열을 변환하는 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.*;
public class ArrayToList {
    public static void main(String[] args){
        // This gives us nothing good
        System.out.println(args);
 
        // Convert args to a List of String
        List<string> argList = Arrays.asList(args);
 
        // Print them out
        System.out.println(argList);
    }
}

이것의 단점은 수정할 수 없다고 합니다. 새 요소를 추가할려고 하면 UnsupportedOperationException이 발생한다고 합니다.
2. 반복은 비효율적이다.
반복에는 단점이 여러가지가 있다고 합니다.
  • 각각의 추가 또는 제거 후 콜렉션의 크기를 조정해야 하므로 비효율적이다.
  • 잠금을 획득하고, 작업을 수행한 후 잠금을 다시 해제할 때마다 심각한 동시성 문제가 발생할 수 있다.
  • 추가 또는 제거가 발생하는 동안 해당 콜렉션 작업을 수행하려는 다른 스레드에 의해 경쟁 조건이 발생한다.
하지만, Collections에서 제공하는 함수(e.g. addAll 또는 removeAll)을 사용하여 쉽게 처리할 수 있다고 하고 있습니다.

3. For 루프로 Iterable 반복하기
이것은 저도 많이 활용하고 있는 방법입니다.
예전에는 Iterator를 가져온 후 next()를 사용하여 Iterator에 지정된 오브젝트를 가져온 다음 hasNext()를 통해 사용할 수 있는 추가 오브젝트가 있는지 확인하는 과정으로 수동으로 수행해야 했습니다. 하지만 Java 5부터는 이러한 모든 과정을 자동으로 처리하는 for 루프 변형을 자유롭게 사용할 수 있습니다.
Iterable 인터페이스를 구현한 모든 Collections에서 사용 가능합니다.
저 같은 경우는 ArrayList에서 객체를 가져올 때 주로 사용합니다.

1
2
3
4
5
6
7
ArrayList<string> list = new ArrayList<string>();
list.add("item1");
list.add("item2");
list.add("item3");
for (String item : list) {
    // ...
}

위와 같이 주로 사용합니다.

IBM 기술문서에 나온 내용을 이용하여 제가 좀 적어봤는데요.
제가 언급하지 않는 내용도 Collections를 사용하면 굉장히 유용할 것입니다.
나머지는 제가 아직 사용해보지 않아서 어떻게 말씀을 못드리겠습니다.
하지만 위에서 언급한 내용은 정말 유용합니다.

더 많은 내용을 원하시면 위에 링크를 걸어놓은 IBM 기술문서 페이지로 이동하시면 됩니다.


저작자 표시 비영리 변경 금지
신고

자바에서interface와abstract에관해



1. 공통점:
우선 아래 소스1을 보시면, 전형적인 interface,와 abstract 클래스를 나타내고 있습니다.
1) abstract와 interface는 그자체가 instance화 될수가 없습니다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘다 컴파일을 해보면, 에러를 발생시킵니다.

2) Prototye만 있고 Body가 없는 메소드를 멤버함수로 가집니다.
소스1에서 보시는 봐와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있습니다.

3) abstract,interface 클래스를 사용하려면, abstract,interface 위클래스를 상속받아서, 새로운 클래스를 생성시킨후, instance화 할수가 있습니다.
소스2 에서 보는봐아 같이 상속을 받은후, 사용해야 합니다.
즉, childclass c = new childclass(); 님 컴파일시 에러가 발생하지 않습니다.

[소스1]
public interface TestInterface {
     public static int num = 8;
     public void func1();
     public void func2();
}

public abstract class TestAbstract {
     public abstract void func1() ;
     public void func2() {
          System.out.println("func2");
     }
}

[소스2]
class childclass1 extends TestAbstract {
     // Abstrace Method을 오버라이딩했습니다.
     public void func1() {
          System.out.println("상속 받아서, Body를 채워줬습니다.");
     }
}

class childclass2 implements TestInterface {
     public void func1() {
          System.out.println("Class Test1");
     }
     public void func2() {
          System.out.println("Class Test2");
     }
}

차이점:
1) Prototye만 있고 Body가 없는 메소드 즉 abstract메소드라고 하는데, Abstract 클래스는 abstract메소드와 일반 메소드를 혼용해서, 가질수 있습니다. 즉, 일반메소드 + abstrace메소드 형태를 유지한다는 겁니다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 합니다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재합니다.

2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다릅니다.
abstract클래스는 소스2처럼, extends를 사용하고, interface클래스는 implements 을 사용합니다.

3) 다중상속 가능유무 입니다.
보통 자바에서는 일반 클래스에서는 다중상속을 지원하지 않습니다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있죠. 하지만, interface의 경우에는 다중상속이 가능합니다.

4) 클래스 시작 키워드가 다르죠.
abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작합니다.

결국 큰범주에서 보면, abstract method로만 이루어진 abstract class가 interface 인셈이죠.

신고

ResourceBundle의 활용



API 위치
java.util.ResourceBundle

역할
프로그램 배포시 고정된 자원과 변화하는 자원이 있다.
게시판 배포를 예로 든다면 안에 소스는 대부분 고정된 자원이다. 하지만 사용자마다 database의 설정 등은 수정해서 사용해야 하는 부분이다.
이러한 값들은 프로그램의 알고리즘 과 상관없는 부분으로 따로 관리해야 하는 자원들이다. 이러한 자원은 파일로 저장해서 관리하는 것이 보편적은 추세로 ResourceBundle을 이용 할 수 있다.

아래는 현재 사용중인 properties 파일이다.
ADMIN_ID=id
ADMIN_PWD=pass
MAX_UPLOAD_SIZE=6291456

위에서 보면 단순히 "="를 기준으로 해서 왼쪽에 key 오른쪽에 value가 들어가는 단순한 형식임을 볼 수 있다.
#주석
[key]=[value]

주의 할점은 String 형식이라고해서 ",' 이런걸 사용하면 안된다는 것이다.

ResourceBundle 클래스는 자원을 저장하고 반환하는 기능을 제공하는 클래스이다. 이 클래스의 getBundle 메소드는 파일이나 클래스등으로 부터 ResourceBundle 객체를 생성시켜 주어 key값을 통해 해당 value를 얻을 수 있다.

주요 메소드
static ResourceBundle getBundle(String baseName)
: 주어진 값으로 해당 자원을 가지는 ResourceBundle 객체를 만든다.
Object getObject(STring key)
: 키값에 해당되는 객체를 반환한다.
String getString(String key)
: 키값에 해당되는 문자열을 반환한다.

자원 파일
ResourceBundle 클래스는 국제화를 지원하기 위한 클래스로 파일명은 Locale 파일 규칙을 사용한다. 파일의 기본 이름은 "Res"이고, 언어 코드가 "ko", 지역 코드가 "KR"이라면 "Res_ko_KR.properties" 이런식으로 만들며 확장자는 반드시 .properties인 텍스트 파일이어야 한다. 하지만 우리는 국제화에 따라 다양한 언어와 지역을 지원하기 위해 사용하는 것이 아니니 그냥 "Res_성격에 맞는 이름.properties"로 사용하면 되겠다.

자원 파일의 위치
properties 파일은 getBundle 메소드에 의해 객체로 전환이 된다. 따라서 클래스 파일과 같이 위치를 추적하면 되겠다. 만일 "Res_test.properties"라는 파일을 classes 폴더 및에 test라는 폴더 아래 두었다면 우리는 "test.Res_test" 라고 해서 찾아가면 된다.

Res_test.properties
SINCE_YEAR=2002
SINCE_MONTH=5
SINCE_DATE=8
SINCE_DAY=Wednesday

이 파일을 "web-inf/classes/test/" 아래 두고 테스트를 해보겠다.

불러오기 테스트
간단하게 jsp에서 호출을 해보겠다.
resourceBundleTest.jsp
<%@ page contentType="text/html;charset=MS949"%>
<%@ page import!="java.util.ResourceBundle" %>
<%@ page import!="java.util.Enumeration" %>
<%
  ResourceBundle bundle = null;
  try {
       bundle = ResourceBundle.getBundle("test.Res_test");
       Enumeration enum = bundle.getKeys();
       for (; enum.hasMoreElements(); ) {
           String name = (String)enum.nextElement();
           String value = bundle.getString(name);
           out.println(name + " : " + value);
           out.println("<BR>");
       }
  } catch (Exception e) {
       out.println("Err: "+e.toString());
  }
%>

결과
SINCE_YEAR : 2002
SINCE_DATE : 8
SINCE_MONTH : 5
SINCE_DAY : Wednesday

ResourceBundle 클래스는 사용이 너무도 간단하기에 web에서 자주 사용되리라 생각된다.


신고