인터페이스 구현 문제

23.12.06 01:02 작성 조회수 410

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하라는건 알겠는데

 

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

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.07

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

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

김윤재님의 프로필

김윤재

질문자

2023.12.18

너무 감사합니다!!