JPA 공부할겸 기본동작 구조 샘플링 코드에 대해서 공유합니다. GIT가시면 받을수있어요.
SAMPLE PROJECT URL = https://github.com/chr3125/jpa_test
JPA(JAVA™ PERSISTENCE API)
- Java EE(Java Enterprise Edition) 및 Java SE(Java Standard Edition) 환경 내에서 지속성 및 오브젝트/관계 맵핑 관리를 정의한다.
- 여러 ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM 이던 Entity Bean 을 JPA 라고 변경했다.
ORM(OBJECT RELATIONAL MAPPING)
- 객체와 RDB 사이에 매핑을 정의한 메타데이터를 이용하여 자바 Application 내의 객체를 RDB 의 테이블로 자동으로(그리고 투명하게) 영속화 하는 것이다.
- 영속화(persistence)
- 애플리케이션의 데이터가 애플리케이션의 프로세스보다 더 오래 지속하게끔 하려는 것을 말한다.
- Java 용어로 말하면, 객체의 상태가 JVM 의 범위를 넘어서서 지속하여 추후에 동일한 상태를 이용하려는 것이다.
- http://hibernate.org/orm/what-is-an-orm/
JPA의 장단점
- 장점
- 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.
- 테이블 생성, 변경, 관리가 쉽다. (JPA 를 잘 이해하고 있는 경우)
- 로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.
- 빠른 개발이 가능하다.
- 단점
- 어렵다. 장점을 더 극대화 하기 위해서 알아야 할게 많다.
- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)
- 성능상 문제가 있을 수 있다. (쿼리가 동시에 날라간다.)
JPA 의 구현체
- DataNucleus / EclipseLink / Hibernate / OpenJPA / ObjectDB / TopLink Essentials
- http://www.jpab.org/All/All/All.html
- http://en.wikipedia.org/wiki/Java_Persistence_API
ENTITY
- ORM 서비스를 구성하는 가장 기초적인 클래스이다.
- Application 에서 다루고자 하는 Table 에 대응하여 구성할 수 있다.
- Table 이 포함하는 Column 에 대응한 속성들을 가지고 있다.
- 필요 요건
- Entity annotation
- Argument 없는 생성자
- 최상위 레벨 클래스로 생성되어야 하고, enum / interface로 정의될 수 없음
- final 클래스로 선언될 수 없음
- Primary Key
- Serializable 인터페이스 구현
- 속성 정보 접근을 위한 getter / setter 구현
- 주요 Annotations
- @Entity
- 해당 클래스가 Entity 클래스임을 표시하는 것으로 클래스 선언문 위에 기재한다.
- 테이블명과 Entity 명이 다를 때에는 name 에 해당 테이블명을 기재한다.
- @Id
- 해당 Attribute 가 Key 임을 표시하는 것으로 Attribute 위에 기재한다.
- @Column
- 해당 Attribute 와 매핑되는 컬럼정보를 입력하기 위한 것으로 Attribute 위에 기재한다.
- 컬럼명과 Attribute 명이 일치할 경우에는 기재하지 않아도 된다.
- @OneToOne / @OneToMany / @ManyToOne / @ManyToMany
- 테이블간 관계를 구성하기 위한 것으로 정의되는 Attribute 위에 기재한다.
- 각각 1:1 / 1:N / N:1 / N:N d의 관계를 표현한다.
- @Transient
- 테이블의 컬럼과 매핑되지 않고 쓰이는 Attribute 를 정의하고자 할 때 Attribute 위에 기재한다.
OPERATION
- EntityManager
- Entity 의 Lifecycle 과 persistence context, transaction 을 관리한다.
- insert(persist)
- update(merge)
- EntityManager 의 merge() 메소드를 호출하여 DB 에 단건의 데이터를 수정할 수 있다.
- 특정 객체가 Persistent 상태이고, 동일한 트랜잭션 내에서 해당 객체의 속성 값에 변경이 발생한 경우 merge() 메소드를 직접적으로 호출하지 않아도 트랜잭션 종료 시점에 변경 여부가 체크되어 변경 사항이 DB 에 반영된다.
- delete(remove)
- select(find)
- EntityManagerFactory
- EntityManager 를 생성하기 위한 클래스이다.
- persistence.xml 설정에 기반한다.