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 |