Dev/JPA

JPA Repository Interface 상세 1

OK-가자 2022. 3. 2. 17:22

JPA Repository Interface

Entity

자바객체와 DB 테이블과 연결해주는 것이 ORM 이라고 했는데,
여기서 자바객체를 Entity라고 한다.
그래서 어노테이션 엔티티를 사용하여 쉽게 엔티티를 나타낼수 있다.

🤔 왜 오류가 뜰까?
기본적으로 엔티티에는 기본키가 있어야 하기때문이다.

@Id
@GeneratedValue //autoincrement
private long id;

를 추가해 주자.

✅ 이렇게 User Entity가 만들어졌다.

그럼 해당객체를 어떻게 저장하고 어떻게 조회할까?
바로 리파지토리를 이용한다.

Repository

✅ 이전에 설명했던 Spring Data JPA 지원해주는것이 여기다. 자바 인터페이스를 선언해주고 JpaRepository<Entity Type, PK>를 상속받는거 만으로 많은 JPA 관련기능을 지원해준다.

public interface UserRepoitory extends JpaRepository<User, Long> {

✅ 그럼 테스트 한번 해보자 TEST하는 습관!!

@SpringBootTest //SpringConext를 로딩하여 Test에 활용하겠다.
class UserRepoitoryTest {

    @Autowired
    private UserRepoitory userRepoitory;

    @Test
    void crud(){  // create, read, update, delete
        userRepoitory.save(new User()); //User 생성하고 저장.
        System.out.println(" >>> " + userRepoitory.findAll());
    }

}

🤔 그럼 save나 findAll 같은 메서드들은 어디서 가져오고 또 얼마나 있을까?

JpaRepository

    // 조건x 테이블 전체값 가져오기, Test 쓰이지만 실제서비스에선 성능때문에 잘 사용하지 않음.
    @Override
    List<T> findAll();

    // sort값을 즉 정렬 값 추가된 조회
    @Override
    List<T> findAll(Sort sort);

    // Id값을 List로 받아서 In 구문으로 조회하여 여러가지 레코드를 조회
    @Override
    List<T> findAllById(Iterable<ID> ids);

    // entity를 리터럴로 받아서 모두 저장
    @Override
    <S extends T> List<S> saveAll(Iterable<S> entities);

    // 현재 JPA컨텍스트에 가지고 있는 DB값을 DB에 반영하도록 하는 메서드
    void flush();

    // 위와 비슷 저장하고바로반영
    <S extends T> S saveAndFlush(S entity);
    <S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

    // Entity를 리터러블(리스트상위인터페이스) 형식으로 받아서 한꺼번에 지운다.
    default void deleteInBatch(Iterable<T> entities){deleteAllInBatch(entities);}

       // 조건없이 해당 엔티티 즉 테이블을 통제로 지운다. 실제로 안씀.FindAll이랑 비슷
    void deleteAllInBatch(Iterable<T> entities);

       // 해당 ID값을 받아서 값을 조회한다.
    T getOne(ID id);
    T getById(ID id);

    // 예시를 이용한 findAll도 제공한다.
    <S extends T> List<S> findAll(Example<S> example);
    // 예시 + 정렬 값을 이용한 findAll도 사용 가능하다.
    <S extends T> List<S> findAll(Example<S> example, Sort sort);
PagingAndSortingRepository
    //Pageable을 사용해 쉽게 페이징 하도록 하는 메서드.
    Page<T> findAll(Pageable pageable);
CrudRepository
    // 우리가 사용하는 대부분이 여기 있다.

    // 엔티티에 대한 저장
    <S extends T> S save(S entity);

    // 리스트타입을 한번에 저장
    <S extends T> Iterable<S> saveAll(Iterable<S> entities);

    // Optional 타입으로 랩핑해서 Id값으로 객체를 찾는 것 findOne과 조금 다름.
    Optional<T> findById(ID id);

    // 해당객체의 존재 여부확인
    boolean existsById(ID id);


    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> ids);

    // 전체 엔티티의 개수 확인. 페이징할때 유용
    long count();

    // id값을 엔티티를 인자로 받아서 삭제.
    void deleteById(ID id);
    void delete(T entity);
    void deleteAllById(Iterable<? extends ID> ids);
    void deleteAll(Iterable<? extends T> entities);
    void deleteAll();

이렇게 소위말해 ✌껍데기✌ 리파지토리를 만들어서 JpaRepository를 상속받으면 위와 같은 수많은 기능을 사용 할 수 있다.!!!!!😎😎😎

이해하거나 익숙해지는건 써보면서 하자!!!!!

'Dev > JPA' 카테고리의 다른 글

JPA 쿼리메소드(QueryMethod)  (0) 2022.03.02
JPA Repository Interface 상세 2  (0) 2022.03.02
영속성 컨텍스트  (0) 2022.03.02
JPA 실습 해보자 1(H2 DB)  (0) 2022.03.02
드디어 JPA ...  (0) 2022.03.02