์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ํ…Œ์ŠคํŠธ] No qualifying bean of type 'tobyspring.splearn.application.required.EmailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

๐Ÿ˜Ž ์ง€์‹ in Action/๐Ÿงช

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2026. 2. 9. 19:36

๋ณธ๋ฌธ

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ผ๋ถ€

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberService' defined in file [/Users/eundms/IdeaProjects/splearn/build/classes/java/main/tobyspring/splearn/application/MemberService.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'tobyspring.splearn.application.required.EmailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

 

์ƒํ™ฉ

๋‚˜๋Š” @SpringBootTest๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ์ค‘์ด๋‹ค 

@SpringBootTest
public class MemberRegisterManualTest {
  @Autowired
  private MemberRegister memberRegister;

  @Test
  void register(){
    Member member = memberRegister.register(MemberFixture.createRegisterRequest());

    assertThat(member.getId()).isNotNull();
    assertThat(member.getStatus()).isEqualTo(MemberStatus.PENDING);
  }
}

 

์•„๋ž˜์™€ ๊ฐ™์ด MemberService๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค 

@Service
@RequiredArgsConstructor
public class MemberService implements MemberRegister {
  private final MemberRepository memberRepository;
  private final EmailSender emailSender;
  private final PasswordEncoder passwordEncoder;

  @Override
  public Member register(MemberRegisterRequest registerRequest) {
    Member member = Member.register(registerRequest, passwordEncoder);
    memberRepository.save(member);
    emailSender.send(member.getEmail(), "๋“ฑ๋ก์„ ์™„๋ฃŒํ•ด์ฃผ์„ธ์š”", "์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด์„œ ๋“ฑ๋ก์„ ์™„๋ฃŒํ•ด์ฃผ์„ธ์š”");
    return member;
  }
}

 

 

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ•ด์„ 

Spring Context์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” MemberRegister์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ,

์ด ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” EmailSender, PasswordEncoder๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค (๊ตฌํ˜„์ฒด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž„)

public interface PasswordEncoder {
    String encode(String password);
    boolean matches(String password, String passwordHash);
}

public interface EmailSender {
  void send(Email email, String subject, String body);
}

 

ํ•ด๊ฒฐ ์‹œ๋„

- @Bean์œผ๋กœ emailSender, passwordEncoder๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค 

- ๊ทธ๋ฆฌ๊ณ  MemberTestConfiguration ์€ ๋…๋ฆฝ๋œ ํŒŒ์ผ๋กœ ์กด์žฌํ•œ๋‹ค 

  @TestConfiguration
  class MemberTestConfiguration {
    @Bean
    public EmailSender emailSender(){
      return (email, subject, body) -> System.out.println("sending email" + email);
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
      return MemberFixture.createPasswordEncoder();
    }
  }

 

 

๊ทธ๋Ÿผ์—๋„ ๋™์ผํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค 

์™œ? @SpringBootTest ๊ฐ€ ๋ถ™์€ MemberRegisterManualTest๊ฐ€ MemberTestConfiguration ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค 

 

 

๋”ฐ๋ผ์„œ, @Import ๋กœ ์‚ฌ์šฉํ•จ์„ ๋ช…์‹œํ•œ๋‹ค

@SpringBootTest
@Import(MemberTestConfiguration.class)
public class MemberRegisterManualTest {
  @Autowired
  private MemberRegister memberRegister;

  @Test
  void register(){
    Member member = memberRegister.register(MemberFixture.createRegisterRequest());

    assertThat(member.getId()).isNotNull();
    assertThat(member.getStatus()).isEqualTo(MemberStatus.PENDING);
  }
}

 

์ž„์‹œ๋กœ ๊ตฌํ˜„ํ•œ DummyEmailSender ์™€ @TestConfiguration์œผ๋กœ ๋“ฑ๋กํ•œ emailSender ์ค‘์— ๋ฌด์—‡์ด ์šฐ์„ ์‹œ ๋ ๊นŒ?

https://www.inflearn.com/community/questions/1645701/testconfiguration-%EA%B4%80%EB%A0%A8-%EC%84%A4%EB%AA%85%EA%B3%BC-%EC%8B%A4%EC%A0%9C-%EB%8F%99%EC%9E%91%EC%9D%B4-%EB%8B%A4%EB%A5%B8-%EB%B6%80%EB%B6%84%EC%9D%B4-%EC%9E%88%EB%8A%94-%EA%B2%83-%EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4?_gl=1%2A1fsppw%2A_gcl_au%2AMjA1ODQxMTM2MS4xNzY0MDc3MDkxLjEyMjk2NzM3NjAuMTc2OTA4OTY5My4xNzY5MDkwMDYw%2A_ga%2AMjA5MTY0NzUxOC4xNzU1MjIxODA5%2A_ga_85V6SRKGJV%2AczE3NzA2MjkwNjQkbzUxJGcxJHQxNzcwNjQ0ODg2JGo1NSRsMCRoMA..&referrer=inflearn

 

@TestConfiguration ๊ด€๋ จ ์„ค๋ช…๊ณผ ์‹ค์ œ ๋™์ž‘์ด ๋‹ค๋ฅธ ... - ์ธํ”„๋Ÿฐ | ์ปค๋ฎค๋‹ˆํ‹ฐ ์งˆ๋ฌธ&๋‹ต๋ณ€

๋ˆ„๊ตฌ๋‚˜ ํ•จ๊ป˜ํ•˜๋Š” ์ธํ”„๋Ÿฐ ์ปค๋ฎค๋‹ˆํ‹ฐ. ๋ชจ๋ฅด๋ฉด ๋ฌป๊ณ , ํ•ด๋‹ต์„ ์ฐพ์•„๋ณด์„ธ์š”.

www.inflearn.com

 

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ