JPA

JPA기본편 - JPA소개와 기본 개념

땅콩콩 2023. 3. 31. 20:00
JPA란?

JAVA Persistence API.

객체와 관계형데이터베이스의 차이때문에 생기는 SQL의존적인 개발을 피하기 위해 사용하는 자바 진영의 ORM 기술 표준!

애플리케이션과 JDBC 사이에서 동작하며, 프로그래머가 객체중심으로 데이터베이스에 접근하며 개발할 수 있도록 도와준다.

JPA 구동 방식

 

객체와 테이블을 생성하고 매핑하기

@Entity는 jpa가 관리할 객체를 알려주고, @Id는 데이터베이스의 pk와 매핑된다.

//객체생성
@Entity
public class Member {
    @Id 
    private Long id;
    private String name;
}
//테이블생성
create table Member ( id bigint not null, name varchar(255), primary key (id );

 

 

JPA 구동 예시
public class JpaMain {
    public static void main(String[] args) {

        //entityManagerFactory는 데이터베이스당 하나만 생성해서 애플리케이션 전체에 공유!
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        //entityManager는 쓰레드별로 각각 사용. 공유X, 사용하면 버린다.
        EntityManager em = emf.createEntityManager();

        //jpa의 모든 데이터 변경은 트랜잭션안에서 실행.
        EntityTransaction tx = em.getTransaction();

        tx.begin();

        try{
            //jpa를 통해 entity를 가져오면 jpa가 관리하면서 변경을 감지한다.
            Member findMember = em.find(Member.class, 1L);

            //값이 바뀌었으면 jpa가 update 쿼리를 날림.
            findMember.setName("HelloJPA");

            //jpql(객체대상 sql) 사용
            List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .setFirstResult(1)
                    .setMaxResults(10)
                    .getResultList();

            for (Member member : result) {
                System.out.println("member.getName() = " + member.getName());
            }

            tx.commit(); //트랜잭션 커밋 필수! 안하면 변경사항 반영이 안됨.
        } catch(Exception e){
            tx.rollback();
        } finally {
            em.close(); //자원을 다쓰면 em 닫아줘야 데이터베이스 커넥션이 반환됨.
        }
        emf.close(); //웹앱의 WAS가 내려갈 때 emf 닫아줘야 내부적으로 리소스가 release된다.
    }
}

여기서 JPQL이란 JPA가 제공하는 객체지향 쿼리 언어로서, SQL을 추상화한 것이다.

SQL은 데이터베이스 테이블을 대상으로 쿼리하는것과 달리, JPQL은 엔티티 객체를 대상으로 쿼리한다.

JPQL은 SQL과 문법이 유사하고 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.

한마디로 객체지향 SQL이라고 할 수 있다.

 

 

*인프런 김영한님의 JPA 기본편 강의를 들으며 정리한 내용입니다.

*https://www.inflearn.com/course/ORM-JPA-Basic