[JPA 설정 정보 관리 파일 : persistence.xml]
1. JPA에 필요한 설정 정보 관리
2. META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식
<!-- 연결할 DB마다 하나의 영속성 유닛(Persistence-Unit) 등록 -->
<persistence-unit name="db_item">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<!--
데이터베이스 방언 설정
데이터베이스 방언이란?
각 DB가 제공하는 SQL 문법과 함수가 조금씩 다르다.
SQL 표준을 지키지 않거나 특정 DB만의 고유한 기능을 JPA에서는 방언이라 칭한다.
H2 : org.hibernate.dialect.H2Dialect
오라클 : org.hibernate.dialect.Oracle10gDialect
MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
....
-->
<property name="hibernate.dialect" value="org.hivernate.dialect.H2Dialect" />
<!-- 옵션 속성 -->
<!--
show_sql : 실행한 SQL 출력
format_sql : SQL 출력시 보기 쉽게 정렬
use_sql_comments : SQL 출력시 주석도 함께 출력
new_generator_mappings : JPA 표준에 맞춰 새로운 키 생성 전략 사용
-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
[JPA 객체 매핑]
1. JPA에 필요한 설정 정보 관리
2. META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식
/*
* Anotation 설명
* Entity : 클래스를 테이블과 매핑한다는 선언
* Table : User 개체(Entity)를 USER 테이블에 매핑한다는 선언
*/
@Entity
@Table(name="USER")
@Getter
@Setter
public class User{
/*
* Id : 해당 필드를 매핑한 테이블의 PK에 매핑한다는 선언 (선언된 필드를 식별자 필드라 한다)
* Column : id 필드를 userid 컬럼에 매핑한다는 선언
*/
@Id
@Column(name="userid")
private String id;
/*
* 매핑 어노테이션이 없는 경우, 필드명을 사용해서 매핑한다 -> username 필드를 username 컬럼에 매핑한다
*/
private String username;
}
[기본 어플리케이션 세팅 및 개념, 기본 사용법]
/*
* [참고]
* 객체 Object : 의미있는 속성들이 모인것
* 개체 Entity : 정보를 표현하는 단위, 의미있는 하나의 정보 단위
*/
public class JpaPractice(){
public static void main(string[] args){
/*
* [엔티티 매니저 팩토리 생성] persistence.xml에서 작성한 persistence-unit name
* 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.(JPA 동작을 위한 기반 객체 생성 및 DB 커넥션 풀 생성 등등)
* -> 따라서 엔티티 매니저 팩토리는 Application 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.
*/
EntityManagerFactory factory = Persistence.createEntityFactory("db_item");
/*
* [엔티티 매니저 생성]
* 엔티티를 DB에 CRUD 작업
* 내부에 데이터소스(DB Connection)을 유지하면서 DB와 통신
* -> 따라서 엔티티 매니저를 가상의 DB로 생각할 수 있다.
* DB Connection과 밀접한 관계가 있으므로 Thread간에 공유하거나 재사용하면 안된다.
*/
EntityManger manager = factory.createEntityManager();
//트랜잭션 획득
EntityTransaction transaction = manager.getTransaction();
try(){
//트랜잭션 시작
transaction.begin();
logic(manager);
//트랜잭션 커밋
transaction.commit();
}catch(Exception e){
//트랜잭션 롤백
transaction.rollback();
}finally(){
//엔티티 매니저 종료
manager.close();
}
//엔티티 매니저 팩토리 종료
factory.close();
}
public static void logic(EntityManager manager){
String id = "HongGilDong";
User user = new User();
user.setId(id);
user.setUsername("홍길동");
manager.persist(user);
manager.setUsername("임꺽정");
/*
* 위에서 '임꺽정'으로 username의 값만 변경을 했는데 target의 username은 '임꺽정'으로 조회가 된다.
* 엔티티의 값만 변경하면 UPDATE SQL을 생성해서 처리해준다.
*/
User target = manager.find(User.class, id);
/*
* JPA는 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌, 엔티티 객체를 대상으로 검색해야한다.
* 하지만 엔티티 객체를 대상으로 검색하려면 DB의 모든 데이터를 Application으로 불러와서 엔티티 객체로 변경한 다음 검색해야 하는데, 이는 사실상 불가능하다.
* 필요한 데이터만 불러오려면 결국 검색 조건이 포함된 SQL을 사용해야한다.
* -> JPQL(Java Persistence Query Language)를 사용한다.
* *JPQL : 엔티티 객체를 대상으로 쿼리
* *SQL : 테이블을 대상으로 쿼리
* from User은 User 엔티티 객체를 말하는 것이지 User 테이블을 말하는것이 아니다.
* JPQL은 DB 테이블을 전혀 알지 못한다!
*/
List<User> userList = manager.createQuery("
SELECT u
FROM User AS u
", User.class).getResultList();
manager.remove(user);
}
}
반응형
'Jpa' 카테고리의 다른 글
번외. QueryDSL & JPA (0) | 2023.01.19 |
---|---|
5. 연관관계 매핑 (0) | 2023.01.19 |
4. 엔티티 매핑 (0) | 2023.01.19 |
3. 영속성(Persistence) 관리 (0) | 2023.01.19 |
1. JPA 란? (0) | 2023.01.19 |