인프런 커뮤니티 질문&답변

양치잘하기님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

스프링 데이터 JPA 적용2

JpaItemRepositoryV2 질문 있습니다.

작성

·

435

0

JpaRepository를 상속받으면 스프링 데이터 jpa가 구현클래스를 자동으로 만들어 준다고 하였고

현재ItemRepositoryV2 코드에서

SpringDataJpaItemRepository를 생성자로 주입받았는데

SpringDataJpaItemRepository는 인터페이스로 정의 되어있는데 인터페이스를 주입받아서 사용하는것이 가능한가요?

SpringDataJpaItemRepository가 JpaRepository를 상속받아서 확장된 인터페이스가 되었고 자동으로 구현 클래스가 생성된것은 이해하였습니다. 그렇다면 현재ItemRepositoryV2 코드에서는 자동으로 생성된 구현클래스를 자체를 주입받아서 사용해야하는것 같은데 구현클래스가 아닌 인터페이스를 주입받아서 사용하는것에 의문이 있습니다.

기본 자바문법에서는 인터페이스를 주입받아서 그 기능들을 사용하는것이 불가능한거로 알고 있었는데 어떻게 인터페이스를 주입받아서 그 기능들을 사용하는 건가요?

답변 2

1

안녕하세요. 양치잘하기님, 공식 서포터즈 y2gcoder입니다.

제가 질문을 잘 이해한 것인지 모르겠습니다.

image

 

 

  • JpaRepository 를 상속한 SpringDataJpaItemRepository는 런타임 시(스프링 애플리케이션 구동 시) Spring Boot 와 Spring Data JPA가 해당 인터페이스 스펙(부모인 JpaRepository 포함)을 보고 자동으로 구현체를 만들어 스프링 빈으로 등록합니다.

  • 그러면 JpaItemRepositoryV2 도 빈으로 등록될 때 SpringDataJpaItemRepository의 구현체를 의존관계 주입받습니다.

  • 인터페이스 타입으로 되어있지만 실제로 생성자를 통해 주입받은 인스턴스는 구현체이기 때문에, 저희는 기능을 사용할 수 있습니다.

  • 의존관계의 주입에 대해서는 스프링 핵심 원리 - 기본편을 복습해보시는 것을 추천합니다. JPA가 자동으로 만들어주기 때문에 다소 혼동이 오실 수는 있으나, 기본적인 원리 자체는 저희가 인터페이스를 만들고 인터페이스를 구현한 인스턴스를 빈으로 등록하는 것과 결코 다르지 않습니다.

  • 인터페이스 타입에 의존받고 있으나 자바는 (인터페이스의 default 메서드를 제외하고) 기본적으로 인터페이스 구현체가 실제로 일하는 것입니다. 자바 기본편에서도 저희는 인터페이스를 구현한 구현체가 실제로 동작했던 것을 떠올려보시면 좋으실 것 같습니다. Spring, Spring Data JPA 등도 결국 Java로 만들어져 있습니다

 

 

감사합니다.

답변 감사합니다 어느정도 이해가 되었습니다

0

안녕하세요, 인프런 AI 인턴입니다. 양치잘하기님의 질문에 대해 답변 드립니다.

양치잘하기님께서 질문하신 “인터페이스를 주입받아 사용하는 것이 가능한가요?“에 대한 내용은 스프링 프레임워크의 핵심 기능 중 하나인 의존성 주입(Dependency Injection)과 관련이 깊습니다. JpaRepository를 상속받는 SpringDataJpaItemRepository 같은 인터페이스를 주입받아 사용하는 것은 스프링에서 매우 일반적인 패턴입니다.

스프링 데이터 JPA에서 JpaRepository와 같은 인터페이스를 상속받는 인터페이스는 스프링이 자동으로 구현체를 생성하여 스프링 컨텍스트에 빈으로 등록합니다. 이 때문에 우리는 구현 클래스를 작성하지 않고도 해당 인터페이스의 빈을 주입받아 사용할 수 있습니다.

구체적으로, 스프링 컨테이너는 @Autowired나 생성자 주입을 통해 인터페이스 타입의 빈을 주입받을 때, 이 인터페이스를 구현하는 빈(스프링 데이터 JPA에 의해 자동 생성된 프록시 객체)을 찾아 연결해 줍니다.

질문에서 언급한 상황은 스프링 데이터 JPA의 마법 같은 자동화 기능의 예시 중 하나이며, 이러한 원리로 작동합니다. 따라서, 인터페이스만으로도 스프링에서 의존성 주입을 통해 그 기능들을 사용할 수 있게 됩니다.

이와 관련하여, 다음 질문&답변에서 비슷한 상황을 다루고 있으니 참고하시면 도움이 될 것 같습니다:

깊이 있는 이해를 위해 스프링 프레임워크와 스프링 데이터 JPA의 구동 원리에 대해 더 학습하시는 것을 추천드립니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

링크의 설명이 부족하여 추가 질문을 남깁니다. 일단 ai답변에서는 JpaRepository와 같은 인터페이스를 상속받는 인터페이스는 스프링이 자동으로 구현체를 생성하여 스프링 컨텍스트에 빈으로 등록합니다.

라고 하였는데 그렇다면 JpaRepository인터페이스를 상속받아 확장된인터페이스를 주입받아서 사용하면 스프링이 자동으로 이 인터페이스의 이름을 보고 스프링 컨테이너에서 구현클레스 빈을 찾아 인터페이스를 주입받아서 사용하는 코드에서 바꿔치기 하는건가요?

예를 들어 주입받은 인터페이스가 A 이고 스프링컨테이너에 등록된 구현클래스가 B이면

A.save()를 사용하면 스프링에 의해서 B.save()로 자동 변환이 되어지는건지 궁금합니다.