작성
·
172
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예!
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
@AfterEach 관련해서 clearStore함수가 import 되지 않는다고 합니다.
강의에서는 작동이 되는데..
사실 저도 이게 이해가 안가는 부분인데 어떻게 인터프리터에 import를 하지 않았는데 이 함수가 테스트 하는 쪽에서 작동이 될수 있는거죠??
다른분들도 여기까지하고 질문이 다 마무리 되지 않아서 올려봅니다..ㅠㅠ
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
최윤선님께서 @AfterEach
와 clearStore()
함수에 대한 의문점을 가지신 것 같습니다. 강의에서는 별다른 import 없이 해당 메서드를 이해하고 사용하고 있는데, 이 부분이 어떻게 이루어지는지 궁금하신 것 같습니다.
여기서는 clearStore()
메서드가 MemoryMemberRepository
클래스에 정의되어 있어야 테스트 코드에서 사용될 수 있습니다. @AfterEach
어노테이션은 매 테스트 후 실행할 메서드를 지정하기 때문에, 해당 메서드가 MemoryMemberRepository
에서 제공된다면 import 없이 직접 사용 가능하게 됩니다.
지금 발생한 문제가 clearStore()
메서드와 관련된 컴파일 오류라는 점에서도 이를 확인할 수 있습니다. 이 메서드를 MemoryMemberRepository
에 제대로 정의하지 않았거나 메서드의 반환 타입이 맞지 않아 생긴 문제로 보입니다.
관련하여, 아래 링크에서 유사한 문제와 답변을 확인하실 수 있습니다:
@AfterEach
와 관련된 문의입니다.clearStore()
관련 에러 해결 방법이 안내되어 있습니다.해당 답변들을 참고하면 clearStore()
메서드를 제대로 정의하고 사용하기 위한 방식에 대해 도움이 되실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
질문자님의 전체적인 코드를 볼 수 없어서 명확한 답변을 해 드릴 수는 없으나, 가능한 선에서 최대한 설명드리자면 다음과 같습니다.
clearStore() 메서드를 import할 필요는 없다.
MemoryMemberRepositoryTest
에서 MemoryMemberRepository
를 import하고 있으므로, MemoryMemberRepository
의 메서드인 clearStore()
는 별도로 import하지 않아도 MemoryMemberRepository
인스턴스(repository
)를 통해 호출이 가능합니다.
에러 메시지를 통한 추측
사진상으로는 에러 메시지 전체가 보이지 않아서 답변이 제한됩니다만, 질문자님께서 다음과 같이 코드를 작성하신 것이 아닌가 추측됩니다. 맞는지 확인해주세요. Void
와 void
는 다릅니다.
MemberRepository
인터페이스에 Void clearStore();
를 선언해두었다.
MemoryMemberRepository
구현체에 void clearStore()
로 구현을 했다.
또는 위 상황의 반대 (인터페이스에서 void
로 선언, 구현체에서 Void
로 구현)
다음과 같이 해야함을 인지해주세요.
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();
}
}