카테고리 없음

[Spring JPA] JPA와 기본 사용법

Rulu_ 2024. 5. 25. 11:41

# 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);
}

```