Error

1. root-context.xml - @autowired 에러

wooweee 2023. 5. 12. 15:55
728x90

1. 문제 해결 방안

  • 문제 발생 코드 : NPE 터짐 -> userDao 빈이 주입 되지 않았다.
  • 해결 시도 1 : @Autowired UserDao userDao; DI 주입
// bean으로 등록한 sql 정보 가지고 오는 것
@RunWith(SpringJUnit4ClassRunner.class) // 이걸로 test 돌림
// 해당 위치에서만 bean을 찾는다. - UserDaoImpl 또한 root-context.xml에 componentScan을 등록 해줘야 한다.
// <context:component-scan base-package="com.fastcampus.crudpractice"/>
//
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class DBConnectiontest2Test extends TestCase {
    @Autowired
    DataSource ds; // 컨테이너로부터 자동 주입받는다. - 얘는 root에 직접적으로 등록했다
    @Autowired
    UserDao userDao;
//

    @Test
    public void insertUserTest2(){
        System.out.println("userDaoImpl = " + userDao);
        User user = new User("afddddsadfasfdd", "b", "c", "d.com", new Date(), "f");
        int i = userDao.insertUser(user);
        assertTrue(i==1);
    }

 

 

  • 문제 1 : 빨간줄
@Autowired
UserDao userDao; // Could not autowire. No beans of 'UserDao' type found.
  • 해결 : root-context.xml에 component scan 추가
  • 이유 : test-code에서
    @ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"}) 
    해당 location의 root에서만 bean을 찾기 때문
<!-- root-context.xml -->

<context:component-scan base-package="com.fastcampus.crudpractice"/>

 

 

  • 문제 2
    lineNumber: 30; columnNumber: 73; cvc-complex-type.2.4.c: 일치하는 와일드 카드 문자가 엄격하게 적용되지만 'context:component-scan' 요소에 대한 선언을 찾을 수 없습니다

 

  • 해결 : component scan을 사용할 수 있도록 bean에서 설정을 해줘야한다.
<?xml version="1.0" encoding="UTF-8"?>
<!--<beans xmlns="http://www.springframework.org/schema/beans"-->
<!--       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-->
<!--       xmlns:context="http://www.springframework.org/schema/context"-->
<!--       xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">-->

<!--  https://www.springframework.org/schema/context/spring-context.xsd 를 등록 해줘야지 component-scan이 작동할 수 있게 된다.-->
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!-- Root Context: defines shared resources visible to all other web components -->
    <!--    굳이 직접 등록할 필요 없이 따로 빼서 componentScan으로 부터 받아오도록 설정해도 된다.-->
<!--    한번 설정시 여러번 건들일 필요가 없는 것은 bean으로 수동등록-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url"
                  value="jdbc:mysql://localhost:3306/springbasic?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="username" value="taewan"></property>
        <property name="password" value="1234"></property>
    </bean>
<!--    여러개발자가 막 건들이는 것은 자동등록-->
    <context:component-scan base-package="com.fastcampus.crudpractice"/>
</beans>

 

 

2. 에러 해결 하면서 추가로 궁금했던점

 

2.1. 수동 등록 자동 등록 차이

  • 회사에서 협업을 하는 상황 가정
    1. 수동 등록 : 한번 설정시 여러번 건들일 필요가 없는 것
    2. 자동 등록 : 자주 건들이는 class 파일일 경우 설정파일을 여러명이 건들이면 꼬일 확률이 높기 때문에 자동 사용

 

2.2. test code 시, 설정 파일

  • 원래 test code용 xml 파일을 따로 복사본을 만들어서 그곳의 빈을 사용하도록한다.

 

2.3. spring application 돌아갈 경우 빈 등록

  • 모든 것이 다 돌아간다. - servlet-context.xml & root-context.xml
    • 2개의 차이점은 web 이냐 아니냐 차이
  • 그리고 한 곳에 빈이 없으면 다른 곳에서 서로 찾는다.