객체 매핑 시작

inho ha·2022년 5월 9일
0
post-thumbnail

자바 ORM 표준 JPA 프로그래밍

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330

@Entity

엔티티 클래스에 붙인다.
해당 클래스를 테이블과 매핑한다고 JPA에 알려준다.

@Table

매핑할 테이블 정보를 알려준다
생략하면 클래스 이름을 테이블 이름으로 매핑한다.

@Id

엔티티 클래스의 필드를 테이블의 pk에 매핑한다.
@Id가 사용된 필드를 식별자 필드라 한다.

@Column

필드를 컬럼에 매핑한다.
생략하면 필드명을 사용해서 컬럼명으로 매핑한다.

persistence.xml

JPA의 필요한 설정 정보를 관리하는 파일이다.
META_INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.

JPA 표준 속성 설정
javax.persistence.jdbc.driver : JDBC 드라이버
javax.persistence.jdbc.user : 데이터베이스 접속 아이디
javax.persistence.jdbc.password : 데이터베이스 접속 비밀번호
javax.persistence.jdbc.url : 데이터베이스 접속 url

하이버네이트 속성 설정
hibernate.dialect: 데이터베이스 dialect
hibernate.show_sql
하이버네이트가 실행한 SQL을 출력하게 하는 설정
hibernate.format_sql
하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬하는 설정
hibernate.id.new_generator_mapping
JPA 표준에 맞춘 새로운 키 생성 전략을 사용한다.

javax.persistence 로 시작하는 속성은 JPA 표준 속성이라 특정 구현체에 종속되지 않는다.
hibernate 로 시작하는 속성은 하이버네이트에 종속된다.

데이터베이스 dialect

JPA는 데이터베이스에 종속적이지 않고 dialect 만 다른 데이터베이스로 수정하면 데이터베이스를 쉽게 교체할 수 있다.

각 데이터베이스마다 함수명이 다르다거나, 데이터 타입이 다르다거나, 페이징 처리가 다를수 있는데
JPA를 사용하여 JPA 표준 문법에 맞춰 개발하면 JPA가 알아서 각 데이터베이스에 맞게 sql을 작성해준다.

JPA 어플리케이션

JPA 어플리케이션은
엔티티 매니저 팩토리 생성 -> 엔티티 매니저 팩토리로 엔티티 매니저 생성 ->
엔티티 매니저로 트랜잭션 획득 -> 트랜잭션 시작 -> 비즈니스 로직 실행 -> 트랜잭션 커밋 -> 실패시 트랜잭션 롤백 -> 엔티티 매니저 종료 -> 엔티티 매니저 팩토리 종료

엔티티 매니저 팩토리

EntityManagerFactory emf = 
	Persistence.createEntityManagerFactory("영속성 유닛 이름");

Persistence 클래스를 사용하여 persistence.xml의 설정 정보에서 인자로 받은 이름과 일치하는 영속성 유닛을 찾아서 엔티티 매니저 팩토리를 생성한다.
이때 JPA 동작시키기 위한 기반 객채도 만들고 데이터베이스 커넥션 풀도 생성하므로 비용 커서 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.

애플리케이션을 종료할 때 엔티티 매니저 팩토리도 종료해줘야한다.

엔티티 매니저

EntityManager em = 
	emf.createEntityManager();

JPA의 기능 대부분은 엔티티 매니저가 제공한다.
엔티티를 데이터베이스에 crud 할 수도 있다.
엔티티 매니저는 데이터베이스 커넥션을 유지하며 데이터베이스와 통신하기 때문에 스레드 간에 공유하거나 재사용하면 안된다.

사용이 끝나면 종료해줘야 한다.

트랜잭션 관리

JPA를 사용하면 데이터를 변경할때는 트랜잭션 안에서 해야한다.
그렇지 않으면 예외가 발생한다.

비즈니스 로직이 성공하면 커밋 예외가 발생하면 롤백해야한다.

데이터 수정

em.update() 같은 메서드는 없다.
대신 JPA는 어떤 엔티티가 변경되었는지 추적하는 기능이 있어 set 메서드로 엔티티의 값만 변경하면 이후 커밋할때 update sql이 생성되어 데이터베이스의 값을 변경한다.

JPQL

JPA는 엔티티 객체를 중심으로 개발하므로 검색할 때도 객체를 대상으로 검색해야한다.
이를 위해서는 데이터베이스의 모든 데이터를 애플리케이션으로 불러와 엔티티 객체로 변경한 다음 검색해야 하는데, 이는 사실상 불가능하다.

검색을 위해서는 검색 조건이 포함된 sql을 사용해야한다.

JPA는 JPQL이라는 SQL을 추상화한 객체지향 쿼리 언어를 제공한다.

둘의 차이점은
SQL은 테이블을 대상으로 쿼리하고
JPQL은 엔티티 객체를 대상으로 쿼리한다.

JPA는 JPQL을 분석해서 SQL을 만들어 데이터베이스에 데이터를 조회한다.
단 JPQL은 대소문자를 구분한다.

TypedQuery<Member> query =
	em.createQuery(JPQL, 반환 타입);
List<Member> members = query.getResultList();

엔티티 매니저의 createQuery 메서드로 JPQL을 쿼리로 만든 다음
getResultList 메서드로 쿼리 결과를 가져온다.

profile
inho ha / ian(swatchon) / iha(42seoul)

0개의 댓글