티스토리 뷰
코드는 크게 3부분으로 나뉘어 있다.
★ 엔티티 매니저 설정
★ 트랜잭션 관리
★ 비즈니스 로직
★ 엔티티 매니저 설정
1. 엔티티 메니저 팩토리 설정
- JPA를 시작하려면 우선 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야한다,
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");


persistence.xml에서 이름이 jpabook인 영속성 유닛을 찾아서 엔티티 매니저팩토리를 생성한다.
강의 시간엔 따라 치느라 몰랐는데 factory가 '공장'이라는 뜻을 가지고 있으므로 엔티티 매니저를 만드는 것이구나 라고 이해하게 되었다.
2. 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
애플리케이션 개발자는 엔티티 매니저를 가상의 데이터베이스로 생각 가능하다.
엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유,재사용 금지이다.
3.종료
- 사용이 끝난 엔티티 매니저는 반드시 종료 해야한다.
em.close(); // 엔티티 매니저 종료
emf.close(); // 엔티티 매니저 팩토리 종료
★ 트랜잭션 관리
- JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야만 데이터를 변경하면 예외가 발생한다.
EntityTransaction tx = em.getTransaction(); // 트랜잭션 API
try {
tx.begin(); // 트랜잭션 시작
logic(em); // 비즈니스 로직 실행
tx.commit(); // 트랜잭션 커밋
} catch (Exception e) {
tx.rollback(); // 예외 발생 시 트랜잭션 롤백
}
트랜잭션 API를 사용해서 비즈니스 로직 정상 작동 → 트랜잭션 커밋 → 예외 발생 → 트랜잭션 롤백
★ 비즈니스 로직
- 비즈니스 로직은 회원 엔티티를 하나 생성한 다음 엔티티 매니저를 통해 데이터베이스에 등록, 수정, 삭제, 조회한다.
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("지한");
member.setAge(2);
//등록
em.persist(member);
//수정
member.setAge(20);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
}

<출력 결과>
1. 등록
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("강태오");
member.setAge(2);
//등록
em.persist(member);
엔티티를 저장하려면 엔티티 매니저의 persist() 메소드에 저장할 엔티티를 넘겨준다.
JPA는 회원 엔티티의 매핑 정보(어노테이션)를 분석해서 아래와 같은 SQL을 만들어 데이터 베이스에 전달한다.
INSERT INTO MEMBER (ID,NAME,AGE) VALUES ('id1','강태오',2)
2. 수정
//수정
member.setAge(20);
수정이라고 em.update()는 메소드는 없다.
JPA는 어떤 엔티티가 변경되었는지 추적하는 기능이 있다.
따라서 엔티티의 값만 변경하면 아래와 같은 UPDATE SQL 을 생성해서 데이터베이스에 값을 변경한다.
UPDATE MEMBER
SET AGE=20, NAME='강태오'
WHERE ID = 'id1'
3. 삭제
em.remove(member);
엔티티를 삭제하려면 엔티티 매니저의 remove() 메서드에 삭제하려는 엔티티를 넘겨준다.
JPA는 아래와 같은 DELETE SQL을 생성해서 실행한다.
DELETE FROM MEMBER WHERE ID = 'id'
4. 한건 조회
Member findMember = em.find(Member.class, id);
find () 메소드는 조회할 엔티티 타입과 @Id로
데이터베이스 테이블의 기본키와 매핑한 식별자 값으로 엔티티 하나를 조회하는 메서드다.
이 메소드를 호출하면 아래와 같은 SELECT SQL을 생성하여 결과를 조회한다.
SELECT * FROM MEMBER WHERE ID = 'id1'
5. 목록 조회 (JPQL) / JPQL이란? / JPQL을 쓰는 이유
-위의 등록/수정/삭제/조회는 SQL을 전혀 사용하지 않았다.
JPA는 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야한다.
애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 검색 조건이 포함된 SQL을 사용해야 한다.
JPA는 'JPQL'이라는 쿼리 언어로 이런 문제를 해결한다.
JPQL은 SQL을 추상화한 객체지향 쿼리 언어를 제공한다.
JPQL은 SQL과 문법이 거의 유사하여 SELECT,FROM,WHERE,GROUP BY, HAVING 등 사용 가능하다.
JPQL VS SQL
| SQL | 데이터베이스 테이블을 대상으로 쿼리한다. |
| JPQL | 엔티티 객체를 대상으로 쿼리한다. 클래스와 필드를 대상으로 쿼리한다. |
- 목록 조회 코드
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
select m from Member m 이것이 바로 JPQL이다.
from Member는 회원 앤티티 객체이지 테이블이 아니다.
JPQL사용법은 em.createQuery(JPQL, 반환 티입) 메소드를 실행헤서 쿼리 객체를 사용한다.
쿼리 객체를 생성한 후 쿼리 객체의 getResultList() 메소드를 호출한다.
JPA는 JPQL을 분석해서 아래와 같은 적절한 SQL을 만들어 데이터베이스에서 데이터를 조회한다.
SELECT M.ID, M.NAME, M.AGE FROM MEMBER M
자바 ORM 표준 JPA 프로그래밍 - 교보문고
스프링 데이터 예제 프로젝트로 배우는 전자정부 표준 데이터베이스 프레임 | ★ 이 책에서 다루는 내용 ★■ JPA 기초 이론과 핵심 원리■ JPA로 도메인 모델을 설계하는 과정을 예제 중심으로
www.kyobobook.co.kr
위의 책을 참고해서 쓴 글입니다.
'차곡차곡 > Java' 카테고리의 다른 글
| [Java] JPA 영속성 관리 (2) - 영속성 컨텍스트 (persistence context) (0) | 2022.07.17 |
|---|---|
| [Java] JPA 영속성 관리(1) - 엔티티 매니저 팩토리/ 엔티티 매니저와의 관계 (0) | 2022.07.17 |
| [JAVA]JPA 라이브러리와 프로젝트 구조 (0) | 2022.07.04 |
| [Java] 예외처리 - throw 사용하기 (0) | 2022.05.15 |
| [Java] 예외 처리 - Exception 인스턴스에 따라 예외 처리 (0) | 2022.05.15 |
- Total
- Today
- Yesterday
- 꾸덕꾸덕 파스타 맛집
- React
- 버튼누르면전구이미지변하기
- 리액트 엘리먼트 렌더링하기
- fragment태그
- 커틀렛 맛집
- React를 이용한 Counter 만들기
- 리액트 이벤트 처리하기
- 콘솔 창 한글 깨짐
- Counter 만들기
- JPQL이란
- DDL 생성 콘솔 출력
- 온량 서울숲점
- 엔티티매니저팩토리
- react counter
- 데이터베이스 스키마 자동 생성
- JPA 기본키 매핑 전략
- JPA라이브러리
- 영주 한우
- 로제 파스타 맛집
- 영주역 맛집
- 풍기역맛집
- pip 설치 오류
- JPA애플리케이션개발코드
- tick 만들기
- intellij 한글 깨짐
- 토마호크 맛집
- 엘리먼트 렌더링
- 영속성 관리
- JPA
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
