• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

강의를 따라가다가 하나의 빈이 필요한데, 2개의 빈이 조회된다고 나오면서 스프링 서버가 띄워지지 않습니다.

24.04.16 22:29 작성 조회수 145

0

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

[질문 내용]

스프링 핵심 원리 - 기본편 수강 도중 영한님 코드를 보면서 실습하면서 진행하다가 스프링을 띄우면 갑자기 아래의 오류가 발생합니다.

 

Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found:
	- memoryMemberRepository: defined in file [/Users/wonjunjeong/study/inflearn/kim/project/core/out/production/classes/hello/core/member/MemoryMemberRepository.class]
	- memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]

 

@Component 애노테이션 때문이라고 생각되는데요, 코드를 보시면 아시겠지만, 이 애노테이션을 교재에 나와있는 것처럼 MemoryMemberRepository, RateDiscountPolicy, MemberServiceImpl, OrderServiceImpl에다가만 넣었습니다.그랬는데도 위와 같은 오류가 발생하는 게 이해가 가질 않아 질문 드립니다.분명 AutoAppConfig 클래스에서 excludeFilters로 Configuration.class를 제외했는데도 불구하고 이런 빈 오류가 발생하는 이유를 모르겠습니다.전체 코드를 올리고 싶지만 파일 업로드가 안 되는 것 같아, AppConfig와 MemoryMemberRepository 두 코드만 아래에 올리겠습니다.

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    // @Bean: memberService -> new MemoryMemberRepository()
    // @Bean: orderService -> new MemoryMemberRepository()

    @Bean
    public MemberRepository memberRepository() {
        System.out.println("Call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

    @Bean
    public MemberService memberService() {
        System.out.println("Call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {
        System.out.println("Call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

}

 

package hello.core.member;

import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;

@Component
public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }

}

답변 1

답변을 작성해보세요.

0

David님의 프로필

David

2024.04.16

안녕하세요. Sully님, 공식 서포터즈 David입니다.

configuration exclude 필터가 제대로 동작하지 않았을 수 있습니다. 이 부분을 다시 확인해 주세요.

원인은 AppConfig 내 MemoryMemberRepository와 MemoryMemberRepository 클래스 둘 모두 빈으로 등록되어서 발생한 문제입니다.

감사합니다.

Sully님의 프로필

Sully

질문자

2024.04.17

package hello.core;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}


저는 이 부분에서 오류를 찾아볼 수 없는데 혹시 어떤 오류일까요??

David님의 프로필

David

2024.04.17

https://www.inflearn.com/questions/1242623

위 글 답변 확인 부탁드립니다:)