스프링데이터 + JPA/스프링 데이터 JPA

8. 공통 인터페이스 분석

sdafdq 2023. 11. 19. 18:48

이번엔

public interface MemberRepository extends JpaRepository<Member, Long> {
}

여기의 JpaRepository 등의 안으로 들어가, 분석해 볼거임.

 

package org.springframework.data.jpa.repository;

@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
	void flush();

	<S extends T> S saveAndFlush(S entity);

	<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);

	@Deprecated
	default void deleteInBatch(Iterable<T> entities) {
		deleteAllInBatch(entities);
	}

	void deleteAllInBatch(Iterable<T> entities);

	void deleteAllByIdInBatch(Iterable<ID> ids);

	void deleteAllInBatch();

	@Deprecated
	T getOne(ID id);

	@Deprecated
	T getById(ID id);

	T getReferenceById(ID id);

	@Override
	<S extends T> List<S> findAll(Example<S> example);

	@Override
	<S extends T> List<S> findAll(Example<S> example, Sort sort);
}

내부임. SpringDataJPA 기능들이 있음.

 

DB들끼리 공통적인 부분은

commons에 구현해 놨고,

SpringDataJPA는 저기다 구현해 놓음.

 

다음은

package org.springframework.data.repository;

@NoRepositoryBean
public interface ListPagingAndSortingRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
	List<T> findAll(Sort sort);
}

아무래도 페이징은 공통적인 부분이니, data.jpa가 아니라 그냥 repository임.

 

페이징, Crud는 공통적임.

 

JpaRepository는 Jpa 특화

 

package org.springframework.data.repository;

@NoRepositoryBean
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID> {
	<S extends T> List<S> saveAll(Iterable<S> entities);

	List<T> findAll();

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

}

리스트 Crud

 

package org.springframework.data.repository;

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
	<S extends T> S save(S entity);

	<S extends T> Iterable<S> saveAll(Iterable<S> entities);

	Optional<T> findById(ID id);

	boolean existsById(ID id);

	Iterable<T> findAll();

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

	long count();

	void deleteById(ID id);

	void delete(T entity);

	void deleteAllById(Iterable<? extends ID> ids);

	void deleteAll(Iterable<? extends T> entities);

	void deleteAll();
}

Crud.

 

 

@Indexed
public interface Repository<T, ID> {

}

얘가 이제 Bean으로 만드는 거 도와주는 애임.

 

 

여기서 이제 몇가지 정리해 보면,

제너릭에서

T : 엔티티

ID : 식별타입

S : 자식 타입

 

주요메서드

save() : 저장

delete() : 삭제. 내부에서 em.remove() 호출

findById() : 내부에서 em.find() 호출

getOne() : 엔티티를 프록시로 조회해 옴. 지연로딩 할 때 가져오는 그 프록시 맞음. 그걸 임의로 그 상태로 가져올 수 있게 할 수 있음. 내부에서 em.getReference() 호출

findAll() : 모든 엔티티 조회. sort나 페이징 조건을 파라미터로 옵션으로 넣을 수 있음.

 

보면, 대부분의 DB 공통기능들은 거진 다 들어있음.

 

그러면 공통적이지 않은, 예를 들어 name으로 조회해 온다던지..

 

그걸 이제부터 알아볼 거임.