본문 바로가기

Java

JPA - ORM components

현대의 어플리케이션은 관계정데이터베이스를 이용해 데이터를 저장한다. 최근데 많은 벤더들은 데이터 관리의 부담을 줄이기 위해 객체형 데이터베이스로 교체한다. 뜻은 객체형 데이터베이스나 객체 관계형 기술이 데이터를 저장, 검색, 수정, 관리를 담당하는 것을 의미한다.


객체관계형 기술의 핵심부는 orm.xml 매핑이다. xml 컴파일이 필요 없기때문에 우리는 쉽개 수정하고 여러 데이터소스로 쉽게 관리할 있다.


Object Relational Mapping


ORM ORM 무엇이고 어떻게 동작하는지 간단히 알려준다. ORM 객체유형에서 관계형으로, 또는 반대로 데이터를 변환할 있는 프로그래밍 기능이다.

ORM 주요 기능은 객체를 데이터베이스 데이터에 매핑하거나 바인딩 하는 것이다.

매핑하는 동안 우리는 데이터의 타입, 셀프엔티티 또는 다른 테이블과의 관계를 고려해야한다.


Advanced Features


관용적 영속성 : 객체 지향 클래스로 영속성 클래스를 작성할 있다.

높은 퍼포먼스 : 많은 페칭 기술과 희망적인 기술이 있다.

신뢰성 : 매우 안정적이고 뛰어나다. 그리고 많은 프로그래머들이 사용하고 있다.


ORM 아키텍쳐를 보라.

아키텍쳐는 객체 데이터를 어떻게 관계형데이터베이스에 저장하는지 세단계로 설명하고있다.


1단계


객체 데이터 단계로 명명된 첫단계는 POJO 클래스, 서비스 인터페이스 클래스를 포함한다. 비지니스 로직 작업 속성을 가진 메인 비지니스 계층이다.

예를들어 직원 데이터베이스 스키마를

  • 직원 POJO클래스는 ID, 이름, 급여, 지점과 같은 속성을 포함한다. 그리고 속성의 getter/setter 가진다.
  • 직원 DAO/서비스 클래스에는 직원 생성, 찾기, 삭제같은 서비스 방법이 포함되어있다.


2단계


두번째 단계는 JPA provider, 매핑파일(ORM.xml) JPA로더 오브젝트 그리드를 포함하는 매핑 또는 영속단계이다.

  • JPA provider : JPA 밴더들이 제공하는 프로덕트, 예를들면 EclipseLink, Toplink, Hibernate 등등이 있다.
  • 매핑 파일 : 매핑파일(ORM.xml) POJO클래스의 데이터와 관계형 데이터베이스의 데이터간의 매핑구성을 포함한다.
  • JPA Loader : JPA loader 캐시메모리처럼 작동하고 관계형 데이터를 불러올 있다. 이것은 POJO 데이터(POJO클래스의 속성과 서비스클래스처럼 상호작용한다. 데이터베이스의 복사본 처럼 작동한다.
  • Object Grid : Object grid 관계형 데이터의 복사본을 저장할 있는 임시 위치이다.(ex : 캐시메모리). 데이터베이스에 대한 모든 쿼리는 Object grid 데이터에 영향을 준다. 커밋 후에야 메인 데이터베이스에 영향을 준다.


3단계


세번째 단계는 관계형 데이터 단계이다.

단계는 비지니스 컴포넌트에 논리적으로 연결된 관계형 데이터를 포함한다.

위에서 설명한것처럼 비지니스 컴포넌트가 데이터를 커밋한 경우에만 데이터베이스에 물리적으로 저장된다. 그때까지 수정된 데이터는 그리드 포맷으로 캐시메모리에 저장된다. 이것은 동일한 데이터를 얻기 위한 프로세스이다.


세단계의 프로그래밍 상호작용 매커니즘을 객체 관계 매핑이라고 한다.


Mapping.xml

mapping.xml파일은 JPA 밴더가 엔티티 클래스와 데이터베이스 테이블을 매핑하도록 지시한다.


네가지 속성을 포함하는 Employee 엔티티의 예를 들어보자.

Employee.java라는 Employee엔티티는 다음과 같다.


public class Employee {

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }
   
   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }
}

코드는 Employee 엔티티 POJO클래스이다. 여기엔 4가지 속성 did, name, salary, deg 있다. 속성들은 데이터베이스의 필드이고, eid 테이블의 Primary key이다.

이제 우리는 POJO 맞춰 하이버네이트 매핑파일을 디자인해야한다.

매핑파일 이름은 mapping.xml이다.

<? xml version="1.0" encoding="UTF-8" ?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
   version="1.0">
      
   <description> XML Mapping file</description>
      
   <entity class="Employee">        
      <table name="EMPLOYEETABLE"/>
      <attributes>
      
         <id name="eid">
            <generated-value strategy="TABLE"/>
         </id>

         <basic name="ename">
            <column name="EMP_NAME" length="100"/>
         </basic>
         
         <basic name="salary">
         </basic>
         
         <basic name="deg">
         </basic>
         
      </attributes>
   </entity>
   
</entity-mappings>

엔티티클래스와 데이터베이스 테이블을 매핑하기 위한 스크립트이다.

파일에

Entity-mappings : 태그는 엔티티 태그를 xml파일로 허용하는 스키마를 정의한다.

Description : 어플리케이션의 설명을 정의한다.

Entity : 데이터베이스의 테이블로 변환하려는 엔티티 클래스를 정의한다. 속성클래스는 POJO 엔티티 클래스이름을 정의한다.

Table : 테이블 이름을 정의한다. 클래스 이름을 테이블 이름으로 설정하면 태그는 필요하지않다.

Attributes : 속성(테이블의 필드) 정의한다.

Id : 테이블의 기본기를 정의한다. <generated-value> Automatic, Manual 또는 sequence처럼 기본키 할당방법을 정의한다.

Basic : 테이블의 나머지속성(기본키를 제외한) 정의하는데 사용한다.

Column-name : 유저가 정의한 테이블 필드 이름을 정의하는데 사용한다.


Annotation

일반적으로 xml파일은 특정 컴포넌트를 구성하거나 두개의 다른 컴포넌트를 매칭하는데 사용한다.

우리같은 경우에는 프레임워크와 분리하여 xml 관리해야한다. 이것은 xml파일을 쓰는 동안 POJO클래스의 속성과 mapping.xml 엔티티 태그와 비교해야한다는 뜻이다.

여기 해결책이 있다. 클래스에서 어노테이션을 사용하여 구성요소를 정의할 있다. 어노테이션들은 클래스, 속성, 메소드에 사용된다. 어노테이션은 ‘@‘기호로 시작한다.

어노테이션은 클래스, 속성 혹은 메소드가 선언되기 전에 선언된다. 모든 JPA어노테이션은 javax.persistence패키지에 정의된다.


다음은 예제에서 사용된 어노테이션 목록입니다.

Entity : 클래스를 엔티티 또는 테이블로 선언하도록 지정.

Table : 테이블 이름을 선언.

Basic : 비제약필드를 명시적으로 지정

Embedded : 클래스의 속성 혹은 임베디드 클래스 인스턴스의 값을 가진 엔티티를 지정.

Id : 클래스의 ID(테이블의 기본키) 사용되는 속성을 지정.

GeneratedValue : 자동, 수동 또는 스퀀스 테이블에서 가져온 값과 같이 ID속성을 초기화 하는 방법을 지정.

Transient : 영속성이 없는 속성. 데이터베이스에 저장되지 않는 속성을 지정.

Column : 영속성이 있는 속성 혹은 컬럼을 지정.

SequeneceGenerator : @GeneratedValue 어노테이션에 지정된 속성값을 정의하는데 사용한다.  시퀀스를 만든다.

TableGenerator : @GeneratedValue 어노테이션에 지정된 속성값을 정의하는데 사용한다. 값을 generation하기 위해 테이블을 만든다.

AccessType : 엑세스 유형을 설정하는데 사용된다. ???, ???

JoinColumn : 엔티티의 관계 혹은 엔티티 콜렉션을 지정한다. many-to-one 혹은 one-to-many 사용된다.

UniqueConstraint : 기본테이블 혹은 보조테이블의 필드에 고유제한조건을 지정한다.

ColumnResult : select 절을 사용하여 SQL 쿼리에서 이름을 참조한다.

ManyToMany : 조인테이블 간의 다대다관계를 정의한다.

ManyToOne : 조인테이블 간의 다대일관계를 정의한다.

OneToMany : 조인테이블 간의 일대다관계를 정의한다.
OneToOne :
조인테이블 간의 일대일 관계를 정의한다.

NamedQueries : 명명된 쿼리 목록을 지정한다.

NamedQuery : 이름을 사용하여 쿼리를 지정한다.


Java Bean 표준

자바 클래스는 인스턴스값과 행동을 단일유닛이라고 불리는 객체로 캡슐화한다.

자바 빈은 임시저장역역이고 재사용가능한 컴포넌트 혹은 객체이다. 이것은 인스턴스의 속성을 개별적으로 초기화하는 기본 생성자와 getter, setter 메소드가 있는 직렬화가 가능한 클래스이다.


규칙

  • 빈은 기본 생성자 또는 직렬화된 인스턴스를 포함하는 파일을 포함한다. 따라서 빈은 빈을 인스턴스화 있다.
  • 빈의 속성은 Boolean Non-Boolean속성으로 분리 있다.
  • Non-Boolean속성은 getter setter메소드를 포함한다.
  • Boolean속성은 setter is메소드를 포함한다.
  • 어떤 속성의 Getter 메소드는 소문자 get(자바 메소드 규칙)으로 시작하고 대문자로 시작하는 필드이름이 따라와야한다.(ex. 속성이름이 salary getSalary()).
  • 어떤 속성의 Setter 메소드는 소문자 set(자바 메소드 규칙)으로 시작하고 대문자로 시작하는 필드이름이 따라와야하며 필드로 설정하는 인수값이 있어야 한다.(ex. setSalary(double sal)).
  • Boolean속성인 경우 is메소드는 true인지 false인지 확인하는 메소드이다. (ex. isEmpty())



원문https://www.tutorialspoint.com/jpa/jpa_orm_components.htm

(오역이 있을수 있으니 발견 댓글달아주세요!)


'Java' 카테고리의 다른 글

JPA - 소개  (0) 2017.11.01
JPA - ORM 튜토리얼  (0) 2017.11.01
java8 functionalInterface Function  (5) 2017.01.10
Lambda Expression, 람다 예제  (0) 2017.01.05
String StringBuffer StringBuilder 차이  (2) 2016.12.27