JPA (JAVA PERSISTENCE API) 란?
애플리케이션의 데이터를 객체지향 관점으로 바라보고 다룰 수 있게 해주는
자바 진영의 ORM 기술표준인 객체지향 기술
ORM(Object Relational Mapping) = 객체와 관계형 데이터베이스를 매핑해주는 것
SQL 작성없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주는 기술로 애플리케이션과 JDBC 사이에서 동작한다.
JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야 하는데, 현재 JAP를 구현한 ORM 프레임워크는
하이버네이트, EclipseLink, DataNucleus 중 하이버네이트가 가장 대중적이다.
SQL을 직접 다룰 때의 단점
1. 반복적인 CRUD SQL 작성과 객체를 SQL에 매핑하는 코드를 작성하는데 시간이 많이 걸림
2. 객체에 필드를 하나 추가할 때도 DAO의 CRUD 코드와 SQL 대부분을 변경해야 하는 문제가 있음 → 진정한 의미의 계층분할이 아니며 SQL에 매우 의존적인 방법임.
JPA를 사용해야 하는 이유
1. JPA에 객체를 전달만 하면 되므로 SQL을 작성하고 JDBC API를 사용하는 지루하고 반복적인 일을 JAP가 대신 처리해주어 생산성이 향상된다.
2. 필드가 추가하거나 삭제되었다 하더라도 JPA가 일련의 과정을 대신 처리해주므로 수정해야 할 코드가 SQL을 직접 다룰때보다 현저히 줄어든다.
3. 상속, 연관관계, 객체그래프 탐색 등의 패러다임의 불일치 문제를 해결해준다.
4. JPA는 애플리케이션과 데이터베이스 사이에 다양한 성능최적화 기능을 제공한다.
5. 관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많다.
한예로 페이징처리는 데이터베이스마다 달라서 사용법을 배워야 하는데 JPA는 애플리케이션과 데이터베이스 사이에
추상화된 데이터접근 계층을 제공하여 애플리케이션이 특정 데이터베이스 기술에 종속되 않도록 도와준다.
JPA를 사용하면 수 많은 장점이 있지만, JPA는 학습곡선이 높은편에 속한다.
JPA를 사용하려면 객체와 관계형 데이터베이스를 어떻게 매핑하는지 학습한 후에 JPA의 핵심 개념들을 이해해야 하기 때문이다.
JPA의 핵심 개념인 영속성컨텍스트에 대한 이해가 부족하면 SQL을 직접 사용해서 개발하는 것보다 못한 상황이 벌어질 수도 있다.
JPA 어노테이션 종류
JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지를 알아낸다.
엔티티명 | 설명 |
@Entity | 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 해당 어노테이션이 붙은 클래스를 엔티티 클래스라고 한다. |
@Table | 엔티티클래스에 매핑할 테이블정보를 알려준다. 이 이름을 생략하면 클래스이름을 테이블이름으로 매핑한다. |
@Id | 엔티티클래스의 필드를 테이블의 기본키에 매핑한다 |
@Column | 필드를 컬럼에 매핑한다 |
매핑정보가 없는 필드 | 필드명을 사용해서 컬럼명으로 매핑하게 된다. 예를들어 age 라는 필드명에 매핑정보가 없다면 age 컬럼에 매핑되게 된다. 만약 대소문자를 구분하는 데이터베이스를 사용한다면 @Column(name="AGE") 처럼 명시적으로 매핑해야 한다. |
@Transient | 데이타베이스상에 필요없는 속성일 경우, 사용하지 않겠다라고 정의한다. 이렇게 하면 해당 속성은 엔티티 객체에 임시로 값을 담는 용도로 사용할 수 있다. |
@EmbeddedId | 복합키로서 정의된 값을 정의하고자 할 때 사용한다. |
@GeneratedValue | 새로운 레코드가 생성될 때마다 마지막 PK 값에서 자동으로 +1을 해줘야 하는 auto increment 컬럼인것을 알려준다. |
@SequenceGenerator | sequence를 사용하여 호출할때마다 기존 값의 +1이 된 값을 반환해주기 위해 사용한다. @GeneratedValue 어노테이션의 strategy 속성을 GenerationType.SEQUENCE 로 사용해 sequence를 사용하여 PK값을 사용하겠다고 정의할 때 다음과 같이 사용할 수 있다. |
JPA 기본적인 사용 예
JPA를 사용하려면 앤티티 매니저를 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); // 이름이 jpa인 매니저팩토리 생성 EntityManager em = emf.createEntityManager(); //매니저팩토리에서 엔티티매니저를 생성. jpa의 기능 대부분은 이 앤티티 매니저가 제공 //앤티티매니저는 내부에 데이터소스를 유지하면서 db와 통신한다 //앤티티매니저는 db 커넥션과 관계가 있으므로 스레드간 공유하거나 재사용해서는 안된다. |
em.persist(member); //데이터저장 |
String userId = "user1"; Member member = em.find(Member.class , userId); //데이터조회 |
Member member = em.find(Member.class , userId); member.setName("변경할 이름명"); //데이터수정 |
em.remove(member); //데이터삭제 |
'Language > Java' 카테고리의 다른 글
captcha NoClassDefFoundError / No find fonts 캡챠오류 해결방법 (0) | 2020.12.28 |
---|---|
java.io.FileNotFoundException (Permission denied) 해결방법 (0) | 2019.10.07 |
JAVA 파일다운로드 에러 (HTTP response 413 error / Tomcat 파일다운로드 에러) (0) | 2019.07.31 |
Garbage Collection 쉽게 정리! (0) | 2019.06.21 |
no valid entries or contents found this is not a valid ooxml.docx 해결방법 (0) | 2019.02.22 |