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

0. 프리뷰

sdafdq 2023. 11. 17. 10:18

스프링 데이터 적용하려면,

 

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

JpaRepository<엔티티, ID타입>을 상속받아 인터페이스를 구현하면 된다.

 

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

이게 실제 JpaRepository 인터페이스인데,

보면 뭐 save, findAll 등, 그리고 쟤가 또 상속 받은 걸 타고 내려가다 보면 CrudRepository 라는 걸 상속 받았는데,

@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();
}

보면 이런 게 다 미리 만들어져 있다.

 

그래서, 따로 우리가 구현을 하지 않아도, 스프링 부트가 저런 걸 알아서 구현해서 빈으로 등록시켜 놓는다.

 

또 놀라운 기능은, 

public interface MemberRepository extends JpaRepository<Member, Long> {\
	List<Member> findByName(String name);
}

이런 식으로 메소드 이름을 정의해 놓으면,

그 이름을 읽어서 구현해 준다.

정말로 저 문자를 읽어서 구현해 주는 거다. findByName의 경우,

select m from member m where m.name = ?
select * from member where name=:name

이런 식 일거다.

findBy, name을 읽고 저렇게 만든 것이다.

 

 

 

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts

 

Spring Data JPA - Reference Documentation

Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

이걸 보면 Spring Data JPA의 Core concept에 대해 알 수 있다.

 

 

 

스프링 데이터 JPA는 결국 JPA를 간단하게 다루는 것이기 때문에, JPA를 잘 알고 이용해야 한다.

 

보통, 스프링 하면

Spring, JPA, SpringDataJPA, QueryDSL

이렇게 4가지를 같이 쓴다.

여기서 더 추가가 될 건 JdbcTemplate같은 정말 가끔 부득이 하게 네이티브 SQL을 다루는 정도?