[JPA-Basic][2] JPA 시작

kiteB·2021년 10월 9일
0

JPA

목록 보기
2/28
post-thumbnail

[ Hello JPA - 프로젝트 생성 ]

1. Maven

  • 자바 라이브러리, 빌드 관리 도구이며 Apache Ant 불편함을 해결하기 위해 등장하였다.
  • pom.xml을 이용한 정형화된 빌드 시스템
    • pom.xml: 의존성을 추가할 수 있으며, 프로젝트의 중요한 정보를 정의하고 정리하기 위한 곳

+) Gradle

  • 최근에는 Gradle을 많이 사용한다.
  • build.gradle은 메이븐의 pom.xml과 비슷한 역할, 즉 플러그인, 의존성 추가를 위한 파일이다.

🔗 Maven vs Gradle 비교 블로그 글

2. 데이터베이스 방언

  • JPA는 특정 데이터베이스에 종속되지 않는다.
  • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.
    • 가변 문자: MySQL은 VARCHAR, Oracle은 VARCHAR2
    • 문자열을 자르는 함수: SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
    • 페이징: MySQL은 LIMIT, Oracle은 ROWNUM

이처럼 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능방언이라고 한다!

📌 데이터베이스 방언을 사용하는 예

JPA는 사용하는 DB Dialect에 따라서 알맞은 SQL을 생성해준다.

  • H2 : org.hibernate.dialect.H2Dialect
  • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
  • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
  • 하이버네이트는 40가지 이상의 데이터베이스 방언 지원

🔗 프로젝트 세팅 코드


[ Hello JPA - 애플리케이션 개발 ]

1. JPA 구동 방식

  • JPAPersistence라는 클래스가 있다.
  • Persistence에서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 객체를 생성해준다.
  • EntityManagerFactory에서 필요할 때마다 EntityManager를 생성해서 사용한다.

2. 객체와 테이블 생성, 매핑

  • Member.java
@Entity
public class Member {

	@Id
    private Long id;
    private String name;
    
    //Getter, Setter, ...
}
  • @Entity: JPA가 관리할 객체라는 뜻
  • @Id: 데이터베이스 PK와 매핑

H2 데이터베이스 이용해서 객체 생성

create table Member (
	id bigint not null,
    name varchar(255),
    primary key (id)
);


3. 등록

  • JpaMain.java
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();
    }
}

실행 결과

H2 데이터베이스 확인!

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 문 추가!

3. 조회

try {
    Member findMember = em.find(Member.class, 1L);
    System.out.println("findMember.id = " + findMember.getId());
    System.out.println("findMember.name = " + findMember.getName());

    tx.commit();
}

4. 수정

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

실행 결과

⭐ 주의사항

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.
  • 엔티티 매니저는 스레드 간에 공유 X (사용하고 버려야 한다.)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다!

5. JPQL

단순한 조회는 다음 두 가지를 활용하면 된다.

  • EntityManager.find()
  • 객체 그래프 탐색 (a.getB().getC())

하지만 나이가 18살 이상인 회원 검색 과 같이 복잡한 조회를 하고 싶다면 저 두 가지로는 부족하다🤨 더 자세히 알아보자!

1) JPA

JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
검색 쿼리를 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하기 때문에 문제가 발생한다!
→ 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문이다.

즉, 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다!

2) JPQL

식별자를 통한 단순 조회가 아닌 추가 조건들을 통해 조회하고 싶을 때 사용한다!

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
JPQL은 SQL과 문법이 유사하며, 엔티티 객체를 대상으로 쿼리한다!

📌 JPQL vs SQL

  • JPQL: 엔티티 객체를 대상으로 쿼리한다.
    → DB를 바꾸더라도 방언을 교체할 필요 ❌
  • SQL: 데이터베이스 테이블을 대상으로 쿼리한다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글