JPA Repository Interface 상세 1

이종윤·2022년 1월 26일
1

Spring JPA

목록 보기
3/23

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를 상속받으면 위와 같은 수많은 기능을 사용 할 수 있다.!!!!!😎😎😎

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

profile
OK가자

0개의 댓글