Jpa를 사용할 때, JpaRepository<엔티티, ID타입> 를 상속해서 Repository를 만든다.
public interface MemoRepository extends JpaRepository<Memo, Long> { }
JpaRepository를 상속하면, Spring Data JPA가 인터페이스에 대해서 프록시 구현체를 만든 뒤, 구현체를 주입해준다.(의존성 주입)
쿼리를 수행하는 핵심 메소드들의 간단한 예시
@Autowired
MemoRepository memoRepository;
~ ~
memoRepository.save(memo);
~ ~
Optional<Memo> result = memoRepository.findById(id);
~ ~
관련 interface들의 상속관계

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { }
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> { }
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> { }
@Indexed
public interface Repository<T, ID> { }
@NoRepositoryBean
프록시 빈으로 등록하지 않게 해주는 어노테이션이라고 한다.
그래서 중간 단계의 Repository 들을 빈으로 등록하지 않으려고 붙여져있다
JpaRepository 상속시 @Repository를 붙여주지 않아도 되는 이유
- JpaRepository를 상속하면 @Repository가 없어도 빈으로 등록되는데, 이는 컴포넌트 스캔에 의해 빈으로 동작하는 것이 아니라, spring data에서 해당 인터페이스를 구현한 클래스를 찾아서 사용한다.
실제로는 인터페이스를 구현한 클래스를 바로 사용하는게 아니라, 스프링이 동적으로 임의의 구현 클래스를 생성하고, 내가 구현한 클래스를 연결해준다.
- spring data JPA는 스프링이 만들어서 제공하는 컴포넌트이므로, @Repository를 생략해도 JPA 관련 예외를 스프링 예외로 변환해서 제공해준다. 따라서 @Repository를 통한 예외처리 기능이 이미 포함되어 있다
'Spring > DB연동' 카테고리의 다른 글
| JPA의 핵심 클래스들 (1) | 2024.05.09 |
|---|---|
| Resource , PathMatchingResourcePatternResolver (0) | 2024.04.25 |
| SqlSessionFactoryBean , MapperScan , DataSource (0) | 2024.04.25 |
| MyBatis, SqlSession , SqlSessionFactory, DB와 상호작용 (0) | 2024.04.25 |
| ORM, JPA , Hibernate , SpringData JPA (0) | 2024.04.19 |