개발자꿈나무

JPA 프로젝트 생성 본문

자바/JPA

JPA 프로젝트 생성

망재이 2023. 7. 2. 17:01

★ Maven 설정하기

- Maven은 pom.xml 파일을 통해 라이브러리를 추가할 수 있음

- 현재는 spring 없이 Java만을 이용해서 JPA를 사용할 예정이지만, 추후에 SpringBoot와 연동을 하기 위해서는 미리 안정적인 hibernate version을 파악해둘 필요가 있음

 

https://docs.spring.io/spring-boot/docs/3.0.9-SNAPSHOT/reference/html/dependency-versions.html#appendix.dependency-versions

 

Dependency Versions

 

docs.spring.io

 

* Java 11 이상의 버전에서는 javax.xml.bind 패키지가 Java SE 모듈에서 제거되었으므로, Java 11을 사용하는 경우 javax.xml.bind를 사용하기 위해 별도의 종속성 추가!

 

 

★ JPA를 사용하기 위해서 persistence.xml 파일 추가

- resources/META-INF/persistence.xml 위치 주의해야함

- persistence-unit name에 원하는 name을 설정

* 해당하는 데이터베이스 driver를 설정해주고 dialect 설정해줘야함!

* 데이터베이스 방언이라는 말을 쉽게 표현해서 각각의 데이터베이스가 제공하는 SQL 문법과 함수가 조금씩 다르므로 각각의 데이터베이스마다 다르게 사용되는 언어를 지원해줌

* JPA는 데이터베이스에 종속되지 않으므로 내가 사용하고자 하는 데이터베이스의 방언을 설정해줘야, 해당 데이터베이스에서 다르게 쓰이는 문법들을 JPA가 제공할 수 있음 ex) limit, rownum ...

* 하이버네이트는 40가지 이상의 데이터베이스 방언을 지원하므로 웬만한 실무에서 사용되는 데이터베이스는 다 제공한다고 봐도 무방

* hibernate.show_sql과 format_sql는 콘솔창에 sql문을 보여주고 보기 좋게 정렬해주는 옵션

 

 

★ JPA 구동 방식

- JPA는 Persistence 클래스로 시작을 하며(xml 설정정보를 읽음) entityfactory를 만들고 실행마다 entitymanager를 호출

 

★ 데이터베이스 테이블을 생성하고, 객체 클래스 생성

- id(PK)과 name을 가지고 있는 Member 테이블을 먼저 생성! (데이터베이스)

- Member 클래스를 생성하고 필드 값을 적어줌 

- 엔티티 클래스로 사용하고자 하는 클래스에 @Entity를 필수로 입력해줘야하며 PK에 해당하는 값에 @Id도 필수로 입력해야함!

게터와 세터까지 생성해준 모습

* 객체의 이름과 실제 데이터베이스 내부의 컬럼명이나 테이블명이 다를 때는 이름을 추가해주면 됨

 

 

★ 회원 등록, 수정, 삭제해보기

⭐︎ EntityManagerFactory와 EntityManager 생성하기

- createManagerFactory 매개변수로는 xml파일에서 설정해준 unitname을 입력해줌

- EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유

- EntityManager는 쓰레드간에 공유하지 않음 -> 한번만 사용하고 버려야함!

- ManagerFactory와 EntityManager는 사용한 이후에는 close를 해줘야함

 

⭐︎ 회원 등록

* Member객체를 생성한 후 Id과 name을 set해주고 persist를 이용해서 실행

* 에러가 뜸 -> JPA는 꼭!! 트랜젝션 안에서 실행해야

* 트랜젝션을 시작하고 insert가 완료되면 commit을 실행해줌

콘솔에 나타나는 쿼리문

* name과 id에 helloA, 1이 들어가게 됨

* 좀 더 완벽하게 구성을 하자면 하나의 트랜젝션이 실행되는 도중 오류가 날 수 있으므로 예외 처리를 해주는게 좋음!

 

⭐︎ 트랜젝션 예외처리와 회원 수정

** (07.23. 수정) 해당 로직은 member 엔티티에 2, helloB를 추가로 삽입하는 내용이고 수정을 할 때는 이렇게 처리하면 됨 -> 뒤에서 변경 감지라는 내용을 통해서 수정이 되는 매커니즘에 대해서 다룰 예정!

//1이라는 id을 가진 member 엔티티 조회
Member member = em.find(Member.class, 1L);

//바꿔주고 싶은 값 set
member.setName("byeA");

tx.commit();

* try문이 완벽하게 실행되면 commit을 수행해주고 예외가 발생하면 catch문에서 rollback을 실행! 모든 과정이 끝난 후에는 엔티티 매니저를 닫아줌

* 회원 정보를 수정할 때는 먼저 수정하고자 하는 결과를 find하고 수정하고자 하는 값을 넣어주면 됨

* 수정의 경우에는 setName 후 persist를 할 필요가없음! 자바 컬렉션처럼 사용되도록 설계되어 있기 때문

* JPA를 통해서 엔티티를 가져오면 JPA가 관리를 하고, 트랜젝션 커밋 시기를 다 체크해서 commit이 되기 직전에 update 쿼리를 보냄

수정한 결과

 

⭐︎ 회원 삭제

* 똑같이 삭제하고자 하는 회원정보를 검색하고 remove만 해주면 됨!

삭제한 결과

 

 

★ JPQL

- 단순하게 하나의 값이 아니라 해당하는 모든 회원을 검색하고 싶다면?

- 이럴 때 사용하는게 JPQL!!

- 일반 쿼리문과 다른 점은 대상이 테이블이 아니라 객체라는 점!

- 객체지향 쿼리문으로 Member 객체를 다 가져오라는 뜻

- 그러나 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하므로 필요한 데이터만 DB에서 불러오기 위해 검색 조건이 필요한 SQL이 필요

- Select , From , Where , Group by , Having , Join 지원 가능하며 SQL과 문법이 유사함

- 그렇다면 JPQL이 왜 유용한 걸까?

- 단순히 Member객체를 다 불러오는 것이 아니라 상위 몇 퍼센트 혹은 몇 명의 정보만 불러오고 싶을 때 매우 유용함!

 

1. select m from Member as m 실행 쿼리문

 

2. limit 조건을 걸었을 때 실행 쿼리문

* 둘 다 직접 작성한 쿼리문은 같지만 손쉽게 limit, offset 조건을 걸 수 있음!

* 다양한 메소드들이 존재하며 이러한 조건들과 함께 사용한다면 굉장히 유용하게 사용할 수 있음

728x90

'자바 > JPA' 카테고리의 다른 글

준영속  (0) 2023.07.23
플러시  (0) 2023.07.23
영속성 컨텍스트의 장점  (0) 2023.07.23
엔티티 매니저 팩토리, 엔티티 매니저, 영속성 컨텍스트, 생명주기  (0) 2023.07.09
JPA 친해지기  (0) 2023.07.02