1. 특징
- ORM 프레임워크 ( object-Relational Mapping )
==> 자바의 클래스(엔티티, entity)를 이용해서 DB의 테이블을 생성 ( 자바의 클래스와 DB 테이블이 맵핑됨 )
자바의 메서드가 DB의 SQL을 자동 실행함 ( 자바의 메서드와 DB의 SQL이 맵핑됨 )
- JPA는 명세서임 ( 자바의 인터페이스와 같은 개념 )
JPA의 명세를 구현한 구현체들이 있음 ( 대표적으로 hibernate가 있음 )
하이버네이트를 쓸려면 의존성 추가
우리가 실질적으로 쓰는건 하이버네이트가 아니고
스프링 데이터 JPA를 쓴다
- Spring Data JPA
==> hibernate 기술을 개발자들이 쉽게 사용하도록 커스터마이징한 기술
https://docs.spring.io/spring-data/jpa/reference/jpa/getting-started.html
2. 환경설정
가. mysql 설치
나. 의존성 설정
다. application.properties 설정
# 개발환경에서만 사용
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create | create-drop | update | validate | none
create : drop하고 create
create-drop : create하고 프로그램 종료때 drop
update : 기존 테이블과 변경상태만 반영
validate : 엔티티와 테이블이 정상 매핑되었는지 확인만 함
none : 사용안함
# RDB Dialect 설정
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
라. 엔티티 작성
- DTO와 비슷
@Entity // 테이블과 맵핑, 기본적으로 생성된 테이블의 이름은 클래스명을 따른다.
public class Member {
@Id //테이블의 pk 역할
long id;
String name;
int age;
//getter, setter
//생성자
//toString
}
- 규칙
반드시 기본생성자 필수
final, enum, interface, inner 클래스 사용불가
변수에 final 사용 불가
##############################################
3. 객체와 테이블 맵핑
- @Entity : 테이블과 맵핑
- @Id : pk와 맵핑
- @Table : 생성되는 테이블의 정보 지정 가능 4.3 참조
4. 변수(속성)와 컬럼 맵핑
4.5 참조
@Id
@Column(name = "member_id")
long id;
@Column(name="name", length = 100) //length는 255가 기본
String username;
int age;
@Column(unique = true, nullable = false) //유니크하면서 null은 허용 안함
String address;
LocalDate hiredate;
//3.11 참조
@Enumerated(EnumType.STRING)
RoleType roleType;
@Lob
String description;
@Transient
String email; //테이블의 컬럼에서 skip됨
###########################################################
5. 기본키 맵핑
- @Id : 테이블의 PK 역할
- @GeneratedValue(strategy = GenerationType.IDENTITY) <== mysql에서는 auto increase로 생성
##############################################################
6. 영속성 관리
- @Entity로 지정된 객체를 영속성객체 라고 부름
- 영속성 객체를 관리하는 객체는 EntityManager
EntityManager를 생성해주는 객체는 EntityManagerFactory - thread-safe(혼자 사용: 로컬?)하게 관리
EntityManagerFactory 는 thread-safe(혼자 사용: 로컬?)하게 관리, 즉 메서드 안에서만 사용한다
EntityManagerFactory 는 한번만 생성하고 필요시 EntityManager를 생성해서 DB 연동함
이때 주요한 특징은 EntityManager 객체를 thread-safe하게 로컬변수 형태로 사용해야함
그리고 반드시 트랜잭션 범위 안에서 사용해야 된다. ( 중요 @Transaction 써야됌 **************)
- 영속성 컨텍스트: 영속성 객체를 관리하는 저장소 역할
- 4가지 영속성객체 상태
가. 비영속
나. 영속 상태 (*****)
- 트랜잭션 범위내에서 영속성 컨텍스트에서 영속성 객체가 관리되는 상태의미
- 예> 저장: persist()
조회: find()
다. 준영속
- 영속 상태였다가 비영속상태로 분리되는 상태의미
예> detatch()
라. 삭제
- 엔티티가 제거됨
예> remove()
7. 데이터 저장
- 엔티티 생성 의미
예> @Entity
public class Member{
@Id
long id;
String name;
}
엔티티를 생성하면 저장용도
엔티티를 수정, 삭제하면 수정, 삭제
8. 데이터 조회
- 개념: 엔티티 컨텍스트에 기존 엔티티 검색 의미
9. 더티체킹(drity checking) <= 수정
- 자동으로 엔티티 컨텍스트의 엔티티객체의 변수값과
DB의 레코드 컬럼값을 비교해서
일치하지 않으면 자동으로 변경된 엔티티 값을
DB에 반영시킴
DB를 수정할때 find로 찾고 update()로 수정
삭제할때 finde로 찾고 remove()로 삭제
10. 엔티티 삭제 - DB레코드 삭제
11. 연관관계 ( 엔티티와의 관계 )
1) 다대일 (N : 1)
Member : Team
=> Member를 통해서만 Team으로 갈 수 있음. 단방향
Member -------> Team
=> Member와 Team이 서로 참조 할 수 있음. 양방향 ( toString 쓰면 안됌 )
Member <-------> Team
실습(단방향)
실습(양방향) ( toString 쓰면 안됌 )
2) 일대일 (1:1)
Member:Locker
12. JPQL ( Java )