inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인터페이스 구현 문제

해결된 질문

1201

김윤재

작성한 질문수 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

김윤재

너무 감사합니다!!

서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서

0

21

2

해결했습니다

0

28

1

copilot-instruction.md

0

20

2

지금 강의가 어려우신분 추천드립니다.

0

50

1

기존의 완성된 CRUD의 Build.gradle에 security관련 dependency를 추가하면 문제가 생깁니다.

0

62

2

"폴더를 찾을 수 없습니다." 라는 응답만 계속 나옵니다.

0

43

1

EmailSender 관련 문의

0

55

1

CRA ? 질문입니다

0

48

1

[해결됨]마지막 강의 내용 수정 화면이 기능을 못하네요.

0

49

1

[해결됨]부분적으로 화면 이동이 안되는 부분이 있습니다.

0

85

6

aws 계정 생성 질문

1

66

1

조회 메서드 네이밍 질문

0

65

1

Properties 설정이 추가되었는데

0

38

1

음성불량

0

49

1

isInterrupted 질문 있다.

0

34

1

fieldInjectionTest() 질문

0

55

1

AutoAppConfig의 존재이유

0

49

1

장애 격리 관련해서 궁금한 부분이 있어요

0

56

2

RunIdIncrementer batch 5랑 6랑

1

60

2

AppConfig와 스프링 빈 질문

0

53

1

질문있습니다.

0

49

1

강의 자료를 받아볼 순 없겠나

1

77

2

코드 깃허브는 없을까요?

1

65

2

핵사고날 아키텍처 기반으로 멀티 모듈 설계 시 질문드립니다..

0

74

2