Java에서 객체를 데이터베이스에 저장하고 관리하기 위한 인터페이스와 기능을 제공하는 API
ORM(Object Relational Mapping)
- 객체와 DB의 데이터를 "자동으로 매핑" 시켜주는 프레임워크
JPA 장점
1. 특정 데이터베이스 종속되지 않음
2. SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.
3. 객체 지향적 프로그래밍 및 생산성 향상
4. 유지보수 측면에서 좋고 재사용성도 증가
JPA 단점
1. 복잡한 쿼리 처리 불가
2. 자동으로 생성되는 쿼리로 인해서 개발자가 의도하지 않는 성능 저하
3. 방대한 JPA 기술 학습에 필요한 시간과 노력
의존성 추가
DB Data Source 연결
Spring Boot의 경우
application.yaml에 설정한다dataSourcespring.datasource.driver-class-name : JDBC 드라이버의 경로spring.datasoruce.url : DataBase 주소spring.datasource.username : 사용자 이름spring.datasource.password : 사용자 비밀번호Model, Repository, Service 패키지 생성
@EntityAnnotation을 통해 Entity Class임을 선언
@Table(name="테이블 이름") Annotation을 사용하여 테이블 이름을 명시적으로 지정할 수 있다.@Column Annotation의 name 속성으로 지정해 이름을 명시적으로 지정할 수 있다.@Id Annotation을 통해 PK(Primary Key) Field에 대한 정의@Data Annotation을 사용하면 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 등을 한 번에 적용 할 수 있다.
Entity Manager Factory(엔티티 매니저 인스턴스를 관리하는 주체)
Entity Manager(Persistence Context에 접근하여 DB 작업을 제공하는 객체)
Persistence Context(Entity를 영구 저장하도록 지원하는 환경으로써 엔티티 매니저를 통해 접근 가능함)
@Entity
엔티티 클래스를 지정하는 어노테이션, 이 어노테이션이 붙은 클래스는 JPA의 엔티티로 인식
EntityClass와 DB의 테이블을 매핑하기 위해 사용
name속성
- JPA에서 사용할 엔티티 이름 지정, 생략시(default) 클래스 이름을 엔티티 이름으로 지정
@Table
@EntityAnnotation과 함께 사용되며 Entity Class와 매핑되는 DB Table의 정보를 설정하는 Annotation
테이블 명, 스키마 명 등을 지정할 수 있다.
name 속성매핑할 테이블 이름, 생략 시 엔티티 이름(@Entity(name="~")) 사용
catalog속성
catalog 기능이 있는 DB에서 catalog 매핑schema속성
schema 기능이 있는 DB에서 schema 매핑uniqueContraints속성
DDL 생성 시 유니크 제약조건 생성
스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용
@Id
엔티티 클래스의 기본 키(primary key)를 지정하는 Annotation
@Id 어노테이션만 적게될 경우 기본 키 값을 직접 부여해줘야 한다.
@GeneratedValue
어노테이션을 사용하면 기본 값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.
strategy 속성GenerationType.IDENTITY : 기본 키 생성을 DB에 위임-자동 증가(auto-increment) 열이나 IDENTITY 컬럼을 사용하여 새로운 엔티티의 기본 키 값을 생성
GenerationType.SEQUENCE : DB 시퀀스를 사용해서 기본 키 할당데이터베이스는 미리 정의된 시퀀스를 사용하여 각 엔티티에 대한 고유한 기본 키 값을 생성
GenerationType.TABLE : 키 생성 테이블 사용데이터베이스는 키 생성 테이블을 사용하여 각 엔티티에 대한 고유한 기본 키 값을 생성
GenerationType.AUTO : 선택된 DB에 따라 JPA 구현체가 자동으로 적절한 전략을 선택@Column
엔티티 클래스의 필드와 데이터베이스 테이블의 열을 매핑하는 어노테이션
name 속성insertable 속성updatable 속성table 속성nullable 속성length 속성precision, scale 속성unique 속성columnDefinition 속성@Transient
Entity Class의 Field를 DB의 테이블과 매핑되지 않도록 지정할 때 사용한다.
객체에 임시로 값을 보관하고 싶을 때 사용한다.
@Enumerated
Java Enum 타입을 매핑할 때 사용한다.
value속성
-EnumType.ORDINAL: enum 순서를 DB에 저장
EnumType.STRING: enum 이름을 DB에 저장
@Access
Entity Field에 접근하는 방식을 지정한다.
value속성
-AccessType.FIELD: 멤버 변수에 직접 접근
AccessType.PROPERTY: Getter/Setter 메소드를 통해 접근
@Temporal
날짜 타입을 매핑할 때 사용
value속성
-TemporalType.DATE: 날짜, DB date 타입과 매핑(ex: 2024-09-11)
TemporalType.TIME: 시간, DB time 타입과 매핑(ex: 16:39:12)TemporalType.TIMESTAMP: 날짜와 시간 DB timestamp 타입과 매핑(ex : 2024-09-11 16:39:12)
@Lob
Large Object 필드를 매핑하는데 사용됩니다. 이는 데이터베이스에 대용량의 데이터를 저장하는데 사용
필드 타입이 문자열이라면 CLOB(Character Large Object), 나머지는 BLOB(Binary Large Object)을 매핑
@JoinColumn
연관 관계에서 조인 컬럼을 지정하는데 사용된다.
외래 키(Foreign Key)를 포함한 Join Column을 지정하여 두 Entity 간의 관계를 매핑한다.

비영속(new)
영속(managed)
준영속 상태(detached)
삭제 상태(removed)

1차 캐시
동일성 보장

트랜잭션을 지원하는 쓰기 지연
변경 감지