개발 공부/트러블슈팅

H2 datasource 정보 입력이후, NullPointerException이 발생하는 원인과 해결방법

빵다희 2024. 9. 14. 23:23

👾 문제식별

요즘 김영한 선생님의 JPA 강의를 듣고 있다.

강의를 보면서 환경설정부터 따라하고 있는데, h2 db접속 정보를 application 파일에 입력한 후, 어플리케이션을 실행시켰다.

아래와 같은 에러가 발생하면서 로컬 서버가 켜지지 않는다.

 


🔍 원인분석

* application.yaml 

 

에러문구 중 몇 개를 살펴봤다.

 

1. NullPointerException
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null

 

=> Hibernate에서 SQL 예외를 처리하는 동안 발생한 에러,

구체적으로, org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert 메서드를 호출하려고 했지만, sqlExceptionHelper()의 반환 값이 null이어서 발생한 오류.

 

2. BeanCreationException org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [Unsupported connection setting "MVCC" [90113-224]] [n/a]

 

=>Spring Boot 애플리케이션에서 entityManagerFactory를 생성하는 과정에서 발생한 에러,

Hibernate가 JDBC 연결을 열 수 없다..!

 

 


🤔 해결방법시도

  1. MVCC=TRUE 삭제 , MVCC=TRUE 옵션은 여러 커넥션이 한번에 db에 접근 했을때 좀 더 빨리 처리할 수 있게 하는 옵션이라고 핬는데 빼도 무방하다고 하셔서 삭제 : 

콘솔 에러로그에 계속 나오던 MVCC에 관련된 내용은 이제 없어졌지만 여전히 서버 켜지지 않음.

오히려 이전에 못본 에러로그가 나왔다.

Connection is broken: "java.net.ConnectException: Connection refused: localhost"

확실하게 내 로컬에 설치된 h2 db에 접근이 안되는 걸 알았다.

 

2. db 주소 확인

 

application.yaml파일에 적힌 url로 h2 콘솔 로그인화면에 입력하면, 접속을 성공한다. url을 잘못 작성하지는 않은것같다.

 


✅ 최종해결방법

갑작스러운 해결...


💡 해결 방법 설명

해결 방법은.. 그저 db 서버를 실행시켰을 뿐이다. 

db 서버를 실행시키지 않고, 나의 application에서 입력된 주소의 db서버와 접속 시도를 하였기 때문에 계속 오류가 발생했었다.

url을 확인하려 h2.sh파일을 실행시키고, 콘솔 로그인을 한 이후로 application실행이 아주 잘 되었다...


 

📝 재발 방지 대책

h2 db가 어떤 db인지 깊게 생각하지 않고 사용한게 삽질을 하게된 이유라고 생각한다.

사용하고 있는 환경에 대해서 어떻게 동작하는지, 어떤 특징이 있는지 알아야 할 것 같다...

그래서 h2에 대해서 간략히 알아보자.

 

H2 데이터베이스는 Java 기반의 경량 데이터베이스 관리 시스템(DBMS)이다.

주로 개발 및 테스트 환경에서 사용되며, 다음과 같은 특징이 있다.

주요 특징

  1. 인메모리 데이터베이스:
    • H2는 인메모리 데이터베이스로 사용할 수 있어, 성능이 매우 빠르다. 데이터가 메모리에 저장되므로 디스크 I/O가 필요 없어 빠른 응답 속도를 제공한다. 
    • 어플이 실행 되면서 db object들이 생성되고 종료되면 모두 삭제된다.
  2. 경량:
    • H2 데이터베이스는 설치가 간단하고 경량화되어 있어, Java 애플리케이션에 쉽게 포함시킬 수 있다. JAR 파일 하나로 배포가 가능하여, 추가적인 설치 과정이 필요 없다.
  3. SQL 표준 준수:
    • H2는 SQL 표준을 지원하며, MySQL, PostgreSQL, Oracle 등의 다른 데이터베이스와 유사한 SQL 문법을 사용한다. 이는 다른 DBMS에서 H2로의 전환을 용이하게 한다.
  4. 웹 기반 콘솔:
    • H2는 웹 기반의 관리 콘솔을 제공하여, 데이터베이스를 쉽게 관리하고 쿼리를 실행할 수 있다. 기본적으로 http://localhost:8082에서 접근할 수 있다.
  5. 다양한 모드 지원:
  6. JDBC 지원:
    • H2는 JDBC 드라이버를 제공하여 Java 애플리케이션에서 쉽게 연결할 수 있다. Spring과 같은 프레임워크와도 잘 통합된다.
728x90
반응형