728x90
01. JPA 구동 방식
- Persistence로 META-INF/persistence.xml를 읽어 설정 정보를 조회한다.
- EntityManagerFactory 라는 클래스를 생성한다.
- 필요할 때 마다 EntityManager 를 생성한다.
02. 객체와 테이블을 생성하고 매핑하기
Annotation
@Entity
는 JPA가 관리할 객체임을 명시한다.@Id
는 데이터베이스의 Primary Key와 매핑할 때 사용한다.
Member 클래스 작성하기
@Entity
@Getter
@Setter
public class Member {
@Id
private Long id;
private String name;
}
@Getter와 @Setter를 사용하면 다음과 같이 길게 작성해야 하는 코드를 자동으로 만들어준다.
해당 Annotation은 Lombok을 사용한 것이다.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; }
Lombok을 사용하려면 Spring Boot 프로젝트를 만들 때 (https://start.spring.io/)) dependencies 에 lombok 을 검색하여 자동으로 추가할 수 있다. 혹은 프로젝트를 생성 후 수동으로 추가하고자 하면, build.gradle의 dependencies에 아래와 같이 추가한다.dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' }
03. Main 클래스 코드 작성하기
JPA 구동 방식에 따른 코드 작성
- EntityManagerFactory 는 하나만 생성해서 애플리케이션 전체에서 공유하게 해야한다.
- EntityManager 는 트랜잭션과 같이 일관적인 무언가를 할 때 꼭 만들어야 한다.
- EntityManager 는 스레드간에 공유하면 안된다. 사용하고 즉시 버려야 한다. (Connection을 얻고 반환하는 것과 마찬가지로 생각하면 좋을 것 같다.)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
- 트랜잭션 내 내용은 try-catch 문으로 묶는다.
JpaMain 클래스 작성하기
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 { // dosomething..
// ..
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
04. JPQL
JPQL 사용 배경
- JPA를 사용하면 Entity 객체를 중심으로 개발할 수 있다.
- 문제는 검색 쿼리인데, 검색할 때 테이블이 아닌 Entity 객체를 대상으로 검색한다.
- 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하므로, 애플리케이션이 필요한 데이터만 DB에서 불러서 사용하려면 결국 검색 조건이 포함된 SQL이 필요하다.
JPQL
JPQL(Java Persistence Query Language)은 테이블이 아닌 엔티티 객체를 대상으로 검색하는 객체지향 쿼리이다.
- SQL과 문법이 유사하다.
- SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
- SQL을 추상화해서 특정 DB SQL에 의존하지 않는다.
- Entity 객체를 대상으로 쿼리한다.
- SQL은 DB 테이블을 대상으로 쿼리한다.
05. 간단한 CRUD 코드 작성해보기
멤버 생성
- EntityManager의 persist 메소드 :
void persist(Object var1);
try {
Member member = new Member();
member.setId(1L);
memeber.setName("HelloA");
em.persist(member); // 저장
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
1명의 멤버 조회
- EntityManager의 find 메소드 :
T find(Class var1, Object var2);
try {
Member findMember = em.find(Member.class, 1L);
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
전체 멤버 조회
- EntityManager의 createQuery 메소드 :
TypedQuery createQuery(String var1, Class var2);
try {
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
멤버 삭제
- EntityManager의 remove 메소드 :
void remove(Object var1);
try {
Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
멤버 수정
try {
Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
tx.commit(); // 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
그 외 추가적인 내용
- 실제 DB 테이블 이름이 USER이면, 테이블로 지정할 클래스 위에 다음과 같이 작성하면 된다.
@Table(name = "USER")
- 실제 DB의 콜롬 이름이 username이면 속성 위에 다음과 같이 작성하면 된다.
@Column(name = "username")
728x90