inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인터페이스 구현 문제

해결된 질문

1177

김윤재

작성한 질문수 2

1

데이터베이스 연동해서 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하라는건 알겠는데

 

이렇게 많은 함수를 오버라이딩 하라고 뜨네요.. 제가 인터페이스에 작성한 내용만 작성하고 싶은데 뭐가 문제 일까요?

김영한 jpa spring

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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 문서를 참조하시면 도움이 될 것입니다. 아래 링크에서 더 자세한 정보를 확인하실 수 있습니다.

이렇게 문제를 해결하면 기대하는 방식으로 데이터베이스와 연동하여 작업을 수행할 수 있을 것입니다.

0

김윤재

너무 감사합니다!!

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

2

2

중복내용 제보?!

1

8

2

여러 파드 환경에서 단일 실행 보장 방식

0

22

2

inheritance startegy 선택시 고려사항

0

18

1

Entity 동등성 비교

0

17

1

패키지 구분에 대해 궁금한게 있습니다

0

25

2

스프링부트 서버 에러나요

0

25

1

코드 자료

0

46

2

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

38

2

servlet과 container에 대한 질문입니다

0

28

1

RepositoryTest의 패키지 위치가 domain인 이유

0

35

2

도메인 모델에서 관계와 규칙을 구분하는 방법

0

45

2

16 강의 메세지 retryCount의 의도

0

26

2

JPA Repository 질문이 있습니다!

1

36

2

페이지네이션 처리를 쿼리에서 하는 방식 질문

1

37

1

UserService, CertificationService 책임 분리 기준 질문

0

28

1

spring initialiser 어떤걸 선택해야될지 모르겠어요

0

38

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

55

2

Json 요청 처리

1

38

2

로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.

0

28

2

Build 관련 문제 (테스트 관련 문제)

0

44

2

job, step execution 관련 질문 드립니다.

0

42

2

실무 조언 관련 질문입니다.

0

44

1

이미지 업로드와 db 트랜잭션 묶는법

0

44

1