Image Pyramid

Posted at 2014. 1. 30. 03:28 | Posted in Mini Project
반응형

Introduction


아주 오래 전 플렉스와 실버라이트가 난리를 쳤을 때 난 플렉스를 공부 했었다.


그 때 훈스닷넷에서 하는 실버라이트 세미나를 갔었는데(왜 플랙스 세미나를 안가고...) 그 때 발표자(?)가 발표를 했던게 실버라이트의 이미지 피라미드였다.


그 때.. 난 "아 참 조쿠나~" 라고 생각 해놨다가 꽤 오랜 시간이 지난 지금 생각이 났다. ㅋㅋㅋ




Fundamental


고용량의 큰 이미지가 있다. 이 이미지를 브라우저에서 본다고 하자.


그러면 실제로 화면에 보여지는 이미지의 영역은 얼마 안될 것이다.



하지만 큰 이미지를 한번에 가져오기 때문에 네트워크 낭비가 심하다.


이 문제를 해결하기 위해서 이미지를 잘게 자른 후 화면(브라우저)에 보이는 영역만 불러오는 것이다!



이것 저것 찾아보니까 이미지 피라미드에 대한 문서들이 있었다. 


Web Map Tile Services for Spatial Data.pdf


Pyramid methods in image processing.pdf



이미지 저장 시에 참고한 그림는 아래와 같다. 아래 그림에 영감을 받아서 만들어 보았다.





Project

 

데모 : http://antop.nerv.kr/image.pyramid/



데이터베이스가 서버에는 MySQL이고, 샘플은 Derby 이다.


pyramid.txp


01


이 ERD가 자바에서는 아래 그림과 같이 클래스 구조를 가진다. ORM!





jQuery Plugin


이미지를 저장하는 부분보다 보여주는 부분이 더 개발 비율이 많다. 화면에 보여주는데 사용한 제이쿼리 플러그인은 아래와 같다.


jQuery Form Plugin - AJAX 로 폼 전송이나 파일 업로드를 할 수 있는 플러그인


jQuery Upload File - jQuery Form Plugin 을 이용하여 파일 업로드를 하는데 상태바를 지원해준다.


jQuery Mouse Wheel Plugin - 마우스 휠이 굴러가는 이벤트를 감지할 수 있게 해준다.


jQuery Schedule - 스케쥴링을 가능하게 하는 해준다. (Quartz 같은거...)


jQuery Dragscrollable (jQuery 홈페이지 개편되면서 플러그인 링크 죽음) - 마우스를 끌면 화면을 스크롤 해줌.


perfect-scrollbar : 가상 스크롤바를 달아준다.


Element Onscreen Visibility - 선택한 태그(selector)가 화면에 보이고 있는 태그인지를 판별한다.




이제 힘들어서 못쓰겠네 후.... 알아서 ㄱㄱ 질문은 받음 -_-/


image.pyramid.src.zip


↑ 이클립스 프로젝트 소스 파일 (메이븐)


image.pyramid.war.zip.001


image.pyramid.war.zip.002


↑ WAR 파일 (7-zip 분할)


반응형

'Mini Project' 카테고리의 다른 글

Proftpd Manager  (0) 2012.12.10
게시판 2.0  (5) 2011.07.27
Sudoku  (0) 2011.06.09
간단한 JAVA 실행기(?)  (1) 2011.03.21
Forecast Repository  (8) 2010.11.30
Sales History API  (2) 2010.05.27
Order Entry API  (0) 2010.05.13
Human Resources API  (0) 2010.05.10
게시판 1.0  (1) 2010.03.11
비밀번호 생성기(Generate Password)  (1) 2010.02.10
//

Mybatis Type Handler

Posted at 2012. 9. 30. 12:49 | Posted in Java+/Example
반응형

마이바티스를 이용하여 자바 객체와 데이터베이스 테이블을 매핑할 때 서로 완전히 다른 타입의 것들을 사용할 때가 있습니다.

 

그 예로 대표적인 예가 자바의 Boolean 과 데이터베이스의 플래그 문자입니다.

 

 

오라클 같은경우 boolean 타입이 없기 때문에 보통 CHAR(1) 잡고 Y/N 값을 많이 사용합니다.

 

다른 경우는 1 or 0 을 사용하여 참/거짓, 사용/미사용, 차단/허용 같은 on/off 플래그 값을 사용합니다.

 

자바 

데이터베이스 

boolean

CHAR(1)

INTEGER  

참 / 사용

true

Y

 1 

거짓 / 미사용

false

N

 0 

 

org.apache.ibatis.type.TypeHandler 인터페이스를 이용해서 서로 다른 타입을 연결할 수 있습니다.

 

package com.tistory.antop.mybatis.handler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;

public class StringYnTypeHandler implements TypeHandler<Boolean> {

    private Logger logger = Logger.getLogger(getClass());

    public Boolean getResult(ResultSet rs, String columnName) throws SQLException {
        String s = rs.getString(columnName);

        return parseBoolean(s);
    }

    public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException {
        String s = rs.getString(columnIndex);

        return parseBoolean(s);
    }

    public Boolean getResult(CallableStatement cs, int columnIndex)
        throws SQLException {
        String s = cs.getString(columnIndex);

        return parseBoolean(s);
    }

    public void setParameter(PreparedStatement ps, int i, Boolean bool,
        JdbcType jdbcType) throws SQLException {

        ps.setString(i, parseString(bool));
    }

    // "Y" or "N" -> true or false
    private boolean parseBoolean(String s) {
        boolean bool = false;

        if (s == null) {
            return false;
        }

        s = s.trim().toUpperCase();

        if (s.length() == 0) {
            return false;
        }

        // allow "Y" or "N"
        if ("Y".equals(s) == false && "N".equals(s) == false) {
            throw new PersistenceException("value must be \"Y\" or \"N\".");
        }

        bool = "Y".equals(s);

        if (logger.isDebugEnabled()) {
            logger.debug("\"" + s + "\" -> " + bool);
        }

        return bool;
    }

    // true or false -> "Y" or "N"
    private String parseString(Boolean bool) {
        String s = (bool != null && bool == true) ? "Y" : "N";

        if (logger.isDebugEnabled()) {
            logger.debug(bool + " -> " + "\"" + s + "\"");
        }

        return s;
    }
}

 

이 클래스를 이용하면 자바에서는 boolean 타입을 사용하면 데이터베이스에서는 Y or N 값이 들어가게 됩니다.

 

mybatis.typehandler.zip

 

위 샘플은 메이븐 프로젝트 구조입니다.

 

샘플을 만드는 도중에 sqlite3 는 이상한게 TIMESTAMP 타입을 java.util.Date 클래스와 매핑 하면 들어갈 때는 그대로 들어가는데 조회할 때는 java.util.String 이 나오는군요....

 

그래서 TIMESTAMP 에 대한 핸들러 하나 더 만들었습니다.

 

테스트는 com.tistory.antop.mybatis.TypeHandlerTest 클래스 입니다. JUnit 입니다.

 

실행시 Run Configurations 중 VM 옵션에 이래와 같이 "-Dlog4j.configuration=config/properties/log4j.properties" 를 추가해 줘야 로그를 볼 수 있습니다.

 

 

 

반응형
//

PK 두개 이상시 매핑

Posted at 2009. 12. 24. 14:04 | Posted in Framework/Hibernate
반응형


위와 같은 PK(Primary Key)가 두개인 테이블이 있습니다.

이 테이블을 매핑시켜봅시다.

PK가 하나일때는 <id> 태그를 써서 쓰면 되지만, 두개일때는 <composite-id> 태그를 사용합니다.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="model">
	<class name="Code" table="common_code">

		<composite-id>
			<!-- PK1 -->
			<key-property name="code" type="string">
				<column name="code" length="10">
					<comment>코드</comment>
				</column>
			</key-property>
			<!-- PK2 -->
			<key-property name="lang" type="string">
				<column name="language" length="3">
					<comment>언어</comment>
				</column>
			</key-property>
		</composite-id>
			
		<property name="codeDesc" type="text">
			<column name="code_desc" not-null="false">
				<comment>코드 설명</comment>
			</column>
		</property>

	</class>
</hibernate-mapping>

그리고 클래스 파일은 Serializable 인터페이스를 구현해야 한답니다....

package model;

import java.io.Serializable;

public class Code implements Serializable {

    private static final long serialVersionUID = -14882784587978705L;
 
    private String code; // PK1
    private String lang; // PK2
    private String codeDesc;

    // getter, setter
}

반응형

'Framework > Hibernate' 카테고리의 다른 글

Reverse Engineering  (0) 2009.12.24
Hibernate 시작하기  (0) 2009.12.23
Criteria 사용하여 질의 하기 #2  (1) 2009.10.03
Criteria 사용하여 질의 하기 #1  (4) 2009.09.10
다대다(n:m) 관계 설정하기  (0) 2009.09.02
일대다(1:n) 관계 설정하기  (1) 2009.08.31
일대일(1:1) 관계 설정하기  (0) 2009.08.27
하이버네이트(Hibernate) 사용하기  (6) 2009.08.24
//

Reverse Engineering

Posted at 2009. 12. 24. 09:57 | Posted in Framework/Hibernate
반응형


이미 만들어져 있는 데이터베이스의 테이블을 이용해 java 파일과 매핑 xml 파일을 생성시켜봅시다~



일단 http://antop.tistory.com/53 에서 아래 3단계까지는 하셔야 합니다 ㅎㅎ

- 하이버네이트 플러그인 설치
- 하이버네이트 라이브러리 세팅
- 하이버네이트 기본 설정파일 작성

설정파일(hibernate.cfg.xml)까지 만들었으면

File - New - Other... - Hibernate - Hibernate Console Configuration - Next




하이버네이트 콘솔 정보는 hibernate.cfg.xml 설정 파일을 사용합니다.




하이버네이트 콘솔이 뭐냐... 하면 하이버네이트 플러그인을 설치하면 볼 수 있는 Hibernate Perspective 에서 사용하는 데이터베이스 접속 정보 정도로 보면 되겠습니다.

난중에 여기서 HQL 쿼리도 날려보고 여러가지를 할 수 있습니다.


이제 이 콘솔 정보를 기반으로 Reverse Engineering(이하 리버스) 파일을 생성 합니다.

File - New - Other... - Hibernate - Hibernate Reverse Engineering File (reveng.xml) - Next




리버스 파일을 저장 할 폴더 지정 - Next




인제 여기서 console configuration 에서 셀렉트박스를 눌러보면 방금전에 만든 콘솔 정보가 있을 겁니다.

콘솔정보 선택 후 Refresh 클릭하면 DB에 있는 테이블 목록을 받아옵니다.

리버스하고싶은 테이블을 선택 후 Finish




그럼 hibernate.reveng.xml 파일이 열리는데 걍 닫기.


이제 Hibernate Perspective 로 이동합니다.

아래 그림 처럼 [그.. 아이콘] 클릭 후 -_-... "Hibernate Code Generation Configurations..." 클릭




아무것도 없습니다.... "새로 만들기" 버튼 클릭




적당히 이름 정하고, 콘솔정보 선택하시고, 만들어지는 파일들을 저장할 폴더 위치를 지정합니다.

※ 아래 그림의 Name 처럼 하면 이미 있는 이름이라고 안됩니다. 딴거 쓰세요 ㅠ_ㅠ




src 폴더(최상위)를 선택합니다.




package 경로를 지정합니다.

※ 패키지를 지정하면 패키지 폴더도 생성 됩니다.

이제 리버스 엔진 파일 아까 만들었던걸 지정해줍시다.




새로 만들기를 원하냐고 물어보는데 전 이미 만들었으니 "Use existing..." 클릭




파일을 선택합니다.




이제 Exporters 탭으로 이동해서 어떤 파일을 생성할지 선택해줍니다.




Run 클릭...



신나게 파일을 생성하고 있습니다.




파일이 생성되었습니다.

뭐 에러나는 것들도 있네요.. 컴퓨터가 만능은 아니자나여!


반응형
//

Hibernate 시작하기

Posted at 2009. 12. 23. 15:17 | Posted in Framework/Hibernate
반응형
하이버네이트를 시작하기 위한 기본설정을 해봅시다.

Eclipse Galileo
Java 1.6.0_16
Tomcat 6.0.14



http://www.hibernate.org 에서 라이브러리와 플러그인을 다운로드 받습니다.

왼쪽 메뉴에서 'Download' 를 클릭 후 zip 파일을 다운로드 합니다.






하이버네이트 플러그인(Hibernate Tools)은 이클립스 플러그인 설치를 이용해서 합니다.

업데이트 주소는 하이버네이트 홈페이지에서 HIBERNATE Tools 부분에 링크 되어있습니다.



업데이트 주소 : http://download.jboss.org/jbosstools/updates/stable



플러그인이 잘 설치 되었습니다... ㄷㄷ;





이제 하이버네이트를 하기위한 최소한의 라이브러리를 세팅합시다.

다운로드 받은 hibernate-distribution-3.3.2.GA-dist.zip 파일을 압축 해제합니다.

hibernate3.jar 와 lib\required 폴더 안의 *.jar 만 있으면 하이버네이트를 사용할 수 있습니다.

log4j 를 사용하기 위해선 slf4j-log4j12-1.5.10.jarlog4j-1.2.15.jar 가 필요합니다. (설정파일 log4j.properties !!!)

마지막으로 데이터베이스에 맞는 jdbc 드라이버가 필요합니다.





하이버네이트 기본 설정 파일인 hibernate.cfg.xml 을 작성해봅시다. 이클립스 플러그인으로 생성하겠습니다.

File - New - Other... - Hibernate - Hibernate Configuration File (cfg.xml) 선택 - Next




설정파일을 저장할 경로 지정




접속 정보를 입력합니다. - Finish

접속 정보는 http://antop.tistory.com/54 에 있는 샘플 DB 입니다.

※ Database dialect 를 DB 에 알맞게 잘 골라주세요.




src 경로 아래 hibernate.cfg.xml 파일이 생성 되었습니다.

※ 플러그인을 설치하면 하이버네이트 관련 xml 파일의 아이콘이 아래 그림과 같이 표시됩니다.



파일을 열어보면 기본적으로 데이터베이스 접속 정보가 설정되어있습니다.

코드 어시스트(Ctrl + Space)를 이용해(플러그인 있어야함) 다른 설정들도 할 수 있습니다.



하이버네이트 세션(JDBC의 Connection이라고 보면 됨)을 관리해주는 클래스를 사용하도록 합시다.

HibernateUtil 클래스입니다. 하이버네이트 공식 메뉴얼에서 구한 국민 세션 관리 유틸이죠 ㅎㅎ

package util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
   public static final SessionFactory sessionFactory;

   static {
      try {
         // Create the SessionFactory from hibernate.cfg.xml
         sessionFactory = new Configuration().configure().buildSessionFactory();
      } catch (Throwable ex) {
         // Make sure you log the exception, as it might be swallowed
         System.err.println("Initial SessionFactory creation failed." + ex);
         throw new ExceptionInInitializerError(ex);
      }
   }

   public static final ThreadLocal<Session> session = new ThreadLocal<Session>();

   public static Session getCurrentSession() throws HibernateException {
      Session s = session.get();
      // Open a new Session, if this thread has none yet
      if (s == null) {
         s = sessionFactory.openSession();
         // Store it in the ThreadLocal variable
         session.set(s);
      }
      return s;
   }

   public static void closeSession() throws HibernateException {
      Session s = (Session) session.get();
      if (s != null)
         s.close();
      session.set(null);
   }
}


※ 여기까지 하셨으면 하이버네이트를 사용할 최소한의 준비는 끝났습니다.



간단한 테스트 파일을 하나 만들어서 접속 테스트 해봅시다.

다른 이무 작동 없고 접속만 했다가 끊는 소스 입니다.

HibernateUtil 을 이용해서 접속합니다.

package app;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import util.HibernateUtil;

public class Test {
   
   public static void main(String[] args) {

      Session sess = null;
      Transaction tx = null;
  
      try {
         // 세션 열기
         sess = HibernateUtil.getCurrentSession();
         // 트랜잭션 시작
         tx = sess.beginTransaction();
         
         // processing..
   
         tx.commit(); // 커밋
      } catch (HibernateException e) {
         tx.rollback(); // 롤백
         e.printStackTrace();
      } finally {
         // 세션 닫기
         HibernateUtil.closeSession();
      }
    
   }
}

에러 안뿜어내고 로그 나오면 잘 된겁니다. ㄷㄷ;;


반응형
//

하이버네이트(Hibernate) 사용하기

Posted at 2009. 8. 24. 17:09 | Posted in Framework/Hibernate
반응형

Hibernate는 객체 모델링(Object Oriented Modeling)과 관계형 데이터 모델링(Relational Data Modeling) 사이의 불일치를 해결해 주는 ORM(Object Relation Mapping) 도구입니다.

Hiberbate Architecture


잘 사용하면 쿼리(sql) 하나 안쓰고 클래스의 set, get 같은것으로만 DB를 조종(?)할 수 있습니다.

하이버네이트를 이용하여 아주 간단한 CRUD[각주:1] 만 해봅시다!

Java 1.6.0_13
Hibernate 3.3.2.GA
Apache Tomcat 6.0.18
HSQLDB 1.9.0 rc4
Eclipse 3.5 + Habernate Tools


- 하이버네이트 라이브러리와 log4j 사용을 위한 properties 파일을 세팅합니다.(아래 war 파일에서 확인해주세요)


- 하이버네이트 실행에 관련된 속성 정보를 가지고 있는 hibernate.cfg.xml 파일을 만듭니다.




- hibernate.cfg.xml 파일을 저장할 위치를 설정합니다. (기본 src)



- Database 정보를 입력합니다.



- hibernate.cfg.xml 파일을 열어서 몇가지를 더 추가해줍니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
      <property name="hibernate.connection.url">jdbc:hsqldb:hsql/antop</property>
      <property name="hibernate.connection.username">sa</property>
      <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>

      <!-- JDBC connection pool (use the built-in) -->
      <property name="connection.pool_size">1</property>

      <!-- For a HSQL 1.8 in-memory database, this is required -->
      <property name="connection.shutdown">true</property>
        
      <!-- Drop and re-create the database schema on startup -->
      <property name="hbm2ddl.auto">create</property>

      <!-- Echo all executed SQL to stdout -->
      <property name="show_sql">true</property>
  
      <!-- Mapping -->

   </session-factory>
</hibernate-configuration>

show_sql 프로퍼티를 true로 하면 콘솔에서 쿼리를 확인할 수 있습니다.
hbm2ddl.auto 프로퍼티는 hbm.xml 이 바뀌면 디비 테이블을 드랍시키고 다시 생성하니 주의하세요!

- 간단한 고객테이블(customer)를 매핑시켜보겠습니다. (각 컬럼의 속성은 다를겁니다... MySQL 툴로 디자인한거라...)



- Customer 클래스를 작성합니다.
package com.tistory.antop;

public class Customer {
   private int seq;
   private String id;
   private String password;
   private String name;

   public Customer() { }

   public int getSeq() {
      return seq;
   }

   // 자동으로 생성되는 번호이므로 set 금지
   private void setSeq(int seq) {
      this.seq = seq;
   }
   // getter, setter, toString()
}


customer 테이블의 seq 칼럼은 자동증가이므로 클래스에서 setter를 private으로 선언한 것을 볼 수 있습니다. +_+/


- Customer 클래스에 대해 Mapping XML 파일을 작성합니다.

해당 클래스파일(.java)에서 마우스 오른쪽버튼 클릭 → New → Other...




이렇게 파일을 만들면 쵸큼 더 쉽게 작성할 수 있습니다.

Customer.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.tistory.antop">
   <class name="Customer" table="customer">
      <!-- 기본키가 되는 필드 -->
      <id name="seq" column="SEQ">
         <!-- 자동 증가 -->
         <generator class="increment" />
      </id>
      <property name="id" column="ID" />
      <property name="password" column="PWD" />
      <property name="name" column="NAME" />
   </class>
</hibernate-mapping>

각 태그에 대한 성명은 여기를 봐주세요.


- 마지막으로 hibernate.cfg.xml 에다가 Customer.hbm.xml을 추가해줘야합니다.
...
<hibernate-configuration>
   ...

      <!-- Mapping -->
      <mapping resource="com/tistory/antop/Customer.hbm.xml"/>
  
   </session-factory>
</hibernate-configuration>


- 간단하게 customer에 관한 예제를 만들어보았습니다. 배보다 배꼽이 더 크군염 ㅠ_ㅠ



테스트는 용자만 할 수 있습니다.! +_+/




참조 사이트
http://docs.jboss.org/hibernate/stable/core/reference/en/html/
http://dev.anyframejava.org/anyframe/doc/core/3.1.0/corefw/guide/hibernate-introduction.html
http://javacan.tistory.com/entry/101


참조 문서

출처: http://cafe.naver.com/deve.cafe (문제가 된다면 삭제하겠습니다. ㅠ_ㅠ)



  1. CRUD : Create, Retrieve, Update, Delete [본문으로]
반응형

'Framework > Hibernate' 카테고리의 다른 글

PK 두개 이상시 매핑  (2) 2009.12.24
Reverse Engineering  (0) 2009.12.24
Hibernate 시작하기  (0) 2009.12.23
Criteria 사용하여 질의 하기 #2  (1) 2009.10.03
Criteria 사용하여 질의 하기 #1  (4) 2009.09.10
다대다(n:m) 관계 설정하기  (0) 2009.09.02
일대다(1:n) 관계 설정하기  (1) 2009.08.31
일대일(1:1) 관계 설정하기  (0) 2009.08.27
//