개발자꿈나무
JPA 프로젝트 생성 본문
★ Maven 설정하기
- Maven은 pom.xml 파일을 통해 라이브러리를 추가할 수 있음
- 현재는 spring 없이 Java만을 이용해서 JPA를 사용할 예정이지만, 추후에 SpringBoot와 연동을 하기 위해서는 미리 안정적인 hibernate version을 파악해둘 필요가 있음
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 조건을 걸 수 있음!
* 다양한 메소드들이 존재하며 이러한 조건들과 함께 사용한다면 굉장히 유용하게 사용할 수 있음
'자바 > JPA' 카테고리의 다른 글
준영속 (0) | 2023.07.23 |
---|---|
플러시 (0) | 2023.07.23 |
영속성 컨텍스트의 장점 (0) | 2023.07.23 |
엔티티 매니저 팩토리, 엔티티 매니저, 영속성 컨텍스트, 생명주기 (0) | 2023.07.09 |
JPA 친해지기 (0) | 2023.07.02 |