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

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

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

 

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

spring web.xml에 param과 listner를 주석처리한 후 index.jsp를 실행하면 아래와 같이 정상 실행이 된다. 그러나 web.xml에서 주석처리했던 param과 listner를 주석해제하면 아래와 같이 404 오류가 발생한다..

namubada.net

☞[Spring 오류] jdbcTemplate (NullPointerException 오류)(1)

 

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

회원가입 정보를 입력하여 db에 회원정보를 저장하려고한다. 저장시 join.jsp를 실행한다. 여기서 회원 가입을 진행하면 우선 web.xml이 작동된다. web.xml에서 *.do는 모두 presentation-layer.xml에서 실행하..

namubada.net

 

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

아래 회원가입 폼은 회원가입을 진행하면 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)

spring web.xml에 param과 listner를 주석처리한 후

index.jsp를 실행하면

아래와 같이 정상 실행이 된다.

그러나 web.xml에서 주석처리했던 param과 listner를 주석해제하면

아래와 같이 404 오류가 발생한다.

그래서 오류를 조금 더 추적해보니 web.xml에서 listner를 주석처리하니 정상 실행이 되었다.

다시 문제의 원일 찾기 위해 주석을 해제하고 console을 확인했다.

확인시 schoolController > schoolDAO > jdbc에 문제가 있었다는 오류를 확인했다.

해당 404 오류는 applicationCotext.xml의 문제이다.

 

코드를 찬찬히 보면서 순서도를 보도록하자

1. 처음 톰캣 서버를 구동하면 web.xml 파일을 로딩하여 서블릿 컨테이너가 구동된다.

2. web.xml은 파일에 등록된 ContextLoaderListner 객체를 생성한다.

3. 그리고 이때 src/main/resource 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동한다.

4. 그리고 이때 DAO 객체들이 메모리에 생성된다.

5. 그리고 사용자가 페이지 이동 버튼 등을 클릭하여 .do 요청을 서버에 전달하면 서블릿 컨테이너는 DispatcherServlet 객체를 생성하고 

6. DispatcerServlet 객체는 /WEB-INF/config 폴더에 있는 presentation-layer.xml 파일을 로딩하여 두번째 스프링 컨테이너를 구동한다.

7. 이 두번째 스프링 컨테이너가 Controller 객체를 메모리에 생성한다.

 

그럼 위에 순서도를 참고해서 실제 프로젝트에서 어떻게 작동되는지 확인해보도록하자.

 

1. index.jsp를 실행하면 톰캣 서버가 구동이 된다.

2. 처음 톰캣 서버를 구동하면 web.xml 파일을 로딩하여 서블릿 컨테이너가 구동된다.

3. web.xml은 파일에 등록된 ContextLoaderListner 객체를 생성한다.

(Root 컨테이너)

4. 그리고 이때 src/main/resource 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동한다.

5. 그리고 이때 DAO 객체들이 메모리에 생성된다.

6. 그리고 사용자가 페이지 이동 버튼 등을 클릭하여 .do 요청을 서버에 전달하면 서블릿 컨테이너는 DispatcherServlet 객체를 생성하고 

6. DispatcerServlet 객체는 /WEB-INF/config 폴더에 있는 presentation-layer.xml 파일을 로딩하여 두번째 스프링 컨테이너를 구동한다.

(두번째 스프링 컨테이너)

※컨테이너들의 부모 자식관계

 

그럼 다시 원점으로 돌아가서 

왜? applicationContext.xml에서 jdbcTemplate bean 부분을 주석처리하면

아래와 같이 404 오류가 발생하는 것일까?

이 문제는 파일의 경로나 이러한 문제가 아니고

오류가 발생하는 원인은 src/main/resource 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동할 때 DAO 객체들이 메모리에 생성되는데, 이때 DAO에서 jdbcTemplate를 생성하지 못해서 발생하는 문제인 것이다.

 

왜냐하면 아래 applicationContext.xml 아래 코드에서 jdbc 부분을 주석 처리했기 때문에 

SchoolDAO에서는 jdbcTemplate 객체를 생성하지 못하였고 이로인해 404 오류가 발생하게 된 것이다.

그러므로 Console 창에 있는 내용을 끝에까지 보면서 오류 발생 지점이 어디인지 파악을 한후 수정을 하는것이 중요하다고 생각된다.

인텔시J로 톰캣 실행시 아래와 같이 1099 오류가 발생했다.

오류의 문제는 이미 1099 포트가 사용되고 있다는 것인데, 아마 백그라운드에서 작동되고 있어서 그런 것이 아닌가 하는 생각이 든다.

이클립스에서는 서버단에서 종료가 가능했는데, 인텔리J에서는 그게 불가능한 것으로 보인다(구글링 해봄) 그러므로 번거롭게도 cmd에서 PID 검색 후 종료 후에 다시 실행을 해야 한다.

cmd 실행 후 netstat ano|find "1099"로 현재 1099 포트를 사용하는 PID를 검색한다.

검색 후 아래와 같이 확인이 가능핟.

작업 관리자를 실행한 후 세부 정보로 이동한다 이동 후 해당 15416 PID를 종료한다.

종료 후 다시 실행시 정상 실행되는 것을 확인할 수 있다.

 

 

인텔리J에서 JSP 프로젝트를 만들어보자

상단의 File > Project를 실행한다.

그 다음 Java > SDK 설정 > Web Application 쳌 > WebServices 쳌 > 하단의 Generate sample server code 쳌 > Apache Axis 선택 > Next

web > index.jsp의 텍스트를 Hello world로 입력해준다. > 그리고 우측 상단의 Add Configurations를 클릭한다.

우측 상단의 + 모양을 클릭한다

하단의 31 more items를 클릭한다.

Tomcat Server > Local을 클릭한다

Configure를 클릭한다

 

Machintosh HD를 선택한다

검색칸에 tomcat이라고 검색한다.

경로를 찾아서 usr/local/Cellar/tomcat@8/8.5.49/libexec로 경로 설정을 해준다.

오케이 클릭

그다음 Deloyment를 클릭한다

fix 버튼을 클릭한다

하단의 Application context에서 /를 제외한 나머지를 삭제한다

오케이 버튼으로 저장

그리고 오른 쪽위의 실행 버튼이나 comman+r을 입력하면 실행이 된다.

추가로 코드를 수정 후 바로 확인을 원한다면 좌측 하단에 해당 아이콘을 클릭한 후 브라우저를 새로고침하면

별도의 코드 저장없이 바로 수정된 페이지 확인이 가능하다.

brew를 통해서 tomcat을 설치하고자 한다.

터미널 실행 > brew search tomcat

검색을 하면 tomcat@8을 확인할 수 있다.

우선 현재 검색된 버전에서 최신 버전인 tomcat@8을 설치하자

brew install tomcat@8을 한다.

설치가 완료되면 ls로 목록을 검색해서 tomcat8.5.49의 bin 폴더로 이동한다

이동 후 ./catalina start로 톰캣 서버를 실행한다.

실행 후 아래와 같이 톰캣 서버가 실행된 것을 확인할 수 있다.

톰캣 서버 중지는 ./catalina stop으로 중지할 수 있다.

+ Recent posts