[Spring 오류] jdbcTemplate (NullPointerException 오류)(2)

2021. 4. 8. 01:07 Spring Framework/Spring 오류

이전에 이어서 jdbcTemplate (NullPointerException 오류)가 발생하는 실질적인 원인에 대해서 알아보고자한다.

우선 사전에 알아야할 것은 아래 두개가 선행되어야 한다.

[Spring Framework/Spring 오류] - [Spring 오류] 스프링 404 오류가 발생할 경우(2)

[Spring Framework/Spring 오류] - [Spring 오류] jdbcTemplate (NullPointerException 오류)(1)

 

아래 사진에서 표시했던 부분이 실질적인 오류가 발생하는 부분이다.

아래 회원가입 폼은 회원가입을 진행하면 SchoolDAO의 insert가 진행된 후 list로 이동하는 폼이다.

그럼 등록하기를 진행하면 어떻게 되는지 확인하도록하자

아래 사진에서 주의깊게 볼 점은 SchoolDAO 생성자 생성이다.

분명 아까 join.jsp를 실행할 때 SchoolDAO 생성자가 생성되었는데, join 진행시 한번 더 호출되었다.

SchoolDAO 생성자는 이미 @Component로 객체를 생성했기 때문에 한번 더 생성되지않는게 정상이다.

그러나 본인은 아래 사진과 같이 new SchoolDAO()로 한번 더 객체를 생성했다.

그럼 SchoolDAO 객체는 총 몇개가 생성되었을까?

해당 객체는 총2개가 생성되었다.

우선 첫번째 객체는 applicationContext.xml에서 한번 객체가 생성되었고(객체1이라고 부르겠다)

그리고 두번째는 위의 new SchoolDAO()에서 생성되었다.(객체2라고 부르겠다)

자 그럼 list method는 null 오류가 발생하여 list 출력이 안된 것을 확인하였다.

그럼 insert는 정상적으로 되었는지 확인해보도록하자

아래 사진을 보면 insert는 정상적으로 실행된 것을 확인할 수 있다.

그럼 왜 insert는 되었고 list는 안되었을까

insert는 @Autiwired로 schoolDAO를 사용하였고(객체1), list는 new SchoolDAO()를 사용했다(객체2)

같은 객체인데 왜 다른 결과가 나온걸까?

이유는 scan이다 객체1은 component-scan으로 인해 SchoolDAO에 있는 JdbcTemplate에 @Autowired로 인해 jdbcTemplate에 객체 주입이 되었다.

그러나 객체2는 new로 인해 jdbcTemplate에 객체 주입이 되지않았다.

new SchoolDAO(객체2)는 xml로 scan한게 아닌 새로 생성된 DAO 객체이며, 해당 객체에는 당연히 jdbcTemplate 객체 주입이 안되었던 것이다.

 

그러므로 Controller에서 insert 진행시 정상 실행이 되고(객체1),

list 메소드 호출시 위와 같이 Null 오류가 발생했던 것이다(객체2)

 

출처 : namubada.net/98?category=777141