# JPA란?
- ORM 기술 표준으로 사용되는 인터페이스 모음
- 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크
# ORM이란?
class와 관계데이터베이스의 테이블을 연결한다는 뜻으로 기술적으로는 객체를 관계게이터베이스 테이블에 자동으로 영속화 해주는 것
## 장점
- SQL문을 작성하지 않고 Method를 통해 DB를 조작할 수 있음
- 각종 객체에 대한 코드를 별도로 작성하여 가독성 높임
- 객체지향적인 코드 작성 가능
- 유지보수 및 리팩토링 유리
- 사용하는 DB가 바뀌더라도 쿼리를 수정할 필요 없음
## 단점
- 프로젝트의 설계가 잘못된 경우 속도저하 + 일관성을 무너뜨림
- 복잡하고 무거운 Query는 속도를 위해 별도의 SQL문을 작성해야함
- 러닝커브 존재
# 사용법(엔티티)
## @Entity
- 일대일로 매칭되는 객체 단위로 Entity 객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미
- 객체 인스턴스의 유일한 키값(Primary Key)를 표현하기 위해 `@Id` 어노테이션 사용
- 테이블 명칭과 Entity 클래스의 이름이 다르면 `@Table` 어노테이션으로 명시
## @Column
- 기본적으로 생략 가능 생략하면 동일한 이름으로 테이블 칼럼 생성
- `name` 속성을 명시하면 명시한 이름으로 테이블 칼럼 생성
- length 속성으로 길이 명시 가능
- 큰 숫자(BigDecimal)일 경우 percision, scale로 최대 길이 지정 가능
## @Id
- Primary Key 값 지정
## @GeneratedValue
- 기본키 값을 JPA에게 위임하기 위해 사용하는 어노테이션
- startegy속성을 GenerationType.IDENTITY로 지정해 자동 증가하도록 알릴 수 있음
- 다른것도 있긴한데 보통 안쓰는듯?
## 연관관계 관리
- @OneToMany
- @ManyToOne
- 기타등등
```java
@Entity
public class Time {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "time_value")
private String value;
public Time(Long id, String value) {
this.id = id;
this.value = value;
}
public Time(String value) {
this.value = value;
}
public Time() {
}
public Long getId() {
return id;
}
public String getValue() {
return value;
}
}
```
# 사용법(Repository)
JPA에서 제공하는 Method를 사용하기 위해서는 `JpaRepository` 를 확장한 Repository interface를 구현해야한다.
- 기본적인 CRUD 메소드는 구현하지 않아도 제공
- save(), findById(), existsById(), count(), deleteById(), delete(), deleteAll()
- QueryByExampleExecutor 인터페이스에는 더 다양한 CRUD 메소드 제공
- findOne(), findAll(), count(), exists()
- 메소드 명명 규칙
- 어떤 값을 통해 데이터를 찾고 싶다(삭제하고 싶다) ⇒ findBy~ deleteBy~
- 여러 조건을 통해 데이터를 찾고 싶다 (삭제하고 싶다) ⇒ And , Or
- 그외는 알아서 찾아보기
- 조건을 통해서 찾을 땐 매개변수 순서와 메서드에 적힌 필드 순서가 같아야함
주의사항: @Repository 어노테이션을 붙이면 안된다
```java
public interface ReservationRepository extends JpaRepository<Reservation, Long> { //매핑할 엔티티, PrimaryKey 타입
List<Reservation> findByDateAndThemeId(String date, Long themeId);
List<Reservation> findByMemberId(Long memberId);
List<Reservation> findByThemeIdAndDateAndTimeId(Long themeId, String date, Long timeId);
}
```