본문 바로가기
Language/Java

JPA 정의(Java Persistence API) / JPA 사용이유 / JPA 장단점

by 나비와꽃기린 2021. 5. 21.

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); //데이터삭제

댓글0