2.1 이클립스 설치와 프로젝트 불러오기 → 생략
2.2 H2 데이터베이스 설치 → 생략
메이븐(Maven)이란?
- 라이브러리를 관리해주는 도구로, 빌드 기능도 함께 제공한다.
porm.xml
에 있는<dependencies>
에 사용할 라이브러리를 지정하면 자동으로 라이브러리를 내려받는다.
🌱 현재는 그레이들(Gradle)이 등장하여, 메이븐에서 그레이들로 넘어가는 추세이다.
CREATE TABLE MEMBER (
ID VARCHAR(255) NOT NULL, --기본키
NAME VARCHAR(255),
AGE INTEGER,
PRIMARY KEY (ID)
)
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
//매핑 정보가 없는 필드
private Integer age;
}
@Entity
- 이 클래스를 테이블과 매핑한다고 JPA에게 알려준다.
- 이 어노테이션이 있으면 엔티티 클래스이다.
@Table
- 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
name
속성을 이용해 Member Entity를 MEMBER 테이블에 매핑했다.
@Id
- 엔티티 클래스의 필드를 테이블의 기본키에 매핑한다.
- 이 어노테이션이 붙은 필드를 식별자 필드라 한다.
@Column
- 필드를 컬럼에 매핑한다.
매핑 정보가 없는 필드
- 이렇게 어노테이션을 생략하면 필드명을 사용해 컬럼명으로 매핑한다.
JPA는
persistence.xml
을 사용해 필요한 설정 정보를 관리한다.
JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. → 다른 DB로 손쉽게 교체 가능!
- 다만, 각 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르다는 문제점이 있다.
- ex) MySQL에선
VARCHAR
이 오라클에선VARCHAR2
를 사용한다.- 이처럼 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 JPA에선 방언이라 한다.
JPA 애플리케이션을 개발해보자.
public class JpabookApplication {
public static void main(String[] args) {
//엔티티 매니저 팩토리 - 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
//엔티티 매니저 - 생성
EntityManager em = emf.createEntityManager();
//트랜잭션 - 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //트랜잭션 - 시작
logic(em); //비즈니스 로직 실행
tx.commit(); //트랜잭션 - 커밋
} catch (Exception e) {
tx.rollback(); //트랜잭션 - 롤백
} finally {
em.close(); //엔티티 매니저 - 종료
}
emf.close(); //엔티티 매니저 팩토리 - 종료
}
private static void logic(EntityManager em) { }
}
위 코드는 크게 3부분으로 나뉘어 있다.
- 엔티티 매니저 설정
- 트랜잭셔 관리
- 비즈니스 로직
엔티티 매니저 팩토리 생성
- JPA를 시작하려면? → persistence.xml의 설정 정보를 이용해 엔티티 매니저 팩토리를 생성
`EntityManagerFactory emf = Persistence.*createEntityManagerFactory*("jpabook");`
엔티티 매니저 생성
- JPA의 기능 대부분은 엔티티 매니저가 제공한다.
`EntityManager em = emf.createEntityManager();`
종료
- 마지막으로 사용이 끝난 엔티티 매니저는 아래처럼 반드시 종료해야 한다.
em.close();
- 애플리케이션을 종료할 때 엔티티 매니저 팩토리도 아래처럼 종료해야 한다.
emf.close();
EntityManager
로부터 트랜잭션 API 받아오기//트랜잭션 - 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //트랜잭션 - 시작
logic(em); //비즈니스 로직 실행
tx.commit(); //트랜잭션 - 커밋 -> 정상 동작 시!
} catch (Exception e) {
tx.rollback(); //트랜잭션 - 롤백 -> 예외 발생 시!
}
엔티티 매니저를 이용한 CRUD
findMember=지한, age=20
members.size=1
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class)
.getResultList();
System.out.println("members.size = " + members.size());
JPQL(Java Persistence Query Language)
라는 쿼리 언어로 이 문제를 해결한다.JPQL은 SQL과 문법이 거의 유사하지만, 가장 큰 차이점은 아래와 같다.
- JPQL은 엔티티 객체를 대상으로 쿼리한다. → 쉽게 말해 클래스와 필드를 대상으로 쿼리!
- SQL은 데이터베이스 테이블을 대상으로 쿼리!
JPA를 사용해 객체 하나를 테이블에 등록/수정/삭제/조회를 해보았다.
- JPA 덕분에 코드량이 많이 줄어들고, SQL을 작성할 필요도 없었다!
- 다음은 JPA의 핵심 기능인 영속성 관리에 대해 알아보자.