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&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. 수동 등록 자동 등록 차이
- 회사에서 협업을 하는 상황 가정
- 수동 등록 : 한번 설정시 여러번 건들일 필요가 없는 것
- 자동 등록 : 자주 건들이는 class 파일일 경우 설정파일을 여러명이 건들이면 꼬일 확률이 높기 때문에 자동 사용
2.2. test code 시, 설정 파일
- 원래 test code용 xml 파일을 따로 복사본을 만들어서 그곳의 빈을 사용하도록한다.
2.3. spring application 돌아갈 경우 빈 등록
- 모든 것이 다 돌아간다. - servlet-context.xml & root-context.xml
- 2개의 차이점은 web 이냐 아니냐 차이
- 그리고 한 곳에 빈이 없으면 다른 곳에서 서로 찾는다.