rebuild
12
2020-09-20 10:59:44 작성 2020-09-20 12:45:08 수정됨
4
147

Spring bean생성 오류


안녕하세요. 인강을 통해 spring 공부를 하고있는데 bean 생성 에러가 발생하여 문의 드립니다.

추가로 index.jsp에서 [ response.sendRedirect("main"); ]가 에러가 발생하는데 답변 부탁드립니다.

(동일 위치에 있으니 상대경로 값으로 "main" 값만 주면 될텐데, 왜 에러가 발생하는지 모르곘습니다.)


1. 에러명은 아래와 같습니다.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'reservationController': Unsatisfied dependency expressed through field 'reservationService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'kr.or.connect.reservation.service.ReservationService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}


2. 소스 구성


3. 소스별 bean 생성 관련된 어노테이션 태그 설정

@Configuration
@ComponentScan(basePackages = {"kr.or.connect.reservation.dao", "kr.or.connect.reservation.service"})
@Import({DBConfig.class})
public class ApplicationConfig {


@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.connect.reservation.controller"})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {


아래 @Autowired에 (required=false)를 추가할 경우 에러 미발생. 에러발생 지점으로 파악됩니다.

@Controller
public class ReservationController {
	
	@Autowired 
	ReservationService reservationService;


ReservationService 인터페이스에는 어노테이션이 없습니다.

@Service
public class ReservationServiceImpl implements ReservationService{
	@Autowired
	CategoryDao categoryDao;
	
	@Autowired
	FileinfoDao fileinfoDao;
	
	@Autowired
	ProductDao productDao;


Dao 각각에 @Repository 추가

@Repository
public class CategoryDao {
@Repository
public class FileinfoDao {
@Repository
public class ProductDao {


Bean 생성을 위해서는 @ComponentScan을 통한 자동 생성 명령과 bean등록을 위한 @Component설정이 필요한데 @Component 기능이 포함된 @Controller, @Service, @Repository을 활용하여 bean등록과 @Autowired를 통한 의존성 주입을  하였습니다.

0
  • 답변 4

  • 묘에핀꽃
    10
    2020-09-20 11:38:01

    serviceImpl 패키지가 ComponentScan 에 없어서 그런 것 같네요.


  • rebuild
    12
    2020-09-20 12:22:14 작성 2020-09-20 12:22:33 수정됨

    @묘에핀꽃 에러 그대로 발생합니다.


    @ComponentScan(basePackages = {"kr.or.connect.reservation.dao"})
    @Service
    public class ReservationServiceImpl implements ReservationService{

    이렇게 추가 했는데 잘못 추가했을까요?

  • 묘에핀꽃
    10
    2020-09-20 20:05:28 작성 2020-09-20 20:06:08 수정됨


    @Configuration
    @ComponentScan(basePackages = {"kr.or.connect.reservation.dao", "kr.or.connect.reservation.service"})
    @Import({DBConfig.class})
    public class ApplicationConfig {
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = {"kr.or.connect.reservation.controller"})
    public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {

    여기서 보면 dao, service, controller 이 세개의 패키지만 스캔해서 빈으로 등록합니다.


    @Service
    public class ReservationServiceImpl implements ReservationService{
    	@Autowired
    	CategoryDao categoryDao;
    	
    	@Autowired
    	FileinfoDao fileinfoDao;
    	
    	@Autowired
    	ProductDao productDao;

    하지만 이 클래스는 serviceImpl 패키지에 있어서 스캔 대상이 아니라 빈으로 등록되지 않은 것 같습니다.

  • rebuild
    12
    2020-09-21 10:27:14

    @묘에핀꽃 감사합니다. 해결했습니다!

    처음에 하신말씀을 제가 잘못이해했네요;;;

    @ComponentScan의 service -> serviceImpl로 수정하여 해결했습니다.

    @Configuration
    @ComponentScan(basePackages = {"kr.or.connect.reservation.dao", "kr.or.connect.reservation.serviceImpl"})
    @Import({DBConfig.class})
    public class ApplicationConfig {
    
    }

    Service는 단순 인터페이스라 기존 service를 serviceImpl로 대체하였습니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.