본문 바로가기
김영한 스프링/김영한 스프링 JPA

JPA 어플리케이션 개발

by hoshi03 2023. 10. 29.

jpa 구동 방식

persistance에서 생성하고 entitymanagerfactory 에서

entitymanager를 찍어내서 돌린다

 

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager entityManager = emf.createEntityManager();

        // 실제 동작 코드를 작성하는 부분
        entityManager.close();
        emf.close();
    }
}

 

h2에 테이블 생성

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

 

자바에 엔티티 생성

@Entity: JPA가 관리할 객체
@Id: 데이터베이스 PK와 매핑

 

@Entity
public class Member {
    @Id
    private Long id;
    private String name;

    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;
    }
}

JpaMain에서 member테이블에 insert하기

Jpa는 트랜잭션 단위로 작업이 이루어진다

작업을 하기 전에 트랜잭션을 시작하고, 작업이 끝나면 commit을 꼭 해주자

 

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);

        tx.commit();

        em.close();
        emf.close();
    }
}

이 코드로는 문제가 생겼을때 대응이 안된다, 정석적으로 try-catch 문을 써서 문제가 없으면 트랜잭션을 커밋, 아니면 트랜잭션을 롤백한다

* 실제 스프링 환경에서는 아래의 try-catch로 오류잡는 부분을 스프링이 다 해준다!

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();
    }
}

수정, 삭제

// 삭제
 em.remove(findMember);
// 수정 , JPA를 통해서 엔티티를 가져오면 JPA가 업데이트를 해주기에 따로 persist로 저장을 안해도 된다!
findMember.setName("HelloJPA");

 

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

 

JPQL - 가장 단순한 조회 방법

 

• 가장 단순한 조회 방법
• EntityManager.find()
• 객체 그래프 탐색(a.getB().getC())

 

JPA를 사용하면 엔티티 객체를 중심으로 개발
• 문제는 검색 쿼리
• 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
• 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
• 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

 

• JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
• SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

 

결국 JPQL과 SQL이 차이나는 점은!

• JPQL은 엔티티 객체를 대상으로 쿼리
• SQL은 데이터베이스 테이블을 대상으로 쿼리

• 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
• SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
• JPQL을 한마디로 정의하면 객체 지향 SQL

 

전체 member 이름 가져오기

List<Member> result = em.createQuery("SELECT m from Member as m", Member.class).getResultList();
            for (Member member : result){
                System.out.println("member = " + member.getName());
            }

sql과 거의 비슷한 구문이지만 jpa에서는 테이블 단위로 가져오지 않고 멤버 객체를 가져온 걸로 이해했다

 

결론

JPA는 EntityManagerFactory를 만들어야 하고 거기서 manager를 필요할때 마다 생성한다

EntityManagerFactory를 만들때 이름은 persistance.xml 파일을 읽어와서 만든다

JPA의 모든 변경은 트랜잭션 안에서 일어나야되고 바꿧으면 commit을 해야 적용된다

작업을 다 했으면 manager를 닫아주자, was가 내려갈때는 팩토리도 닫아줘야 한다

 

'김영한 스프링 > 김영한 스프링 JPA' 카테고리의 다른 글

영속성 관리  (0) 2023.11.07
JPA 프로젝트 생성  (0) 2023.10.29