Hibernate 책 학습

1장 

기본 환경 설정

  - Ant를 이용한 환경 설정

  - Maven-ant task를 이용한 라이브러리 자동 다운로드 

  

2장

1) 자바 클래스와 DB 테이블 사이의 맵핑 문서 작성하기

2) 맵핑 코드를 이용해 자바 객체 클래스 생성 방법

3) 맵핑 코드를 이용해 DB 테이블 스키마 생성 방법

  - hibernate.properties 파일을 이용한 기본 DB접속 설정

  

+ hibernate를 properties 파일을 이용해 설정하는 방법

+ log4j를 properties 파일을 이용해 설정하는 방법

-> 기본적으로 해당 프로그램들이 properties 파일을 클래스패스의 최상의 디렉토리를 검색하기 때문에 클래스패스 최상위에 파일을 넣는다.


+ Ant를 이용한 자바 빌드 방법

+ Ant를 이용한 파일 복사 방법


3장

1) 기본 설정을 hibernate.properties 대신 hibernate.cfg.xml 파일로 대체

  - hibernate.cfg.xml 파일 생성

  - 기존 ant build.xml 파일에 해당 xml 파일 참조하도록 수정

  

2) 자바 객체를 데이터베이스 레코드로 저장하기

3) 데이터베이스 레코드를 자바 객체로 가져오기(1)

  - HQL(하이버네이트의 sQL기반 쿼리언어)를 이용한 데이터베이스 조회

  

4) 데이터베이스 레코드를 자바 객체로 가져오기(2)

  - 네임드 쿼리/네임드 파라미터

  - 자바 소스에서 쿼리 분리 하기(맵핑 XML 파일에 넣기)


4장
1) 테이블 간의 조인 관계를 표현하기 (다 대 다 관계) - 컬렉션(Collection)
  * 다대다 조인 테이블을 하이버네이트에서 자동으로 생성관리함
  * 다른 테이블 데이터는 객체 내에 컬랙션으로 표현되어 추가됨
  - Column에 대한 상세 설정 방법
    -> Index 설정, not null 설정, toString 메소드 설정
    
  - 자바5의 타입세이프티 설정 방법
  
2) 객체에서 컬랙션 데이터 입력하기(연관 테이블에 데이터 입력)
3) 객체에서 컬랙션 데이터 읽어오기(연관 테이블에 데이터 검색)
4) 다대다 관계에 대한 양방향 맵핑 기능 이용(이론)
5) 단순한 조인 관계 표현하기(1 대 다 관계) 
  

5장
1) 느슨한 연관
  - 객체를 실제로 참조하기 전까지 연관된 객체를 로드하지 않는 방식 지원
    -> 하이버네이트 세션이 열려져 있는 상태에서만 작동
2) 순서가 있는 컬렉션 설정 방법

3) 다시 읽어보기!!!

4) 순서있는 연관 컬랙션 삭제에 따른 자동처리
  - 부모 객체와 자식 객체의 종속성 설정
    -> 부모가 삭제되면 자식도 동시에 삭제 가능하도록 설정 가능
    -> 중간에 order관련 값들을 자동으로 변경해줌
  
5) 재귀 연관
  - 트리와 같은 구성
  

6장 사용자 정의 값 맵핑 시키기
: 객체의 하나의 값(property)이 enum 또는 특정 클래스랑 직접 맵핑되어 사용되어 질때
즉 컬럼 하나의 값 또는 두개 이상의 값이 enum 또는 클래스와 맵핑 될 수 있는 방법을 알아본다.

1) 컬럼 값 하나를 enum값과 맵핑 시키기 - UserType
2) 테이블의 여러 컬럼을 클래스와 맵핑 시키기 - 복합사용자타입(CompositeUserType)

- 사용자 정의 값 맵핑은 다음 단계로 개발된다.
  .1-enum 값 또는 클래스 정의하기
  .2-(단일 타입)org.hibernate.usertype.UserType 인터페이스를 구현하는 클래스 작성하기
     (복합 타입)org.hibernate.usertype.CompositeUserType 인터페이스를 구현하는 클래스 작성하기
    -> 구현 클래스는 enum 또는 클래스를 Hibernate에서 어떻게 다룰지 구현
  .3-Class 맵핑 문서(ex:Track.hbm.xml)에 프로퍼티 추가하기
  .4-사용자 정의 클래스 컴파일 하기
  .5-Hibernate Tool을 이용해 코드 생성하기
  .6-모든 소스 컴파일 하기
  .7-Hibernate Tool을 이용해 Schema 생성하기
  
  ** Hibernate Tool이 사용자 정의 클래스를 인식하기 위해선 먼저 사용자 정의 클래스가 컴파일 되어 있어야만 한다.


7장 설정 파일 대신 어노테이션(annotation)을 이용해 설정하기
: 이 경우에는 이전에 만들어 놓았던 legacy 코드가 있을때 이를 어떻게 설정파일 없이
하이버네이트를 적용하는지에 대해 설명 한다. 

- 어노테이션을 이용한 하이버네이트 적용 방법
  .1- annotation 관련 하이버네이트 라이브러리를 얻어온다.
  .2- configuration이 어노테이션을 사용한다고 명시한다.
    -> ant라면 <hibernatetool> 하위에 <configuration> 대신 <annotationconfiguration> 태그를 이용해 config 파일을 지정한다.
  .3- 컴파일 순서를 다음으로 진행 되도록 변경 한다. (스키마를 생성하기 전에 전체 클래스들이 컴파일 되어 있어야 하이버네이트가 클래스를 인식한다.)
      클래스 파일 경로에 xml등 설정 파일 복사 -> 소스코드 컴파일 -> 스키마 생성작업
  .4- hibernate.cfg.xml에 맵핑할 클랙스 목록을 추가한다.
  .5- 맵핑한 클래스에 어노테이션을 추가한다.
  .6- 스키마 생성
  .7- 실행 프로그램에서 config 정보를 읽어오는 클래스를 AnnotationConfiguration 클래스를 사용하도록 변경


8장 크리테리아(Criteria) 쿼리 
: Where 절을 객체의 메소드 호출로 대체 하자. 기존 외부 XML 파일에 쿼리를 빼 놓으면, 쿼리가 실행 되기 전까지 쿼리의 오류를 확인할 수 없는 문제가 발생한다. 이를 해결하기 위해 코드상에 Where 조건을 만들 수 있는 기능을 추가해놓았다. 

- 기본 크리테리아 사용 방법 
  -> 기본 조회
  -> 정렬 
  -> 기본 사용 방법
    .1- Session 에서 createCriteria()를 이용해 criteria 객체 생성
    .2- criteria 객체에 조건 추가
    .3- criteria의 list() 호출

- And / Or 조건 추가하기
  -> OR : Restrictions.disjunction()에 생성되는 객체에 조건 추가
  
- 테이블의 특정 컬럼 값만 얻기
  -> 하나의 컬럼 조회 : hibernate는 String 리스트를 리턴
  -> 여러 컬럼 조회 : 각 컬럼의 타입에 맡는 Object배열 리스트를 리턴
  
- 테이블의 통계 정보 얻기

- 연관 테이블의 조건 걸기
  .1- Session 에서 createCriteria()를 이용해 criteria 객체 생성
  .2- criteria 객체를 이용해 sub criteria 객체 생성하기(생성시 조건을 연결할 연관 클래스를 넘겨줘야됨)
  
- example객체를 이용해 Criteria 객체 생성하기
: criteria를 직접 생성하지 말고, 기존 vo객체를 이용해 검색 하고 싶을때 사용한다.
  .1- VO객체에 검색할 속성 값을 설정해 Example 객체를 생성하기
    ex) VOobj vo = new VOobj();
        vo.setProperty("test");
        Example example = new Example(vo);
  .2- 생성된 example 객체를 critera에 조건으로 추가하기
  
- Criteria 객체 사용할때 조건 추가하는 방법
  .1- Restrictions 팩토리 클래스 이용하기
    ex) criteria.add(Restrictions.le("property", value));
  .2- Property 클래스 이용하기
    ex) criteria.add(Property.forName("property").le(value));
    

9장 HQL 
- HQL 작성방법
- 테이블의 모든 데이터 조회하기
- 프로퍼티와 일부분 선택하기
- HQL을 이용해 정렬 하기
- HQL을 이용해 통계 정보 가져오기
- 네이티브 SQL 이용하기
  -> 기존 쿼리를 Hibernate로 마이그레이션 할때 사용하기 

Posted by 빌리 :

1. Java Message Service(JMS) 소개

Java Message Service(JMS) API는 두개 또는 그 이상의 클라이언트 간에 메세지를 주고 받을 수 있도록 하는 Java Message Oriented Middleware(MOM) API 이다. 


JMS는 Java Platform, Enterprise Edition의 한 부분이며, Java Enterprise Edition(JEE) 기반의 애플리캐이션 컴퍼넌트들 간의 메세지를 생성하고, 전송하고, 전송받고, 읽는 기능을 사용할 수 있게 한다. 분산 처리 시스템에서 다른 컴포넌트 간의 느슨한 결합(Loosely coupled)과 신뢰성있으며, 그리고 비동기적으로 통신할 수 있게 해준다.


메세지 서비스를 제공하는 MOM 시스템에 JMS API를 이용해 접근할 수 있으며, 이를 통해 컴퍼넌트간에 통신을 할 수 있게 만들 수 있는 것이다. 즉, 소프트웨어 애플리케이션 또는 소프트웨어 컴포넌트들 간의 통신 방법을 정의해 놓은 것이다.


Component <-> JMS <-> Component


JMS는 서로 연결된 다양한 컴포넌트 사이에서 다른 컴포넌트가 갖고 있는 자원을 사용할 수도 있고, 네트워크가 연결되지 않은 상태에서도 메세지를 이용하여 필요한 업무를 요청할 수 있다.

2. JMS 사용시 고려 사항

어떤 상황에서 JMS를 사용할 수 있을까? 다음 상황을 고려해 보자.


- 다른 컴포넌트의 인터페이스 정보에 의존하지 않고 컴포넌트가 쉽게 변경되는 서비스를 원할 때

-> RMI와 같은 서비스를 이용해 컴포넌트끼리 통신하려면 인터페이스 정보를 알아야 한다. 또한 인터페이스가 변경 되면 모두 재컴파일 해야 하는 문제가 있다.

- 동시에 모든 애플리케이션이 작동하고 있는 상황에서 특정 애플리케이션이 작동하기를 원할 때

-> 특정 애플리케이션에게만 통신을 하려고 할때이다.

- 애플리케이션 비즈니스 모델을 사용하는 컴포넌트가 다른 곳으로 정보를 전달하고, 바로 응답을 받지 않은 상태에서도 계속 작동하는 것을 원할 때

-> 메소드를 이용해 다른 컴포넌트를 호출하면 반환값을 확인할 때까지 멈춰 있어야만 하는데, 다른 컴포넌트에 메세지만 보내고, 처리 상황에 대해 알지 않아도 될때를 말한다.


3. 구성 요소

- JMS provider

Message Oriented Middleware(MOM)을 위한 JMS 인터페이스 구현체이다. JAVS JMS 구현체 또는 non-java MOM을 구현하고 있다.

- JMS client

- JMS producer/publisher

- JMS consumer/subscriber

- JMS message

- JMS queue

- JMS topic

여러 구독자들(subscribers)에게 메세지를 전달할 수 있는 분산 메카니즘

4. Models

- Point-to-point model

메세지를 지정된 큐(Queue)로 전달하고 큐로부터 메세지를 전달받는 형식이다. 각각의 메세지는 오직 하나의 소비자(consumer)에게 전달된다. 


- Publish/subscribe model

메세지를 지정된 토픽(Topic)으로 전달하고 해당 토픽을 구독하고 있는 독자들에게 메세지가 전달받는 형식이다. 토픽인 큐처럼 클라이언트 에게서 메세지를 전달받으면 가지고 있다가 다른 여러 클라이언트에게 메세지를 전달할 수 있다. 


이 모델은 여러 게시판이 있고, 그 게시판에 글을 쓰면 다양한 사람이 글을 읽을 수 있는 게시판 구조랑 비슷하다. 각각의 게시판은 토픽(Topic)이 되고 게시글들은 메세지(message)가 된다.

-> JMS api는 각 모델에 상관없이 메시지를 보낸 쪽과 받는 쪽에서 모두 같은 코드를 사용할 수 있도록 공통 인터페이스를 가지고 있다.


5. JMS Object

- Administered Object

1) Connection Factory

클라이언트가 JMS 서비스에 연결하기 위한 커넥션을 생성할 때 사용하는 객체

2) Destination

생성된 메세지가 저장되는 저장소로 그리고 메세지가 소비되는 곳으로 사용되는 객체


- Connection

JMS Provider를 이용한 가상의 커넥션을 캡슐화한 객체. 사용하고 나면 close 메소드를 호출해 닫아야 한다. 커넥션은 클라이언트와 Provider 사이에 통신을 하며, 개발자는 커낵션을 이용해 세션(Session)을 생성할 수 있다.

- Session

메세지를 생성하고 소비하는 단일 스레드 단위이며, 트랜젝션 기능을 제공한다.


- Message Producer

목적지에 메시지를 전달하는 역할을 하는 객체로, 세션 객체를 통해 생성한다.

- Message Consumer

목적지에 전달된 메시지를 전달받는 역할을 하는 객체로, 메세지 생산자(Message producer)와 같이 세션 객체를 통해 생성한다.

1) Message Listener

이벤트 핸들러로 비동기식으로 메시지를 전달 받을 때 사용하는 객체로, 메세지 소비자(Message Consumer)에 등록해서 메세지가 전송됐을 때만 처리할 수 있게 해준다.

2) Message Selector

전달 받은 메세지를 필터링 할 필요가 있을때 사용하는 객체로, 메세지 소비자를 생성할때 매개 변수로 메세지 셀렉터를 지정하여 사용한다. 셀렉터를 사용하면 메세지의 헤더(Header)와 프로퍼티(Property)가 일치하는 메세지만 전달 받을 수 있다.


- Message

다른 클라이언트에서 메세지를 보내고, 받아 사용할 수 있도록 사용하는 객체로, non-java MOM에서도 사용할 수 있는 구조를 가지고 있다. 메세지는 헤더, 프로퍼티, 보디로 구성되며, 헤더는 필수로 지정되어야 한다.

1) Message Header

JMS클라이언트와 JMS 제공자(Provider)가 메세지를 확인하고 전달하기 위해 사용하는 값을 가지고 있다.

2) Message Property

헤더에서 제공하는 정보 외에 추가로 필요한 정보가 있을때 사용한다.

3) Message Body

다양한 데이터 타입을 지정해 보낼 때 사용한다. 메시지는 다음 종류가 있다.

-> Text message

-> Map Message

-> Bytes Message

-> Stream Message

-> Object Message


-Exception Handling


6. 예제

-> 추후 작성 


7. 글쓴이 요약

JMS API는 MOM 서비스(Message를 저장하고 보내주는 서비스)에 연결하는 도구이며, 실제 JMS를 쓰기 위해서는 MOM이 시스템 JDNI에 등록되어 있어야 하고, 이를 검색해서 JMS API를 이용해 컴포넌트 간에 메세지를 보내고, 받을 수 있는 식이다.

현재 프로젝트에서 쓰고 있는 예를 보니 이메일 알림 기능을 JMS를 이용해 구현해 사용하고 있다. MOM의 경우 Active MQ를 사용하고, MOM을 스프링 프레임웍에 접근이 가능하도록 등록 한후 내부적으로 JMS API를 메세지를 처리하는 방식으로 사용하고 있다.


8. Reference

Java Message Service
http://en.wikipedia.org/wiki/Java_Message_Service

Java Message Service Tutorial
http://docs.oracle.com/javaee/1.3/jms/tutorial/index.html


9. 별첨

Message-oriented middleware(MOM)은 분산 시스템 사이에 메시지를 보내거나 받을 수 있는 소프트웨어 또는 하드웨어이다.

예를 들어 특정 서비스를 제공하는 소프트웨어가 여러 플랫폼을 개발되었다고 하자. 하나는 안드로이드 어플리케이션(Java), 또 하나는 iOS(Object C) 어플리케이션이다. 그리고 서버는 C언어를 이용해 개발 되었다면, 각각의 어플리케이션은 서버와 통신을 해야만 한다. 이때 서로 통신하기 위해 사용하는 것중에 하나가 MOM인 것이다. 

MOM 프로그램에는 다음과 같은 종류가 있다. 

- SAP Process Integration ESB

- Apache ActiveMQ

- BEA Weblogic (part of the Fusion Middleware suite) and Oracle AQ from Oracle

- EMS from TIBCO

- FFMQ, GNU LGPL licensed

- JBoss Messaging and HornetQ from JBoss

- JORAM, from the OW2 Consortium

- Open Message Queue, from Oracle

- OpenJMS, from The OpenJMS Group

- Solace JMS from Solace Systems

- SonicMQ from Progress Software

- StormMQ, using AMQP

- SwiftMQ

- Tervela

- Ultra Messaging from 29 West (acquired by Informatica)

- webMethods from Software AG

- WebSphere Application Server from IBM, which provides an inbuilt default messaging provider known as the Service Integration Bus (SIBus), or which can connect to WebSphere MQ as a JMS provider[5]

- WebSphere MQ (formerly MQSeries) from IBM


'개발자 > Java Enterprise' 카테고리의 다른 글

Plain Old Java Object(POJO)  (0) 2013.05.30
Posted by 빌리 :

Git란

분산형 버전 관리 시스템이다. 기존 중앙 관리형 버전 관리 시스템에서는 서버에서 Snapshot을 Checkout 해 로컬에서 사용하는 방식과 달리, 저장소(repository)를 전부 복제해서 전체 시스템을 하나의 Client처럼 사용한다. 그래서 서버에 문제가 생겼을때, 소스 변경 작업이나 복구가 용이하다는 장점을 가지고 있다.

여담으로 Git가 생긴 이유는 Linux 커널 소스 버전 툴인 BitKeeper가 무료로 사용할 수 없다고 함에 따라 리누스 토발즈가 만든 툴이다.


Git의 지향점

  • 빠른 속도
  • 단순한 구조
  • 비선형적 개발(수 천개의 동시 다발적 브랜치)
  • 완벽한 분산
  • 리눅스 커널과 같은 대형 프로젝트에서도 유용한 구조(속도, 데이터 안전성)

Git의 기초 이론

1. Commit 단위

기존 중앙 관리형 버전 관리 도구에서는 시간의 흐름에 따른 각각 파일들의 변화를 버전으로 만들어 관리했다. 

이에 반해 Git에서는 저장(Commit)시점에 변경된 파일의 집합을 하나의 버전으로 관리한다.

-> 파일의 집합을 하나의 버전으로 관리하는 모습은 Perforce의 Changelist나 또는 ClearCase의 UCM에서 Activity를 사용하는 모습과 흡사하다.


2. 속도

Git는 저장소 전체를 복사해 사용하기 때문에 서버 성능이나 장애 상황에 따라 영향을 받는 중앙 관리형 버전 관리 도구에 비해 속도가 현저히 빠르다. 로컬에 모든 정보를 가지고 직접 실행하다 보니 네트워크를 통해 정보를 교환하는 방식에 비해 빠를 수 밖에 없다. 

물론 Offline시에서도 소스와 관련된 작업 수행이 가능하다.


3. 무결성

모든 데이터를 다루기 전에 해당 파일에 대한 체크섬[각주:1]을 구하고, 그 값을 이용해 데이터를 관리한다. Git에서는 SHA-1 Hash를 이용히 체크섬을 만든다.


4. Repository에 대해 삭제 수정이 없는 데이터 추가

데이터가 Commit 된 이후에는 기존 Repository에 대한 데이터를 삭제/수정이 불가능하다.

-> 아직 이 특징을 어떻게 활용해야 할지 의구심이 든다. 정말 정말 없나? 그건 뒤에 공부하면서 알아가야 겠다.


5. 파일의 세가지 상태

Git 상에서 파일은 Committed, Modified, Staged 상태로 관리된다.

- Committed : 로컬 GIT 데이터 베이스에 안전하게 저장된 상태

- Modified : 현재 수정되어 지고 있는 파일

- Staged : 수정 된 파일을 곧 Commit할 것이라는 표시

이 세가지 상태는 Git 프로젝트 세가지 단계의 연결되어 사용한다. Git 프로젝트 단계는

- Working Directory : 프로젝트의 특정 버전을 Checkout 한 곳 -> 실제 개발 작업이 이루어지는 공간

- Staging Area : Git Directory에 존재 하며 곧  Commit 할 파일으 대한 정보를 저장하는 곳

- Git Directory(Repository) : Git 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳

으로 나뉜다.

그럼 실제 Git를 사용아는 작업과 상태과 맵핑되는 단계를 보면 다음과 같다.

1) Working Directory에서 파일을 수정한다. (Modified  상태)

2) Staging Area에서 파일을 Stage해서 Commit할 Snapshot을 만든다. (Staged 상태)

3) Staging Area에 있는 파일을 Commit해서 Git Directory에 영구적인 Snapshot으로 저장한다. (Committed 상태)

중간에 Staging Area를 사용해서 중간에 거치는 단계를 Git에서 사용하는데, 이를 생략하여 사용할 수도 있다고 한다.


  1. (각주) 체크섬 : 중복 검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법이다. 단순한 체크섬 동작의 예를 들면 다음 단계를 따른다. 0. 4바이트의 데이터가 있다. 0x25, 0x62, 0x3F, 0x52 1. 모든 바이트를 더해 값을 구한다. 0x118 2. 캐리 니블을 버린다. 0x18 3. 0x18의 2의 보수를 구해 체크섬 바이트를 얻는다. 0xE8 4. 원래 데이터에 체크섬 바이트를 추가한다. 모든 합이 0x200이 된다. 5. 캐리니블을 버린다. 0x00 -> 오류가 없다는 의미 [본문으로]

'소프트웨어 공학 > 형상관리' 카테고리의 다른 글

형상관리에 들어 보셨나요?  (0) 2013.10.19
Posted by 빌리 :