작성
·
14
0
안녕하세요
실습 중 컴파일 오류가 왜 발생하는지 이해가 안되어 질문 남깁니다.
private final MemberRepository memberRepository;
private final EmailSender emailSender;
private final PasswordEncoder passwordEncoder;
해당 코드에서 EmailSender와 PasswordEncoder 부분에서 Could not autowire. No beans of 'EmailSender' type found.
컴파일 오류가 발생합니다.
final을 제거하면 컴파일 오류가 발생하지는 않는데요
하지만 github 페이지에 올려주신 소스코드를 보면 현재 영상 시점과 코드 구조가 100% 일치하지는 않지만 스프링 빈 관련 설정을 따로 해준 것 같진 않아보입니다만.. 토비님 영상에서는 오류가 없고 제 코드에서는 컴파일 오류가 나네요.
어떤 시점에 따로 Spring Bean 관련 설정이 되어있는게 있다던가..
아님 제가 빼먹은 부분이 있다면 알려주실 수 있으신가요?
문제가 되는 부분 전체 코드 첨부드립니다.
시간되실 때 확인 부탁드립니다.
감사합니다.
package com.ggne.splearn.application.required;
import com.ggne.splearn.domain.Email;
/**
* 이메일을 발송한다.
*/
public interface EmailSender {
void send(Email email, String subject, String body);
}
package com.ggne.splearn.domain;
public interface PasswordEncoder {
String encode(String password);
boolean matches(String password, String passwordHash);
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. jnkim님, 질문 주신 사항에 대해 도와드리겠습니다.
스프링에서 EmailSender
와 PasswordEncoder
인터페이스에 대한 컴파일 오류는 해당 타입의 빈이 스프링 컨텍스트에 등록되지 않았기 때문에 발생하는 것입니다. 이 문제를 해결하기 위해서는 이 두 인터페이스의 구현체를 빈으로 등록해야 합니다.
다음과 같은 방법으로 빈을 등록할 수 있습니다:
EmailSender
와 PasswordEncoder
인터페이스를 구현하는 클래스를 작성하고, @Component 어노테이션을 사용하여 빈으로 등록합니다.import org.springframework.stereotype.Component;
@Component
public class DefaultEmailSender implements EmailSender {
@Override
public void send(Email email, String subject, String body) {
// 이메일 발송 로직 구현
}
}
@Component
public class DefaultPasswordEncoder implements PasswordEncoder {
@Override
public String encode(String password) {
// 패스워드 인코딩 로직 구현
}
@Override
public boolean matches(String password, String passwordHash) {
// 패스워드 매칭 로직 구현
}
}
@Configuration
어노테이션을 사용하여 설정 클래스를 만들고, @Bean 어노테이션을 사용하여 빈을 등록할 수 있습니다.import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public EmailSender emailSender() {
return new DefaultEmailSender(); // DefaultEmailSender의 인스턴스 반환
}
@Bean
public PasswordEncoder passwordEncoder() {
return new DefaultPasswordEncoder(); // DefaultPasswordEncoder의 인스턴스 반환
}
}
위의 두 방법 중 하나를 사용하여 스프링 빈으로 등록하면, @Autowired
를 통해 정상적으로 주입될 것입니다.
실제로 MemberService를 위한 예제나 내용을 다루는 이 유사한 질문을 참고하시면 빈 등록과 관련된 더 많은 정보를 얻을 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.