흔히 spring에서는 아래와 같은 간단한 방법으로 jpaRepository 인터페이스를 만들 수 있다.
public interface PostRepository extends JpaRepository<Post, Long> { }
@Autowired PostRepository postRepository;
궁금 했던 점은 위와 같이 설정 후 다른 클래스에서 해당 jpaRepository를 DI(의존성 주입)을 통해 사용하곤 했는데 jpaRepository가 언제 어떻게 Spring의 Bean에 등록이 되는지 궁금해서 찾아보게 된 글을 정리 하겠다.
ImportBeanDefinitionRegistrar
1. SpringFrameWork의 인터페이스이며 구현체가 다양함
2. 빈을 프로그래밍을 통해서 등록할 수 있게 해줌
3. JpaRepository를 상속받은 모든 인터페이스들을 찾아서 빈으로 등록해줌
public class Freelife {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class FreelifeRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(Freelife.class);
beanDefinition.getPropertyValues().add("name", "Superman");
registry.registerBeanDefinition("freelife", beanDefinition);
}
}
@SpringBootApplication
@Import(FreelifeRegistrar.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
@Transactional
public class JpaRunner implements ApplicationRunner {
@Autowired
Freelife freelife;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("=====================");
System.out.println(freelife.getName());
}
}
@Repository
@Transactional
public class PostRepository {
@PersistenceContext
EntityManager entityManager;
public Post add(Post post) {
entityManager.persist(post);
return post;
}
public void delete(Post post) {
entityManager.remove(post);
}
public List<Post> findAll() {
return entityManager.createQuery("SELECT p FROM Post AS p", Post.class)
.getResultList();
}
}
public interface PostRepository extends JpaRepository<Post, Long> {
}
참고자료 : https://freedeveloper.tistory.com/131?category=809237
- JpaRepository<Entity, Id> 인터페이스의 전반적인 설명이 잘 되어있음!