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
: 데이터베이스 테이블을 대상으로 쿼리한다.