spring 강의를 듣다가 자꾸 이상한 에러가 생겨서 찾아보게 됐는데, bean 등록 문제였다. 위 에러와 함께
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memberService' defined in class path resource [hello/hellospring/SpringConfig.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=springConfig; factoryMethodName=memberService;
요 에러도 떴는데 비슷한 원인이라 함께 기록해본다.
(아래 내용들은 추가로 코드들이 더 있지만 축약하겠다. )일단 아래처럼 코드가 되어있었는데, 타이틀로 둔 에러는 MemoryMemberRepository.java
여기에 @Repository
를 제거하니 에러가 사라졌다. member
에 대한 저장소를 하나만 지정하여야 하는데, MemoryMemberRepository.java
와 SpringDataJpaRepository.java
가 중복으로 빈이 등록되어 발생한 것이였다.
SpringDataJpaMemberRepository.java
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
MemoryMemberRepository.java
@Repository -> 지워주면 잘됨
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
}
(아래 내용들은 추가로 코드들이 더 있지만 축약하겠다.) 서두에 적은 에러 원인도 마찬가지인데, 설정 파일(SpringConfig)
에서도 MemberService
에 대한 빈등록을 하고, [MemberService.java](http://MemberService.java)
에서도 @Service
어노테이션을 통해서 빈을 등록하였기때문에 동일한 빈 등록으로 인지하여 오류가 생긴 것이다. 따라서, MemberService.java
에 @Service
를 지워주면 잘 동작하게 되었다.
MemberService.java
@Service -> 지워주면 잘됨
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
SpringConfig.java
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Autowired
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
}