ORM이란?
JAP란?
Spring Data JPA란?
Spring에서 JPA 사용을 위한 설정
Entity 클래스 설정 Annotation
@Table(name=xxx) : 맵핑된 Table 이름
@Entity : JPA가 관리할 객체임
@ID : ID Colum으로 사용
@GeneratedValue : ID를 자동 생성할때 사용
- TABLE, SEQUENCE(Oracle), IDENTITY(MySQL), AUTO 전략
@Temporal : 날짜 사용시
- Date, Time, Timestamp
@EmbeddedId : 복합 PK 사용할때
@Colum : DB Table의 Colum과 맵핑
@Transient : DB Table의 Colum과 맵핑하지 않는 field에 사용
@Enumerated : Enum(열거형) 맵핑
@Lob : CLOB, BLOB 매핑
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
연관관계
@JoinColum : 외래키와 맵핑
@ManyToOne : 다대일
@OneToMany : 일대다
@OneToOne : 일대일
@ManyToMany : 다대다
ManyToOne의 예제
연관 관계 영속성 전이
CasecadeType.ALL : 모두 반영
CasecadeType.PERSIST :
CasecadeType.MERGE
CasecadeType.REMOVE
CasecadeType.REFRESH
CasecadeType.DETACH
Fetch 전략
FetchType.EAGER : Entity가 로딩될때, 연관된 Entity도 같이 로딩
FetchType.LAZY : Entity가 연관 Entity를 참조 할때 로딩
interface만 상속하면, JpaRepository의 기본 기능 사용
기본 interface사용시 jpa 내부에서 실제 sql문이 생성되어 사용되어 짐으로 사용자는 interface를 사용
메서드 이름으로 쿼리를 생성하는 기능
public interface ItemRepository ... {
// select * from Items where item_name like '%{itemName}%'
ItemEntity findByItemNameLike(String itemName);
// select item_id from Items where item_name = '{itemName}'
// and price = {price} limit 1
boolean existsByItemNameAndPrice(String itemName, Long price);
// select count(*) from Items where item_name like '%{itemName}%'
int countByItemNameLike(String itemName);
// delete from Items where price beteween {price1} and {price2}
void deleteByPriceBetween(long price1, long price2);
}
Pagenation구현은 어떻게 하나?
복잡한 쿼리는 어떻게 하나?
단점