인터페이스 구현 문제
데이터베이스 연동해서 db의 데이터를 조회하고 싶은데 문제가 있어서 질문드립니다.
MemberRepository(인터페이스)
package com.project.web.repository;
import com.project.web.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface MemberRepository extends JpaRepository<Member,Long>{
Optional<Member> findByIdAndPw(String id, String pw);
}
JpaMemberRespository
package com.project.web.repository;
import com.project.web.domain.Member;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.util.Optional;
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
Optional<Member> findByIdAndPw(String id, String pw){
return null;
};
}
이렇게 작성했는데
Class 'JpaMemberRepository' must either be declared abstract or implement abstract method 'findAll()' in 'JpaRepository이런 오류가 뜹니다. 함수를 implements하라는건 알겠는데

이렇게 많은 함수를 오버라이딩 하라고 뜨네요.. 제가 인터페이스에 작성한 내용만 작성하고 싶은데 뭐가 문제 일까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
오류 메시지에 따르면 JpaMemberRepository 클래스가 JpaRepository 인터페이스를 상속받고 있기 때문에, JpaRepository가 제공하는 추상 메서드들을 모두 구현해야 한다는 것입니다. JpaRepository는 많은 CRUD 기능을 제공하는데, 여기에는 findAll() 메서드 뿐만 아니라 save(), delete() 등 여러 메서드가 포함됩니다.
JpaRepository 인터페이스를 상속받는 것은 Spring Data JPA가 제공하는 편리한 기능을 사용하고자 할 때 유용합니다. 이 인터페이스에는 이미 많은 표준 CRUD 메서드들이 정의되어 있어, 개발자가 직접 이러한 CRUD 만 사용할 경우 별도로 구현할 필요가 없습니다.
JpaMemberRepository 클래스에서 JpaRepository 인터페이스를 직접 구현하기보다는, Spring Data JPA에서 제공하는 기능을 이용하는 것이 좋습니다. Spring Data JPA가 JpaRepository 인터페이스를 상속받은 인터페이스를 바탕으로 프록시를 생성하고, 필요한 메서드들을 자동으로 구현해 줍니다.
만약 실제 데이터베이스와의 연동 로직을 직접 구현하고자 한다면, MemberRepository 인터페이스를 JpaRepository가 아닌 Repository 또는 CrudRepository로부터 상속받거나, 필요한 메서드만 선택적으로 제공하는 사용자 정의 인터페이스를 작성할 수 있습니다. 이때는 상속받은 인터페이스에 정의된 메서드만 구현하면 됩니다.
예를 들면 다음과 같습니다:
public interface MemberRepository extends CrudRepository<Member, Long> {
Optional<Member> findByIdAndPw(String id, String pw);
}
이 경우 기본적인 CRUD 기능 대신 findByIdAndPw 메서드만 구현하며, 직접 클래스 안에 이 메서드에 대한 로직을 구현할 수 있습니다.
하지만 JpaRepository를 사용할 때는, JpaMemberRepository와 같이 직접 구현 클래스를 작성할 필요가 없습니다. Spring Data JPA를 정확히 설정하고, 필요한 메서드의 시그니처를 인터페이스에서 선언하여 사용해야 합니다.
자세한 내용은 Spring Data JPA 문서를 참조하시면 도움이 될 것입니다. 아래 링크에서 더 자세한 정보를 확인하실 수 있습니다.
이렇게 문제를 해결하면 기대하는 방식으로 데이터베이스와 연동하여 작업을 수행할 수 있을 것입니다.
build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)
0
4
1
Inner class로 Config를 지정하는 이유
0
14
1
네이버 API | '검색 - 책' API 제공 중단
0
30
2
Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.
0
41
2
장치 의존성과 CSR
0
32
1
테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.
0
25
1
[영한님]Spring Boot 및 프로젝트 생성
0
51
2
리뉴얼 시기
0
42
2
JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문
0
54
3
강의 요청 문의
0
39
2
클로드코드 명령어-대화&세션관리 수업 자료
0
40
1
PlatformTransactionManager, ResourcelessTransactionManager 질문
1
64
2
자료 한번에 다운받기
0
32
1
스프링 빈 등록 방법 2가지 다 알아야하는 이유
0
57
1
mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,
0
26
1
설계 트레이드 오프 링크 접속 안됨
0
84
2
테스트 질문, 어떤것을 사용할것인것에 대해서
0
45
1
깃허브주소 궁금합니다.
0
36
2
mariaDB 설정
0
32
1
섹션4 퀴즈 오타있어요.
0
46
1
service-discovery 프로세스 가동 이유
0
48
1
AWS 배포 성능테스트
0
73
2
퀴즈가 안열려요
0
74
2
7강 보고 있는데요.. 글자가 너무 작아요
0
40
1





