게시글
질문&답변
AllBeanTest에서 @Autowired 유무
맞습니다!DiscountService는 스프링 컨테이너 생성자를 호출할 때 클래스 정보를 넘겨주기 때문에 스프링 빈으로 자동 등록이 되고, DiscountService에서는 생성자가 단 하나이기 때문에 @Autowired를 생략할 수 있습니다.
- 0
- 2
- 174
질문&답변
싱글톤인데 다른 인스턴스가 조회되는 이유는 뭘까요?
해당 문제가 궁금해서 들어오신 분들 아래 링크로 가시면 제가 비슷한 질문에 답변 달아놓았습니다.https://www.inflearn.com/community/questions/1504874
- 0
- 2
- 639
질문&답변
NoSuchBeanDefinitionException 오류
AppConfig 설정에서 bean 이름(=메서드 이름)이 MemberRepository인 상태입니다. 그런데 getBean()에서는 bean 이름을 "memberRepository"로 주고 찾으라고 하여 예외가 발생합니다.
- 0
- 2
- 241
질문&답변
테스트 두개를 동시에 돌렸을 경우 왜 밸류값이 달라지는 건가요??
제가 스프링은 아직 배워가는 단계라 답변이 정확하지는 않을 수도 있으나 제가 이해한 내용을 기반으로 설명드리겠습니다. (config 파일에 @Configuration 애노테이션을 달았다는 가정하에) 스프링 컨테이너는 질문자님이 말씀하신 것처럼 싱글톤으로 작동하는 것이 맞습니다.다만, 각 Test는 독립적으로 실행되기 때문에 다음과 같이 진행됩니다.각 테스트마다 현재 테스트에 대한 테스트 클래스의 인스턴스 생성 이 과정에서 field(컨테이너)도 당연히 초기화(이때 컨테이너는 싱글톤 컨테이너가 맞음)해당 테스트 진행해당 테스트 완료시 사용한 인스턴스 정리(따라서 다음 테스트에서는 새롭게 컨테이너를 초기화) (즉 다음 테스트에서는 컨테이너 자체가 다른 컨테이너이고, bean도 새로 생성해서 넣기 때문에 그 참조도 당연히 다름)따라서 동일한 이름의 bean이지만 각 테스트가 시작할 때 새로 생성되고, 테스트 종료시에 제거되기 때문에 그 참조가 다르게 출력되는 것입니다.
- 0
- 2
- 73
질문&답변
인터페이스의 경우에도 상속이라는 말을 사용하나요?
인터페이스A에는 메서드들이 추상적으로 선언만 되어있습니다.클래스A가 인터페이스A를 부모로 하는 경우에는 인터페이스A에 선언된 메서드들을 실제로 정의해야 합니다. 이를 '구현'이라고 합니다.인터페이스B가 인터페이스A를 부모로 하는 경우에는 부모인 A에 선언된 메서드를 정의할 수도 없고, 정의할 필요도 없습니다. 왜냐하면 B역시 인터페이스이기 때문에 모든 메서드는 '정의'가 아닌, '선언'된 추상 메서드여야 하기 때문입니다. 따라서 인터페이스B는 인터페이스A를 '구현'하는 것이 아니라, '상속'한다고 표현합니다. 만약 아래와 같은 상황에서 InterfaceB를 '구현'하는 ClassB가 있다고 가정하면, ClassB는 InterfaceB와 InterfaceA에 선언된 메서드들을 모두 구현해야 합니다.class ClassA implements InterfaceA { ... } interface InterfaceB extends InterfaceA { ... }
- 0
- 2
- 53
질문&답변
JPA와 NoSQL의 관계에 대해 질문드립니다.
지금은 대충 알아듣기만 하는 수준이지만, 나중에 제 수준이 올라가면 되게 도움될 것 같은 질문과 답변이네요!! 감사합니다.
- 2
- 2
- 1.7K
질문&답변
회원가입 테스트 오류
H2 데이터베이스 웹 콘솔에서 DELETE FROM MEMBER; 쿼리를 날려서 MEMBER 테이블을 비운다.테스트 클래스에 @Transactional 애노테이션을 붙인다.위 두 가지가 모두 충족되어야 합니다. 질문자님께서는 2번 조건만 충족하신 것으로 판단됩니다.
- 0
- 2
- 99
질문&답변
Memberrepository 클리어할때
질문자님 말씀대로 MemberService 안의 MemoryMemberRepository 객체와 MemberServiceTest 안의 MemoryMemberRepository 객체는 서로 다른 것이 맞습니다.하지만 어떤 MemoryMemberRepository 객체이더라도 결국 그 내부의 Map과 sequence는 static이기 때문에 결국 항상 같은 Map에 대해서 추가, 삭제하는 것입니다.public class MemoryMemberRepository implements MemberRepository { // 실무에서는 ConcurrentHashMap private static Map store = new HashMap(); // 실무에서는 AtomicLong private static long sequence = 0L; ... }
- 0
- 2
- 104
질문&답변
assertj 에 해당하는 Assertions 이 import가 상단에 되지 않는이
제 경우에는 둘 중 하나의 Assertions가 먼저 import되어 있다면, 나머지 하나가 되지 않더라고요. 사용되지 않는 한 놈은 import 지워버리면 정상적으로 import되었습니다.
- 0
- 3
- 200
질문&답변
회원 리포지토리 테스트케이스 작성파트
질문자님의 전체적인 코드를 볼 수 없어서 명확한 답변을 해 드릴 수는 없으나, 가능한 선에서 최대한 설명드리자면 다음과 같습니다.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 findById(Long id); Optional findByName(String name); List 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 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 findById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional findByName(String name) { // mapInstance.values()는 Collection를 리턴한다. // V는 map의 value의 타입 return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List findAll() { return new ArrayList(store.values()); } // 해당 구현체에만 있는 메서드. override x. public void clearStore() { store.clear(); } }
- 0
- 2
- 137