김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'를 듣고 적은 글 입니다.
방언은 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 말한다.
JPA는 특정 데이터베이스에 종속되지 않는다. 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다. 그래서 데이터베이스를 변경하게 되면 해당 문법들을 수정해야 할 일들이 생기는데 하이버네이트는 40가지 이상의 데이터베이스 방언을 지원하기 때문에 수고스러움을 덜어준다.

데이터베이스는 H2 데이터베이스를 사용해 실습했다.
먼저 아무것도 없는 상태에서 실행하면

에러 창 같지만 이런 로그들이 뜨고 데이터베이스를 실행해 select * from 테이블명 쿼리를 날려주면 잘 실행된 것을 확인할 수 있다.
그리고 Member 클래스를 만들어 테이블에 객체를 저장해보도록 하자.
package hellojpa;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
이때 여기에서 @Entity 애노테이션을 적어줘야 한다. 그래야 JPA가 관리해야 할 클래스라는 것을 인식하기 때문이다.
package hellojpa;
import jakarta.persistence.*;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//persistence.xml 파일의 persistence-unit의 name 이름 적어줌
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin(); //데이터베이스 트랜잭션 시작
try{
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);
tx.commit(); //트랜잭션에 커밋해줌
} catch(Exception e){
tx.rollback();
} finally{
em.close();
}
emf.close();
}
}
그리고 차례대로 멤버를 넣어준다.

그럼 로그창에 쿼리문을 확인할 수 있다.
이때 멤버를 하나하나 일일히 넣어준 뒤 재실행하면 그 전에 INSERT한 데이터가 날아갈 때가 있는데 persistence.xml 파일에서 <property name="hibernate.hbm2ddl.auto" value="create" /> 부분을 주석처리 해주면 된다.
try{
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit(); //트랜잭션에 커밋해줌
} catch(Exception e){
tx.rollback();
} finally{
em.close();
}
그리고 이름을 변경해줄수도 있는데 이때 다시 em.persist()를 적지 않아도 괜찮다!
JPA를 사용하면 엔터티 객체를 중심으로 개발하게 된다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 이때 모든 데이터베이스 데이터를 객체로 변환해 검색하는 것은 불가능하다. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
그래서 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.