[오류해결] java.lang.NullPointerException - 스프링 & 하이버네이트

2022. 1. 31. 13:40·Spring/Hibernate

 

 

처음 봤을 땐 뭐가 잘못된 건지 감도 오지 않았던 오류이다.

오류의 내용부터 살펴보자

근본 원인 (root cause)

java.lang.NullPointerException
com.bigbell.noticeboard.dao.BoardDAOImpl.getBoards(BoardDAOImpl.java:23)
com.bigbell.noticeboard.service.BoardServiceImpl.getBoards(BoardServiceImpl.java:22)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
com.sun.proxy.$Proxy19.getBoards(Unknown Source)
com.bigbell.noticeboard.controller.NoticeBoardController.listBoard(NoticeBoardController.java:24)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

 

java.lang.NullPointerException 이게 주요 원인이다

웹개발이 아닌 그냥 자바에서는 문제해결이 단순하다.

위 오류의 원인은 객체를 정의한 뒤, 생성자를 통해 인스턴스를 생성하지 않고 객체를 사용하려고 했기 때문에 생기는 에러이다.

 

스프링과 하이버네이트를 사용하다가 이런 오류가 발생하면

인스턴스를 생성하지 않고 메소드를 사용한 적도 없는데 왜 이런 오류가 발생할까?라는 생각도 들 것이다.

 

문제는 의존성 주입과정에서 생긴다.

web.xml이나 servlet.xml 또는 클래스를 통해 인터페이스와의 의존관계를 사용해놓고

실제로 주입하지 않으면(어노테이션을 사용하지 않으면) 위와 같은 오류가 발생한다.

결국 따지고 보면 객체만 정의해놓고 인스턴스를 생성하지 않아 발생하는 문제가 맞다는 것이다.

사례를 통해 살펴보자.

 

 

- servlet.xml 파일 중 일부내용

...

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
		<property name="packagesToScan" value="com.bigbell.springdemo.entity" />
		<property name="hibernateProperties">
		   <props>
		      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
		      <prop key="hibernate.show_sql">true</prop>
		   </props>
		</property>
</bean>	  
   
...
  • sessionFactory를 재사용하기 위해 servlet.xml에 sessionFactory를 따로 생성해놓은 상태이다.

 

 

- BoardDAOImpl 클래스 (오류발생)

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	// inject the sessionFactory
	// Autowired나 Modifier를 적지 않은 경우
	private SessionFactory sessionFactory;

	@Override
	public List<Board> getBoards() {
    	// 오류 발생
    	Session currentSession = sessionFactory.getCurrentSession();
    ...
    }
    ...
}
  • @Autowired 또는 @Modifier를 통해 인스턴스를 생성해야하지만 하지 않은 상태
  • SessionFactory의 객체만 정의된 상태에서 사용하려고 했기때문에 NullPointerException 발생

 

 

문제 해결

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	// inject the sessionFactory
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public List<Board> getBoards() {
    	// 오류 발생
    	Session currentSession = sessionFactory.getCurrentSession();
    ...
    }
    ...
}

sessionFactory 위에 @Autowired만 적어주면 된다.

 

****

sessionFactory 말고도 다른 사례들도 마찬가지이다.

의존성 관계를 만들기 위해 클래스를 다 구성해놓고 어노테이션을 사용하지 않으면 오류가 발생한다.

java.lang.NullPointerException 오류가 발생한다면 의존관계를 확인해보자.

'Spring/Hibernate' 카테고리의 다른 글
  • 실무에서 @Transactional을 제거했더니 성능이 2배 향상된 이유
  • [오류해결] org.hibernate.hql.internal.ast.QuerySyntaxException
  • [Spring] 하이버네이트(Hibernate) 사용하는법
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (203) N
      • Spring (23) N
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4) N
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (1)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    jsp
    파이썬
    스프링
    부스트캠프 7기
    os
    부스트캠프
    오류해결
    java
    GitHub
    알고리즘
    부스트캠프 멤버십
    Python
    자바스크립트
    MySQL
    웹개발
    스프링부트
    운영체제
    Spring
    자바
    Git
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[오류해결] java.lang.NullPointerException - 스프링 & 하이버네이트
상단으로

티스토리툴바