인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

최윤선님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 리포지토리 테스트 케이스 작성

회원 리포지토리 테스트케이스 작성파트

작성

·

172

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예!
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

스크린샷 2025-04-17 오후 10.37.31.png.webp


@AfterEach 관련해서 clearStore함수가 import 되지 않는다고 합니다.

강의에서는 작동이 되는데..

사실 저도 이게 이해가 안가는 부분인데 어떻게 인터프리터에 import를 하지 않았는데 이 함수가 테스트 하는 쪽에서 작동이 될수 있는거죠??

다른분들도 여기까지하고 질문이 다 마무리 되지 않아서 올려봅니다..ㅠㅠ

답변 2

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

최윤선님께서 @AfterEachclearStore() 함수에 대한 의문점을 가지신 것 같습니다. 강의에서는 별다른 import 없이 해당 메서드를 이해하고 사용하고 있는데, 이 부분이 어떻게 이루어지는지 궁금하신 것 같습니다.

여기서는 clearStore() 메서드가 MemoryMemberRepository 클래스에 정의되어 있어야 테스트 코드에서 사용될 수 있습니다. @AfterEach 어노테이션은 매 테스트 후 실행할 메서드를 지정하기 때문에, 해당 메서드가 MemoryMemberRepository에서 제공된다면 import 없이 직접 사용 가능하게 됩니다.

지금 발생한 문제가 clearStore() 메서드와 관련된 컴파일 오류라는 점에서도 이를 확인할 수 있습니다. 이 메서드를 MemoryMemberRepository에 제대로 정의하지 않았거나 메서드의 반환 타입이 맞지 않아 생긴 문제로 보입니다.

관련하여, 아래 링크에서 유사한 문제와 답변을 확인하실 수 있습니다:

  1. MemberServiceTest.java AfterEach 질문 - @AfterEach와 관련된 문의입니다.
  2. 김영한 선생님 안녕하세요! 에러코드 질문입니다. - clearStore() 관련 에러 해결 방법이 안내되어 있습니다.

해당 답변들을 참고하면 clearStore() 메서드를 제대로 정의하고 사용하기 위한 방식에 대해 도움이 되실 것입니다.

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

0

dev.rudevico님의 프로필 이미지

질문자님의 전체적인 코드를 볼 수 없어서 명확한 답변을 해 드릴 수는 없으나, 가능한 선에서 최대한 설명드리자면 다음과 같습니다.

  1. clearStore() 메서드를 import할 필요는 없다.


    MemoryMemberRepositoryTest 에서 MemoryMemberRepositoryimport하고 있으므로, MemoryMemberRepository의 메서드인 clearStore()는 별도로 import하지 않아도 MemoryMemberRepository 인스턴스(repository)를 통해 호출이 가능합니다.

  2. 에러 메시지를 통한 추측


    사진상으로는 에러 메시지 전체가 보이지 않아서 답변이 제한됩니다만, 질문자님께서 다음과 같이 코드를 작성하신 것이 아닌가 추측됩니다. 맞는지 확인해주세요. Voidvoid는 다릅니다.

    • MemberRepository 인터페이스에 Void clearStore();를 선언해두었다.

    • MemoryMemberRepository 구현체에 void clearStore()로 구현을 했다.

    • 또는 위 상황의 반대 (인터페이스에서 void로 선언, 구현체에서 Void로 구현)

  3. 다음과 같이 해야함을 인지해주세요.

    • void clearStore() 메서드는 인터페이스에는 선언하지 않고, MemoryMemberRepository 구현체에만 있는 메서드이다(즉, override도 선언하지 않는다).

또한 제 코드를 첨부할테니 질문자님의 코드와 비교바랍니다. 해결되지 않는다면 질문자님의 다음 코드들을 댓글로 달아주세요.

  • MemberReposiotry 인터페이스

  • MemoryMemberReposiotry 구현체

  • 실행시 에러메시지 전체

 

package hello.hello_spring.repository;

import hello.hello_spring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
    // 인터페이스에는 clearStore() 있으면 안 된다.
}
package hello.hello_spring.repository;

import hello.hello_spring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {

    // 실무에서는 ConcurrentHashMap
    private static Map<Long, Member> store = new HashMap<>();
    // 실무에서는 AtomicLong
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        // mapInstance.values()는 Collection<V>를 리턴한다.
        // V는 map의 value의 타입
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    // 해당 구현체에만 있는 메서드. override x.
    public void clearStore() {
        store.clear();
    }
}