[Spring] JPA (2)

2020. 8. 12. 21:57Spring/Spring

1. JPA

1) 영속성 유닛 (Persistence Unit)

대부분 프레임워크는 XML 파일로 환경 설정을 처리한다. JPA도 VO 객체와 매핑하기 위해 설정 정보를 persistence.xml 파일로 설정한다.

 

영속성 유닛은 연동할 데이터베이스당 하나씩 등록한다. EntityManager 객체는 EntityManagerFactory의 객체가 있어야 생성이 되는데, 영속성 유닛은 EnitityManagerFactory를 생성할 때 필요하다.

2) 엔티티 클래스

영속성 유닛 설정에서 가장 먼저 엔티티 클래스를 등록할 때, JPA 프로젝트에서 JPA Entity 클래스를 작성하는 순간 자동으로 persistence.xml 파일에 등록된다.

3) 영속성 유닛 프로퍼티

영속성 관리에 필요한 프로퍼티 설정에는 데이터베이스 연동 설정을 처리한다. 하지만 스프링 프레임워크와 연동시 데이터 소스가 스플이 설정 파일에 등록되어있기에 영속성 유닛 설정에는 제거가 될 수 있다.

4) Dialect 클래스 설정

ORM 프레임워크의 장점은 SQL 구문을 자동으로 생성한다는 점이다. 하지만 DBMS에 따라 키 생성 방식이나 지원되는 함수도 다르기 때문에 직접 적절하게 수정해야한다. 따라서 JPA는 특정 DBMS마다 다른 Dialect 클래스를 제공한다. 결국, DBMS가 변경될 때 Dialect 클래스마나 변경하면 SQL이 자동으로 변경되어 생성된다. 지금까지 H2 데이터베이스를 사용했기 때문에 H2Dialect 클래스를 등록한다.

5) JPA 구현체 관련 속성 설정

하이버네이트 관련 속성을 설정하는 이유는 사용한 JPA 구현체가 하이버네이트 프레임워크이기 때문에 사용한다.

속성 설명
hibernate.show_sql 생성된 SQL을 출력한다.
hibernate.format_sql SQL 출력 시 일정한 포맷으로 출력한다.
hibernate.use_sql_comments SQL 출력 시 주석도 함께 출력한다.
hibernate.id.new_generator_mappings JPA 표준에 맞는 새로운 키 생성 전략을 사용한다.
hibernate.hbm2ddl.auto 테이블 생성이나 수정, 삭제 같은 DDL 구문을 자동으로 처리할지 지정한다.

hibernate.hbm2ddl.auto 설정으로는 속성값으로 다양한 것들을 사용할 수 있다.

속성값 설명
create 애플리케이션 실행 시, 기존 테이블을 삭제하고 엔티티 클래스에 설정된 매핑 설정을 참조하여 새로운 테이블을 생성한다. (DROP - CREATE)
create-drop create와 동일하짐나 애플리케이션이 종료되기 직전에 생성된 테이블을 삭제한다. (DROP - CREATE - DROP)
update 기존에 사용 중인 테이블이 있을 경우 새 테이블을 생성하지 않고 재사용한다. 만약 엔티티 클래스 매핑 설정이 변경될 경우 변경된 내용만 적용된다. (ALTER)

 

 

 

2. 어노테이션

1) @Entity

@Entity는 특정 클래스를 JPA가 관리한느 엔티티 클래스로 인식하도록 하는 어노테이션이며 이 클래스를 JPA가 엔티티 클래스로 인식하여 테이블과 자동 매핑 처리한다.

2) @Id

매핑되는 테이블은 식별하기 위한 기본 키를 가지고 있어야한다. 이런 변수를 식별자 필드라고 하며 @Id를 이용하여 선언한다.

3) @Table

@Table 어노테이션은 Board 클래스와 BOARD 테이블을 매핑하기 위해 사용한다. 별도로 이름을 지정하지 않을 경우 자동으로 클래스 이름과 같은 이름의 테이블이 자동으로 매핑된다. @Table은 다양한 속성을 가질 수 있다.

속성 설명
name 매핑될 테이블 이름을 지정한다.
catalog 데이터베이스 카탈로그를 지정한다.
schema 데이터베이스 스키마를 지정한다.
uniqueConstraints 결합 unique 제약조건을 지정하여 여러 개의 칼럼이 결합되어 유일성을 보장해야하는 겨웅 사용한다.

4) @Column

엔티티 클래스의 변수와 테이블의 칼럼을 매핑할 때 사용한다. 일반적으로 엔티티 클래스의 변수명과 칼럼명이 다를 때 사용하고 생략 시 기본으로 변수 이름과 칼럼 이름을 동일하게 매핑한다.

 

다양한 속성중 일반적으로 이름 지정에 사용하는 name과 Null 데이터 입력을 방지하는 nullable만 사용한다.

속성 설명
name 컬럼명을 지정한다. 생략 시 프로퍼티명과 동일하게 매핑된다.
unique unique 제약조건을 추가한다.
nullable null 상태 허용 여부를 설정한다.
insertable 입력 SQL 명령어를 자동으로 생성할 때 이 컬럼을 포함할 것인지 지정한다.
updatable 수정 SQL 명령어를 자동으로 생성하라 때 이 컬럼을 포함할 것인지 지정한다.
columnDefinition 이 컬럼에 대한 DDL 문을 직접 설정한다.
length 문자열 타입의 칼럼 길이를 지정한다. (기본 255)
precision 숫자 타입의 전체 자릿수를 지정한다. (기본 0)
scale 숫자 타입의 소수점 자릿수를 지정한다. (기본 0)

5) @GeneratedValue

@Id로 지정된 식별자 필드에 기본 키값을 생성하여 저장할 때 사용한다.

속성 설명
strategy 자동 생성 유형을 지정한다. (GenerationType 지정)
generator 이미 생성된 Generator 이름을 지정한다.

strategy 속성에는 다양한 속성값을 설정할 수 있는데, 이는 기본 키 값 생성 전략을 지정하는 데 중요하다.

속성값 설명
TABLE Hibernate가 데이터베이스 테이블을 사용하여 기본 키 값을 생성한다.
SEQUENCE Sequence Object를 사용하여 기본 키 값을 생성하며 오라클과 같은 Sequence를 지원하는 데이터베이스에서만 사용이 가능하다.
IDENTITY auto_increment나 IDENTITY를 이용하여 기본 키 값을 생성할 수 있다. 일반적으로 MySQL 데이터베이스에서 사용한다.
AUTO Hibernate가 사용중인 데이터베이스에 맞게 자동으로 기본 키 값을 생성한다.

6) @Transient

엔티티 클래스의 변수는 대부분 테이블의 칼럼과 매핑된다. 하지만 몇몇 변수는 매핑되는 칼럼이 없거나 매핑에서 제외해야하는 경우가 있다. @Transient 어노테이션은 클래스 내의 특정 변수를 영속 필드에서 제외할 때 사용한다. 예를 들어, 지금까지의 데이터베이스에는 searchCondition, searchKeyword, uploadFile에 대한 컬럼이 존재하지 않기 때문에 @Transient로 설정을 통해 매핑 대상에서 제외시켜야 한다.

7) @Temporal

java.util.Date 타입의 날짜 데이터를 매핑할 때 사용한다. TemporalType을 이용하면 출력되는 날짜 형식을 지정할 수 있다.

 

 

 

3. JPA API 구조

1) JPA API 구조

기본적인 매핑 이후 JPA에서 지원하는 API를 이용하여 데이터베이스 연동을 처리할 수 있다. JPA를 이용하여 CRUD 기능을 처리하기 위해 EntityManager 객체를 사용해야한다. 그리고 EntityManager는 EntityManagerFactory로부터 얻어낸다.

 

Persistence 클래스를 이용하여 영속성 유닛 정보가 저장된 JPA 메인 환경 설정 파일을 로딩한다. (persistence.xml) 이 설정 정보를 바탕으로 EntityManagerFactory 객체를 생성하고 EntityManager를 생성한다. 결국 EntityManagerFactory로부터 EntityManager를 얻어서 사용한다.

 

EntityManagerFactory 객체는 persistence.xml 파일의 영속성 유닛 이름으로 생성한다. 그리고 JPA가 자동으로 META-INF 폴더의 persistence.xml 파일을 로딩한다. EntityManager 객체를 얻게 되면 EntityTransaction 객체를 얻어 트랜잭션을 제어할 수 있다.

EntityManager 생성 과정

2) EntityManager CRUD 메서드

메서드 설명
persist(Object entity) 엔티티를 영속화한다. (INSERT)
merge(Object entity) 준영속 상태의 엔티티를 역속화한다. (UPDATE)
remove(Object entity) 영속 상태의 엔티티를 제거한다. (DELETE)
find(Class<T> entityClass, Object primaryKey) 하나의 엔티티를 검색한다. (SELECT ONE)
createQuery(String qlString, Class<T> resultClass JPQL에 해당하는 엔티티 목록을 검색한다. (SELECT LIST)

3) JPA API 사용

API를 실제 사용하는 과정은 트랜잭션을 시작하고 엔티티 클래스로 등록된 Board 객체를 생성하고 글 등록에 필요한 값들을 저장한다. 그리고 테이블과의 매핑을 위해 persist() 메서드로 엔티티 객체를 영속화해야만 INSERT 작업이 처리된다. 글 목록 조회에는 JPQL (Java Persistence Query Language)이라는 JPA 고유 쿼리 구문을 사용해야한다.

 

JPQL 작성 이후 실행 시 하이버네이트 JPA 구현체가 JPQL을 연동되는 DBMS에 맞게 SELECT 명령어를 수행한다. 예외 발생시 롤백을 하도록하고 마지막에는 EntityManager와 EntityManagerFactory를 닫는다.


[참고] 스프링 퀵 스타트

728x90

'Spring > Spring' 카테고리의 다른 글

[Spring] XML 기반 프로젝트 진행 과정  (0) 2020.08.13
[Spring] JPA 스프링 연동  (0) 2020.08.13
[Spring] JPA (1)  (0) 2020.08.12
[Spring] Dynamic SQL 검색 처리  (0) 2020.08.12