JPA에 기반한 비즈니스로직 중심의 S/W 개발
JPA에 기반한 비즈니스로직 중심의 S/W 개발
JPA는 POJO기반의 ORM(Object-Relational Mapping) 프로그래밍을 제공하며, Hibernate와 유사한 ORM 솔루션이다.
JPA는 Java Persistence API로 풀 어 쓸 수 있으며, Persistence는 영속성 혹은 지속성이라고 표현할 수 있는데, 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 영속성은 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현할 수 있으며, 영속성을 갖지 안는 데이터는 단지 휘발성으로 메모리에만 존재하게 된다.
JPA의 환경설정은 '/META-INF/persistence.xml'에 할 수 있다.
JPA 필요성
ORM 맵핑에 대한 표준쿼리의 필요성
DB Engine 마다 SQL 문법이 조금씩 상이한 경우가 있다. 예를들어 MySQL은 VARCHAR, Oracle은 VARCHAR2이다. 함수도 다르다.
SQL표준 : SUBSTRING
ORACLE : SUBSTR
표준이 있지만, 표준을 지키지 않는 SQL이 있는 것이다. 이러한 문제 해결을 위해, 표준을 지키지 않는 SQL을 맵핑을 대리할 수 있는 JPA와 같은 기술이 필요하다.
SQL 의존성을 배제하고, 비즈니스 로직에 집중
개발을 진행할때 테이블을 설계하고 SQL을 작성한다. 비즈니스로직은, SQL에 따라 의존하게 된다. 비즈니스로직이 SQL에 의존관계를 가질 수록 비즈니스로직에 집중할 수 없게 된다. 반면, JPA와 같은 ORM을 이용하면, 쿼리 자체를 신경쓰지 않고, 객체지향 관점으로 비즈니스 로직에 신경쓸 수 있다.
JPA의 특징
위의 필요성에 따라, JPA 장점을 다시 생각해 보면 다음과 같이 정리할 수 있다.
- POJO기반의 단순한 Persistence 모델이다.
- 로직을 쿼리에 집중하기보다, 객체자체에 집중할 수 있다.
- JPA를 잘 이해하고 있는 경우 테이블 생성 변경 관리가 쉽다.
JPA의 단점도 분명히 존재한다.
- 잘못쓰면 성능상 문제가 있을 수 있다.
- 러닝커브가 있다.
JPA가 관리할 객체는 엔티티(class)이며 아래와 같이 정의할 수 있다.
@Entity
public class Member{
@Id
private Long id;
private String name;
}
}
Persistence가 persistence.xml을 조회하고, Entity Manager Factory를 생성한다. 이때 EMF는 하나만 생성해서 애플리케이션 전체에서 공유하도록 한다. EMF는 다시 Entity Manager를 생성하는데, Entity Manager는 쓰레드간 공유하지 않고 버린다. 이후 CRUD를 처리할 수 있다.
Entity Manager Factory 설정
Entity Manager 설정
Transaction
CRUD
JPA 사용방법
JPA는 Annotation 기반으로 DB 테이블과 관계에 해당되는 것들을 정의할 수 있다. 지원 Annotation으로 대표적인 것은 다음과 같은 것이 있다.
- Logical annotation
- @id - Primary Key에 해당하는 ID필드임을 표시한다.
- @GeneratedValue - DB에 의해서 값이 자동으로 생성되는 필드임을 표시한다.
- Physical annotation
- @Table - Table mapping
- Relationships Annotation
- @OneToMany - 1:N 관계를 표현하기 위한 필드임을 표시한다.
- @ManyToOne - N:1 관계를 표현하기 위한 필드임을 표시한다.
- @ManyTOMany - M:N 관계를 표현하기 위한 필드임을 표시한다.
- @JoinTable - 관계를 표현할 때 어떤 테이블을 사용할 것인지에 대해 표시한다.
EntityManager
DB에서 엔티티에 대한 생성, 삭제를 하는 것은 EntityManager API를 통해 이루어진다.
JPA 클래스 관계도
JPQL(Java Persistence Query Language)
JPQL이 필요한 이유는 모든 데이터를 객체로 변환해서 검색하는 것을 불가능하기 때문이다. 이러한 경우 SQL이 필요하다. JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공하고 있다. JPQL의 특이한 점은 JPQL은 엔티티 객체를 대상으로 쿼리를 한다는 것이다.
출처: https://happygrammer.tistory.com/80 [happygrammer]
'Java 관련 > JPA' 카테고리의 다른 글
JPA - 하이버네이트와 스프링 연동 (0) | 2021.11.17 |
---|---|
JPA - JPQL과 Criteria 쿼리 (0) | 2021.11.17 |
JPA - 엔티티 매핑 (0) | 2021.11.17 |
JPA - 엔티티 매니저와 트랜잭션 (0) | 2021.11.17 |
JPA 요소 (0) | 2021.10.05 |
[JPA] Entity 객체 생명주기(Lifecycle)와 Persistence Context (0) | 2020.09.07 |
[JPA] @ManyToMany, N:M 관계 매핑 (0) | 2020.09.07 |
[JPA] @OneToMany / @ManyToOne, 1:N / N:1 관계 매핑 (0) | 2020.09.07 |