
Apache Ant 불편함을 해결하기 위해 등장하였다.pom.xml을 이용한 정형화된 빌드 시스템pom.xml: 의존성을 추가할 수 있으며, 프로젝트의 중요한 정보를 정의하고 정리하기 위한 곳build.gradle은 메이븐의 pom.xml과 비슷한 역할, 즉 플러그인, 의존성 추가를 위한 파일이다.VARCHAR, Oracle은 VARCHAR2 SUBSTRING(), Oracle은 SUBSTR() LIMIT, Oracle은 ROWNUM 이처럼 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 방언이라고 한다!

JPA는 사용하는 DB Dialect에 따라서 알맞은 SQL을 생성해준다.
org.hibernate.dialect.H2Dialect org.hibernate.dialect.Oracle10gDialect org.hibernate.dialect.MySQL5InnoDBDialect 
JPA는 Persistence라는 클래스가 있다.Persistence에서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 객체를 생성해준다.EntityManagerFactory에서 필요할 때마다 EntityManager를 생성해서 사용한다.@Entity
public class Member {
@Id
private Long id;
private String name;
//Getter, Setter, ...
}
@Entity: JPA가 관리할 객체라는 뜻@Id: 데이터베이스 PK와 매핑create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);

package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member); //member 저장
tx.commit();
em.close();
emf.close();
}
}

SELECT * FROM MEMBER
입력 후 실행 버튼을 클릭하면

데이터가 잘 저장되었다!!

memberB까지 잘 저장된 것을 확인할 수 있다.
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
tx.commit();
} catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
try-catch 문 추가!try {
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
tx.commit();
}

try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
}


⭐ 주의사항
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.
- 엔티티 매니저는 스레드 간에 공유 X (사용하고 버려야 한다.)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다!
단순한 조회는 다음 두 가지를 활용하면 된다.
EntityManager.find()a.getB().getC())하지만 나이가 18살 이상인 회원 검색 과 같이 복잡한 조회를 하고 싶다면 저 두 가지로는 부족하다🤨 더 자세히 알아보자!
JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
검색 쿼리를 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하기 때문에 문제가 발생한다!
→ 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문이다.
즉, 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다!
식별자를 통한 단순 조회가 아닌 추가 조건들을 통해 조회하고 싶을 때 사용한다!
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
이 JPQL은 SQL과 문법이 유사하며, 엔티티 객체를 대상으로 쿼리한다!
📌 JPQL vs SQL
JPQL: 엔티티 객체를 대상으로 쿼리한다.
→ DB를 바꾸더라도 방언을 교체할 필요 ❌SQL: 데이터베이스 테이블을 대상으로 쿼리한다.