초짜라 이제 첨 공부하는데
public interface ProductRepository extends JpaRepository[Product, Long] {}
이런 식으로 리퍼지토리 인터페이스를 하나 정의했고
이 인터페이스의 구현 클래스를 아직 안 만들었는데도
DAO 클래스 생성자에서 ProductRepository가 잘 주입되더라고
구현한게 없는데 대체 뭐가 주입된거임?
JpaRepository 인터페이스 메소드들이 다 기본 정의되어있으니 ProductRepository도 마찬가지고
그럼 예를 구현한 익명 클래스의 인스턴스가 주입됨??
스프링이 만들어서 빈 등록 해줌
https://www.quora.com/Why-dont-you-have-to-implement-all-the-methods-in-an-interface-if-you-are-injecting-a-repository-class-in-Spring-Boot
That's because Spring implements them for you by creating a class that implements your interface. It does it at runtime.
JPARepository 계층 구조를 보면 CRUD 리포지토리랑 페이징 리포지토리를 상속하는 구조로 되어있는데 이미 다 구현되어있는걸 갖다 쓰기만 하면 되는거임 이게 가능한 이유는 넣고 지우고 바꾸고 꺼내는건 어떤 비즈니스에서도 누구나 다 하는 똑같은 행위거든 하나 꺼낼지 여러개 꺼낼지 릴레이션들도 다 꺼낼지 등등 다 비슷한 문제들로 귀결되기 때문에 프레임 워크에서 기능을 만들어둘 수 있는거임
Controller-Service-Repository 구조와 시큐리티 관련 필터 체이닝 구조도 프레임워크 레벨에서 다 만들어둘 수 있는 이유도 똑같이 설명할 수 있음
본문 질문의 핵심은 인터페이스 내 기본 구현들이 존재하는거에 대한게 아니라 인터페이스만 있는데 어떻게 빈이 등록되냐는거 아닌가?
스프링에서 동적으로 클래스를 만들어주는걸 몰랐던거 같은데
그쪽에 대한 얘기였나 그쪽이 훨씬 더 할 얘기가 많긴한데 거기까진 나도 뜯어보고 확인해본건 아니라 뭐라 말할 수는 없을듯 리플렉션, cglib, 프록시 이쪽 공부해야 되는데 지금 수준에 이거 공부하면 주화입마 걸릴텐데 ㅋㅋ
챗gpt로 공부해아 - dc App
스프링에서 리플렉션으로 자동으로 구현체를 만들어줌니다